From ba1788cbc5b20ab20c1971b6e603779489e60627 Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Thu, 14 Mar 2019 01:48:10 +0200 Subject: [PATCH 1/2] Change default ClusterIP to point to primary - ensures that the routing works without a service mesh --- artifacts/workloads/canary-deployment.yaml | 8 +------- artifacts/workloads/canary-service.yaml | 4 +--- artifacts/workloads/primary-deployment.yaml | 2 +- artifacts/workloads/service.yaml | 14 ++++++++++++++ pkg/router/kubernetes.go | 4 ++-- 5 files changed, 19 insertions(+), 13 deletions(-) create mode 100644 artifacts/workloads/service.yaml diff --git a/artifacts/workloads/canary-deployment.yaml b/artifacts/workloads/canary-deployment.yaml index 75ee7cbc..814dd9c2 100644 --- a/artifacts/workloads/canary-deployment.yaml +++ b/artifacts/workloads/canary-deployment.yaml @@ -23,7 +23,7 @@ spec: spec: containers: - name: podinfod - image: quay.io/stefanprodan/podinfo:1.2.0 + image: quay.io/stefanprodan/podinfo:1.4.0 imagePullPolicy: IfNotPresent ports: - containerPort: 9898 @@ -67,9 +67,3 @@ spec: requests: cpu: 100m memory: 16Mi - volumeMounts: - - mountPath: /data - name: data - volumes: - - emptyDir: {} - name: data diff --git a/artifacts/workloads/canary-service.yaml b/artifacts/workloads/canary-service.yaml index e858e3a5..7a09e206 100644 --- a/artifacts/workloads/canary-service.yaml +++ b/artifacts/workloads/canary-service.yaml @@ -1,10 +1,8 @@ apiVersion: v1 kind: Service metadata: - name: podinfo + name: podinfo-canary namespace: test - labels: - app: podinfo spec: type: ClusterIP selector: diff --git a/artifacts/workloads/primary-deployment.yaml b/artifacts/workloads/primary-deployment.yaml index f27fa9b7..cc17b82f 100644 --- a/artifacts/workloads/primary-deployment.yaml +++ b/artifacts/workloads/primary-deployment.yaml @@ -23,7 +23,7 @@ spec: spec: containers: - name: podinfod - image: quay.io/stefanprodan/podinfo:1.1.1 + image: quay.io/stefanprodan/podinfo:1.4.1 imagePullPolicy: IfNotPresent ports: - containerPort: 9898 diff --git a/artifacts/workloads/service.yaml b/artifacts/workloads/service.yaml new file mode 100644 index 00000000..3e98f1e0 --- /dev/null +++ b/artifacts/workloads/service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: podinfo + namespace: test +spec: + type: ClusterIP + selector: + app: podinfo-primary + ports: + - name: http + port: 9898 + protocol: TCP + targetPort: http diff --git a/pkg/router/kubernetes.go b/pkg/router/kubernetes.go index 5e86e20f..05681458 100644 --- a/pkg/router/kubernetes.go +++ b/pkg/router/kubernetes.go @@ -20,7 +20,7 @@ type KubernetesRouter struct { logger *zap.SugaredLogger } -// Sync creates to updates the primary and canary services +// Sync creates or updates the primary and canary services func (c *KubernetesRouter) Sync(cd *flaggerv1.Canary) error { targetName := cd.Spec.TargetRef.Name primaryName := fmt.Sprintf("%s-primary", targetName) @@ -40,7 +40,7 @@ func (c *KubernetesRouter) Sync(cd *flaggerv1.Canary) error { }, Spec: corev1.ServiceSpec{ Type: corev1.ServiceTypeClusterIP, - Selector: map[string]string{"app": targetName}, + Selector: map[string]string{"app": primaryName}, Ports: []corev1.ServicePort{ { Name: "http", From 437b1d30c0829b88167566c265c0588ad795fe9d Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Thu, 14 Mar 2019 01:49:07 +0200 Subject: [PATCH 2/2] Copy labels from canary to primary --- pkg/controller/deployer.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pkg/controller/deployer.go b/pkg/controller/deployer.go index 6b7555b0..80b211bb 100644 --- a/pkg/controller/deployer.go +++ b/pkg/controller/deployer.go @@ -77,6 +77,8 @@ func (c *CanaryDeployer) Promote(cd *flaggerv1.Canary) error { } primaryCopy.Spec.Template.Annotations = annotations + primaryCopy.Spec.Template.Labels = makePrimaryLabels(canary.Spec.Template.Labels, primaryName) + _, err = c.kubeClient.AppsV1().Deployments(cd.Namespace).Update(primaryCopy) if err != nil { return fmt.Errorf("updating deployment %s.%s template spec failed: %v", @@ -403,7 +405,7 @@ func (c *CanaryDeployer) createPrimaryDeployment(cd *flaggerv1.Canary) error { }, Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{"app": primaryName}, + Labels: makePrimaryLabels(canaryDep.Spec.Template.Labels, primaryName), Annotations: annotations, }, // update spec with the primary secrets and config maps @@ -544,3 +546,16 @@ func (c *CanaryDeployer) makeAnnotations(annotations map[string]string) (map[str return res, nil } + +func makePrimaryLabels(labels map[string]string, primaryName string) map[string]string { + idKey := "app" + res := make(map[string]string) + for k, v := range labels { + if k != idKey { + res[k] = v + } + } + res[idKey] = primaryName + + return res +}