From e56ba480c7de0cb680c299d097be664c2c6da50c Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Tue, 30 Jul 2019 11:40:17 +0300 Subject: [PATCH 1/4] Add Blue/Green e2e tests --- .circleci/config.yml | 15 +++++- test/e2e-kubernetes-tests.sh | 98 ++++++++++++++++++++++++++++++++++++ test/e2e-kubernetes.sh | 17 +++++++ 3 files changed, 128 insertions(+), 2 deletions(-) create mode 100755 test/e2e-kubernetes-tests.sh create mode 100755 test/e2e-kubernetes.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 7e19e332..a55ac557 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -78,6 +78,17 @@ jobs: - run: test/e2e-istio.sh - run: test/e2e-tests.sh + e2e-kubernetes-testing: + machine: true + steps: + - checkout + - attach_workspace: + at: /tmp/bin + - run: test/container-build.sh + - run: test/e2e-kind.sh + - run: test/e2e-kubernetes.sh + - run: test/e2e-kubernetes-tests.sh + e2e-smi-istio-testing: machine: true steps: @@ -145,7 +156,7 @@ workflows: - e2e-istio-testing: requires: - build-binary - - e2e-smi-istio-testing: + - e2e-kubernetes-testing: requires: - build-binary # - e2e-supergloo-testing: @@ -164,7 +175,7 @@ workflows: requires: - build-binary - e2e-istio-testing - - e2e-smi-istio-testing + - e2e-kubernetes-testing #- e2e-supergloo-testing - e2e-gloo-testing - e2e-nginx-testing diff --git a/test/e2e-kubernetes-tests.sh b/test/e2e-kubernetes-tests.sh new file mode 100755 index 00000000..d8669f5c --- /dev/null +++ b/test/e2e-kubernetes-tests.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash + +# This script runs e2e tests for Blue/Green initialization, analysis and promotion +# Prerequisites: Kubernetes Kind, Kustomize + +set -o errexit + +REPO_ROOT=$(git rev-parse --show-toplevel) +export KUBECONFIG="$(kind get kubeconfig-path --name="kind")" + +echo '>>> Creating test namespace' +kubectl create namespace test + +echo '>>> Installing the load tester' +kubectl apply -k ${REPO_ROOT}/kustomize/tester +kubectl -n test rollout status deployment/flagger-loadtester + +echo '>>> Initialising canary' +kubectl apply -f ${REPO_ROOT}/test/e2e-workload.yaml + +cat <>> Waiting for primary to be ready' +retries=50 +count=0 +ok=false +until ${ok}; do + kubectl -n test get canary/podinfo | grep 'Initialized' && ok=true || ok=false + sleep 5 + count=$(($count + 1)) + if [[ ${count} -eq ${retries} ]]; then + kubectl -n flagger-system logs deployment/flagger + echo "No more retries left" + exit 1 + fi +done + +echo '✔ Canary initialization test passed' + +echo '>>> Triggering canary deployment' +kubectl -n test set image deployment/podinfo podinfod=quay.io/stefanprodan/podinfo:1.7.0 + +echo '>>> Waiting for canary promotion' +retries=50 +count=0 +ok=false +until ${ok}; do + kubectl -n test describe deployment/podinfo-primary | grep '1.7.0' && ok=true || ok=false + sleep 10 + kubectl -n flagger-system logs deployment/flagger --tail 1 + count=$(($count + 1)) + if [[ ${count} -eq ${retries} ]]; then + kubectl -n test describe deployment/podinfo + kubectl -n test describe deployment/podinfo-primary + kubectl -n flagger-system logs deployment/flagger + echo "No more retries left" + exit 1 + fi +done + +echo '✔ Canary promotion test passed' + +kubectl -n flagger-system logs deployment/flagger diff --git a/test/e2e-kubernetes.sh b/test/e2e-kubernetes.sh new file mode 100755 index 00000000..c85ea1ee --- /dev/null +++ b/test/e2e-kubernetes.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +set -o errexit + +REPO_ROOT=$(git rev-parse --show-toplevel) +export KUBECONFIG="$(kind get kubeconfig-path --name="kind")" + +echo '>>> Loading Flagger image' +kind load docker-image test/flagger:latest + +echo '>>> Installing Flagger' +kubectl apply -k ${REPO_ROOT}/kustomize/kubernetes + +kubectl -n flagger-system set image deployment/flagger flagger=test/flagger:latest + +kubectl -n flagger-system rollout status deployment/flagger +kubectl -n flagger-system rollout status deployment/flagger-prometheus \ No newline at end of file From 11d84bf35d421c75e0482255786866106757e879 Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Tue, 30 Jul 2019 12:27:53 +0300 Subject: [PATCH 2/4] Enable kubernetes metric provider --- pkg/metrics/factory.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/metrics/factory.go b/pkg/metrics/factory.go index 8e77f2df..e2b69b8d 100644 --- a/pkg/metrics/factory.go +++ b/pkg/metrics/factory.go @@ -28,6 +28,10 @@ func (factory Factory) Observer(provider string) Interface { return &HttpObserver{ client: factory.Client, } + case provider == "kubernetes": + return &HttpObserver{ + client: factory.Client, + } case provider == "appmesh": return &EnvoyObserver{ client: factory.Client, From 99fff9827402177a85ef8f6803af180774db944f Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Tue, 30 Jul 2019 12:43:02 +0300 Subject: [PATCH 3/4] Kustomize: set Flagger log level to info --- kustomize/istio/patch.yaml | 1 + kustomize/kubernetes/patch.yaml | 1 + kustomize/linkerd/patch.yaml | 1 + 3 files changed, 3 insertions(+) diff --git a/kustomize/istio/patch.yaml b/kustomize/istio/patch.yaml index b78e3514..f9b69b6c 100644 --- a/kustomize/istio/patch.yaml +++ b/kustomize/istio/patch.yaml @@ -8,6 +8,7 @@ spec: containers: - name: flagger args: + - -log-level=info - -mesh-provider=istio - -metrics-server=http://prometheus:9090 - -slack-user=flagger diff --git a/kustomize/kubernetes/patch.yaml b/kustomize/kubernetes/patch.yaml index 466ce184..3bec1e64 100644 --- a/kustomize/kubernetes/patch.yaml +++ b/kustomize/kubernetes/patch.yaml @@ -8,6 +8,7 @@ spec: containers: - name: flagger args: + - -log-level=info - -mesh-provider=kubernetes - -metrics-server=http://flagger-prometheus:9090 - -slack-user=flagger diff --git a/kustomize/linkerd/patch.yaml b/kustomize/linkerd/patch.yaml index def51ccf..04772b41 100644 --- a/kustomize/linkerd/patch.yaml +++ b/kustomize/linkerd/patch.yaml @@ -8,6 +8,7 @@ spec: containers: - name: flagger args: + - -log-level=info - -mesh-provider=linkerd - -metrics-server=http://linkerd-prometheus:9090 - -slack-user=flagger From c31e9e5a96ea84dfa31c54ebf7350ff91df64477 Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Tue, 30 Jul 2019 13:00:28 +0300 Subject: [PATCH 4/4] Use Linkerd metrics for ingress and kubernetes routers --- pkg/controller/scheduler.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/controller/scheduler.go b/pkg/controller/scheduler.go index 9454524f..6d7a35c7 100644 --- a/pkg/controller/scheduler.go +++ b/pkg/controller/scheduler.go @@ -614,8 +614,8 @@ func (c *Controller) analyseCanary(r *flaggerv1.Canary) bool { if r.Spec.Provider != "" { metricsProvider = r.Spec.Provider - // set the metrics provider to Linkerd Prometheus when using NGINX as Linkerd Ingress - if r.Spec.Provider == "nginx" && strings.Contains(c.meshProvider, "linkerd") { + // set the metrics server to Linkerd Prometheus when Linkerd is the default mesh provider + if strings.Contains(c.meshProvider, "linkerd") { metricsProvider = "linkerd" } }