From da7015397ca30f72ee5cfc7b807161dc29b73fdc Mon Sep 17 00:00:00 2001 From: Alex Leong Date: Fri, 15 Sep 2023 12:08:23 -0700 Subject: [PATCH 1/5] Update Linkerd tutorial Signed-off-by: Alex Leong --- docs/diagrams/flagger-linkerd-traffic-split.png | Bin 41592 -> 0 bytes .../tutorials/linkerd-progressive-delivery.md | 13 +++---------- kustomize/linkerd/patch.yaml | 2 +- 3 files changed, 4 insertions(+), 11 deletions(-) delete mode 100644 docs/diagrams/flagger-linkerd-traffic-split.png diff --git a/docs/diagrams/flagger-linkerd-traffic-split.png b/docs/diagrams/flagger-linkerd-traffic-split.png deleted file mode 100644 index b0006d226a70da333e0a3232a8914591910b7579..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41592 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 z 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 diff --git a/docs/gitbook/tutorials/linkerd-progressive-delivery.md b/docs/gitbook/tutorials/linkerd-progressive-delivery.md index a3b11748..6032dacc 100644 --- a/docs/gitbook/tutorials/linkerd-progressive-delivery.md +++ b/docs/gitbook/tutorials/linkerd-progressive-delivery.md @@ -2,16 +2,14 @@ This guide shows you how to use Linkerd and Flagger to automate canary deployments. -![Flagger Linkerd Traffic Split](https://raw.githubusercontent.com/fluxcd/flagger/main/docs/diagrams/flagger-linkerd-traffic-split.png) - ## Prerequisites -Flagger requires a Kubernetes cluster **v1.16** or newer and Linkerd **2.10** or newer. +Flagger requires a Kubernetes cluster **v1.21** or newer and Linkerd **2.14** or newer. Install Linkerd and Prometheus (part of Linkerd Viz): ```bash -# For linkerd versions 2.12 and later, the CRDs need to be installed beforehand +# The CRDs need to be installed beforehand linkerd install --crds | kubectl apply -f - linkerd install | kubectl apply -f - @@ -45,14 +43,9 @@ helm install linkerd-control-plane linkerd/linkerd-control-plane \ helm install linkerd-viz linkerd/linkerd-viz -n linkerd-viz --create-namespace -helm repo add l5d-smi https://linkerd.github.io/linkerd-smi -helm install linkerd-smi l5d-smi/linkerd-smi -n linkerd-smi --create-namespace - -# Note that linkerdAuthPolicy.create=true is only required for Linkerd 2.12 and -# later helm install flagger flagger/flagger \ --n flagger-system \ - --set meshProvider=linkerd \ + --set meshProvider=gatewayapi:v1beta1 \ --set metricsServer=http://prometheus.linkerd-viz:9090 \ --set linkerdAuthPolicy.create=true ``` diff --git a/kustomize/linkerd/patch.yaml b/kustomize/linkerd/patch.yaml index c55352ff..ae1a051d 100644 --- a/kustomize/linkerd/patch.yaml +++ b/kustomize/linkerd/patch.yaml @@ -10,7 +10,7 @@ spec: args: - -log-level=info - -include-label-prefix=app.kubernetes.io - - -mesh-provider=linkerd + - -mesh-provider=gatewayapi:v1beta1 - -metrics-server=http://prometheus.linkerd-viz:9090 --- apiVersion: rbac.authorization.k8s.io/v1 From d543c8ef954848dbaa914bc6ea5cf564e8ee6e12 Mon Sep 17 00:00:00 2001 From: Alex Leong Date: Fri, 15 Sep 2023 12:21:46 -0700 Subject: [PATCH 2/5] Update test Signed-off-by: Alex Leong --- test/linkerd/install.sh | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/test/linkerd/install.sh b/test/linkerd/install.sh index b7b101e1..7a3991a7 100755 --- a/test/linkerd/install.sh +++ b/test/linkerd/install.sh @@ -2,8 +2,7 @@ set -o errexit -LINKERD_VER="stable-2.13.2" -LINKERD_SMI_VER="0.2.0" +LINKERD_VER="stable-2.14.0" REPO_ROOT=$(git rev-parse --show-toplevel) mkdir -p ${REPO_ROOT}/bin @@ -18,10 +17,6 @@ ${REPO_ROOT}/bin/linkerd install --crds | kubectl apply -f - ${REPO_ROOT}/bin/linkerd install | kubectl apply -f - ${REPO_ROOT}/bin/linkerd check -echo ">>> Installing Linkerd SMI" -${REPO_ROOT}/bin/linkerd-smi install | kubectl apply -f - -${REPO_ROOT}/bin/linkerd-smi check - echo ">>> Installing Linkerd Viz" ${REPO_ROOT}/bin/linkerd viz install | kubectl apply -f - kubectl -n linkerd-viz rollout status deploy/prometheus From efc588001fcc93aa30d370fa0bc5718259195fd7 Mon Sep 17 00:00:00 2001 From: Alex Leong Date: Fri, 15 Sep 2023 14:05:14 -0700 Subject: [PATCH 3/5] Include gatewayRefs in Linkerd Canary resources Signed-off-by: Alex Leong --- .../tutorials/linkerd-progressive-delivery.md | 7 +++++++ test/linkerd/test-canary.sh | 18 ++++++++++++++++++ test/linkerd/test-steps.sh | 6 ++++++ 3 files changed, 31 insertions(+) diff --git a/docs/gitbook/tutorials/linkerd-progressive-delivery.md b/docs/gitbook/tutorials/linkerd-progressive-delivery.md index 6032dacc..63a31953 100644 --- a/docs/gitbook/tutorials/linkerd-progressive-delivery.md +++ b/docs/gitbook/tutorials/linkerd-progressive-delivery.md @@ -102,6 +102,13 @@ spec: port: 9898 # container port number or name (optional) targetPort: 9898 + # Reference to the Service that the generated HTTPRoute would attach to. + gatewayRefs: + - name: podinfo + namespace: test + group: core + kind: Service + port: 9898 analysis: # schedule interval (default 60s) interval: 30s diff --git a/test/linkerd/test-canary.sh b/test/linkerd/test-canary.sh index 694635f8..69b3a032 100755 --- a/test/linkerd/test-canary.sh +++ b/test/linkerd/test-canary.sh @@ -47,6 +47,12 @@ spec: port: 80 targetPort: http portDiscovery: true + gatewayRefs: + - name: podinfo + namespace: test + group: core + kind: Service + port: 80 analysis: interval: 15s threshold: 15 @@ -106,6 +112,12 @@ spec: service: port: 9898 portDiscovery: true + gatewayRefs: + - name: podinfo + namespace: test + group: core + kind: Service + port: 9898 analysis: interval: 15s threshold: 15 @@ -194,6 +206,12 @@ spec: service: port: 80 targetPort: 9898 + gatewayRefs: + - name: podinfo + namespace: test + group: core + kind: Service + port: 80 analysis: interval: 15s threshold: 3 diff --git a/test/linkerd/test-steps.sh b/test/linkerd/test-steps.sh index 7c1db33d..7ad41969 100755 --- a/test/linkerd/test-steps.sh +++ b/test/linkerd/test-steps.sh @@ -20,6 +20,12 @@ spec: port: 80 targetPort: http portDiscovery: true + gatewayRefs: + - name: podinfo + namespace: test + group: core + kind: Service + port: 80 analysis: interval: 15s threshold: 15 From 04a1f2fa68f1124eaa8d1f1bab96b61a30782d7d Mon Sep 17 00:00:00 2001 From: Alex Leong Date: Fri, 15 Sep 2023 15:08:32 -0700 Subject: [PATCH 4/5] Add metrics templates Signed-off-by: Alex Leong --- .../tutorials/linkerd-progressive-delivery.md | 72 +++++++++++++++++- test/linkerd/test-canary.sh | 58 +++++++++++++-- test/linkerd/test-steps.sh | 73 ++++++++++++++++++- 3 files changed, 192 insertions(+), 11 deletions(-) diff --git a/docs/gitbook/tutorials/linkerd-progressive-delivery.md b/docs/gitbook/tutorials/linkerd-progressive-delivery.md index 63a31953..afd26adc 100644 --- a/docs/gitbook/tutorials/linkerd-progressive-delivery.md +++ b/docs/gitbook/tutorials/linkerd-progressive-delivery.md @@ -75,9 +75,65 @@ Create a deployment and a horizontal pod autoscaler: kubectl apply -k https://github.com/fluxcd/flagger//kustomize/podinfo?ref=main ``` -Create a canary custom resource for the podinfo deployment: +Create a metrics template and canary custom resources for the podinfo deployment: ```yaml +--- +apiVersion: flagger.app/v1beta1 +kind: MetricTemplate +metadata: + name: success-rate + namespace: test +spec: + provider: + type: prometheus + address: http://prometheus.linkerd-viz:9090 + query: | + sum( + rate( + response_total{ + namespace="{{ namespace }}", + deployment=~"{{ target }}", + classification!="failure", + direction="{{ variables.direction }}" + }[{{ interval }}] + ) + ) + / + sum( + rate( + response_total{ + namespace="{{ namespace }}", + deployment=~"{{ target }}", + direction="{{ variables.direction }}" + }[{{ interval }}] + ) + ) + * 100 +--- +apiVersion: flagger.app/v1beta1 +kind: MetricTemplate +metadata: + name: latency + namespace: test +spec: + provider: + type: prometheus + address: http://prometheus.linkerd-viz:9090 + query: | + histogram_quantile( + 0.99, + sum( + rate( + response_latency_ms_bucket{ + namespace="{{ namespace }}", + deployment=~"{{ target }}", + direction="{{ variables.direction }}" + }[{{ interval }}] + ) + ) by (le) + ) +--- apiVersion: flagger.app/v1beta1 kind: Canary metadata: @@ -122,18 +178,28 @@ spec: stepWeight: 5 # Linkerd Prometheus checks metrics: - - name: request-success-rate + - name: success-rate + templateRef: + name: success-rate + namespace: test # minimum req success rate (non 5xx responses) # percentage (0-100) thresholdRange: min: 99 interval: 1m - - name: request-duration + templateVariables: + direction: inbound + - name: latency + templateRef: + name: latency + namespace: test # maximum req duration P99 # milliseconds thresholdRange: max: 500 interval: 30s + templateVariables: + direction: inbound # testing (optional) webhooks: - name: acceptance-test diff --git a/test/linkerd/test-canary.sh b/test/linkerd/test-canary.sh index 69b3a032..5abe335c 100755 --- a/test/linkerd/test-canary.sh +++ b/test/linkerd/test-canary.sh @@ -6,6 +6,40 @@ set -o errexit REPO_ROOT=$(git rev-parse --show-toplevel) +cat < Date: Fri, 15 Sep 2023 15:36:19 -0700 Subject: [PATCH 5/5] Fix threshold ranges Signed-off-by: Alex Leong --- test/linkerd/test-canary.sh | 6 ++++-- test/linkerd/test-steps.sh | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/test/linkerd/test-canary.sh b/test/linkerd/test-canary.sh index 5abe335c..2a80cc9b 100755 --- a/test/linkerd/test-canary.sh +++ b/test/linkerd/test-canary.sh @@ -97,7 +97,8 @@ spec: templateRef: name: success-rate namespace: linkerd - threshold: 99 + thresholdRange: + min: 99 interval: 1m templateVariables: direction: inbound @@ -258,7 +259,8 @@ spec: templateRef: name: success-rate namespace: linkerd - threshold: 99 + thresholdRange: + min: 99 interval: 1m templateVariables: direction: inbound diff --git a/test/linkerd/test-steps.sh b/test/linkerd/test-steps.sh index f9a61ebe..5fbb000a 100755 --- a/test/linkerd/test-steps.sh +++ b/test/linkerd/test-steps.sh @@ -95,7 +95,8 @@ spec: templateRef: name: success-rate namespace: linkerd - threshold: 99 + thresholdRange: + min: 99 interval: 1m templateVariables: direction: inbound