偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Linkerd 金絲雀部署與 A/B 測(cè)試

網(wǎng)絡(luò) 通信技術(shù)
本指南向您展示如何使用 Linkerd 和 Flagger 來(lái)自動(dòng)化金絲雀部署與 A/B 測(cè)試。希望能夠幫助到你!

[[413903]]

本指南向您展示如何使用 Linkerd 和 Flagger 來(lái)自動(dòng)化金絲雀部署與 A/B 測(cè)試。

Flagger Linkerd Traffic Split(流量拆分)

前提條件

Flagger 需要 Kubernetes 集群 v1.16 或更新版本和 Linkerd 2.10 或更新版本。

安裝 Linkerd the Prometheus(Linkerd Viz 的一部分):

  1. linkerd install | kubectl apply -f - 
  2. linkerd viz install | kubectl apply -f - 

在 linkerd 命名空間中安裝 Flagger:

  1. kubectl apply -k github.com/fluxcd/flagger//kustomize/linkerd 

引導(dǎo)程序

Flagger 采用 Kubernetes deployment 和可選的水平 Pod 自動(dòng)伸縮 (HPA),然后創(chuàng)建一系列對(duì)象(Kubernetes 部署、ClusterIP 服務(wù)和 SMI 流量拆分)。這些對(duì)象將應(yīng)用程序暴露在網(wǎng)格內(nèi)部并驅(qū)動(dòng) Canary 分析和推廣。

創(chuàng)建一個(gè) test 命名空間并啟用 Linkerd 代理注入:

  1. kubectl create ns test 
  2. kubectl annotate namespace test linkerd.io/inject=enabled 

安裝負(fù)載測(cè)試服務(wù)以在金絲雀分析期間生成流量:

  1. kubectl apply -k https://github.com/fluxcd/flagger//kustomize/tester?ref=main 

創(chuàng)建部署和水平 pod autoscaler:

  1. kubectl apply -k https://github.com/fluxcd/flagger//kustomize/podinfo?ref=main 

為 podinfo 部署創(chuàng)建一個(gè) Canary 自定義資源:

  1. apiVersion: flagger.app/v1beta1 
  2. kind: Canary 
  3. metadata: 
  4.   name: podinfo 
  5.   namespace: test 
  6. spec: 
  7.   # deployment reference 
  8.   targetRef: 
  9.     apiVersion: apps/v1 
  10.     kind: Deployment 
  11.     name: podinfo 
  12.   # HPA reference (optional) 
  13.   autoscalerRef: 
  14.     apiVersion: autoscaling/v2beta2 
  15.     kind: HorizontalPodAutoscaler 
  16.     name: podinfo 
  17.   # the maximum time in seconds for the canary deployment 
  18.   # to make progress before it is rollback (default 600s) 
  19.   progressDeadlineSeconds: 60 
  20.   service: 
  21.     # ClusterIP port number 
  22.     port: 9898 
  23.     # container port number or name (optional) 
  24.     targetPort: 9898 
  25.   analysis: 
  26.     # schedule interval (default 60s) 
  27.     interval: 30s 
  28.     # max number of failed metric checks before rollback 
  29.     threshold: 5 
  30.     # max traffic percentage routed to canary 
  31.     # percentage (0-100) 
  32.     maxWeight: 50 
  33.     # canary increment step 
  34.     # percentage (0-100) 
  35.     stepWeight: 5 
  36.     # Linkerd Prometheus checks 
  37.     metrics: 
  38.     - name: request-success-rate 
  39.       # minimum req success rate (non 5xx responses) 
  40.       # percentage (0-100) 
  41.       thresholdRange: 
  42.         min: 99 
  43.       interval: 1m 
  44.     - name: request-duration 
  45.       # maximum req duration P99 
  46.       # milliseconds 
  47.       thresholdRange: 
  48.         max: 500 
  49.       interval: 30s 
  50.     # testing (optional) 
  51.     webhooks: 
  52.       - name: acceptance-test 
  53.         type: pre-rollout 
  54.         url: http://flagger-loadtester.test/ 
  55.         timeout: 30s 
  56.         metadata: 
  57.           type: bash 
  58.           cmd: "curl -sd 'test' http://podinfo-canary.test:9898/token | grep token" 
  59.       - nameload-test 
  60.         type: rollout 
  61.         url: http://flagger-loadtester.test/ 
  62.         metadata: 
  63.           cmd: "hey -z 2m -q 10 -c 2 http://podinfo-canary.test:9898/" 

將上述資源另存為 podinfo-canary.yaml 然后應(yīng)用:

  1. kubectl apply -f ./podinfo-canary.yaml 

當(dāng) Canary 分析開(kāi)始時(shí),F(xiàn)lagger 將在將流量路由到 Canary 之前調(diào)用 pre-rollout webhooks。金絲雀分析將運(yùn)行五分鐘,同時(shí)每半分鐘驗(yàn)證一次 HTTP 指標(biāo)和 rollout(推出) hooks。

幾秒鐘后,F(xiàn)lager 將創(chuàng)建 canary 對(duì)象:

  1. # applied 
  2. deployment.apps/podinfo 
  3. horizontalpodautoscaler.autoscaling/podinfo 
  4. ingresses.extensions/podinfo 
  5. canary.flagger.app/podinfo 
  6.  
  7. # generated 
  8. deployment.apps/podinfo-primary 
  9. horizontalpodautoscaler.autoscaling/podinfo-primary 
  10. service/podinfo 
  11. service/podinfo-canary 
  12. service/podinfo-primary 
  13. trafficsplits.split.smi-spec.io/podinfo 

在 boostrap 之后,podinfo 部署將被縮放到零, 并且到 podinfo.test 的流量將被路由到主 pod。在 Canary 分析過(guò)程中,可以使用 podinfo-canary.test 地址直接定位 Canary Pod。

自動(dòng)金絲雀推進(jìn)

Flagger 實(shí)施了一個(gè)控制循環(huán),在測(cè)量 HTTP 請(qǐng)求成功率、請(qǐng)求平均持續(xù)時(shí)間和 Pod 健康狀況等關(guān)鍵性能指標(biāo)的同時(shí),逐漸將流量轉(zhuǎn)移到金絲雀。根據(jù)對(duì) KPI 的分析,提升或中止 Canary,并將分析結(jié)果發(fā)布到 Slack。

Flagger 金絲雀階段

通過(guò)更新容器鏡像觸發(fā)金絲雀部署:

  1. kubectl -n test set image deployment/podinfo \ 
  2. podinfod=stefanprodan/podinfo:3.1.1 

Flagger 檢測(cè)到部署修訂已更改并開(kāi)始新的部署:

  1. kubectl -n test describe canary/podinfo 
  2.  
  3. Status: 
  4.   Canary Weight:         0 
  5.   Failed Checks:         0 
  6.   Phase:                 Succeeded 
  7. Events: 
  8.  New revision detected! Scaling up podinfo.test 
  9.  Waiting for podinfo.test rollout to finish: 0 of 1 updated replicas are available 
  10.  Pre-rollout check acceptance-test passed 
  11.  Advance podinfo.test canary weight 5 
  12.  Advance podinfo.test canary weight 10 
  13.  Advance podinfo.test canary weight 15 
  14.  Advance podinfo.test canary weight 20 
  15.  Advance podinfo.test canary weight 25 
  16.  Waiting for podinfo.test rollout to finish: 1 of 2 updated replicas are available 
  17.  Advance podinfo.test canary weight 30 
  18.  Advance podinfo.test canary weight 35 
  19.  Advance podinfo.test canary weight 40 
  20.  Advance podinfo.test canary weight 45 
  21.  Advance podinfo.test canary weight 50 
  22.  Copying podinfo.test template spec to podinfo-primary.test 
  23.  Waiting for podinfo-primary.test rollout to finish: 1 of 2 updated replicas are available 
  24.  Promotion completed! Scaling down podinfo.test 

請(qǐng)注意,如果您在 Canary 分析期間對(duì)部署應(yīng)用新更改,F(xiàn)lagger 將重新開(kāi)始分析。

金絲雀部署由以下任何對(duì)象的更改觸發(fā):

  • Deployment PodSpec(容器鏡像container image、命令command、端口ports、環(huán)境env、資源resources等)
  • ConfigMaps 作為卷掛載或映射到環(huán)境變量
  • Secrets 作為卷掛載或映射到環(huán)境變量

您可以通過(guò)以下方式監(jiān)控所有金絲雀:

  1. watch kubectl get canaries --all-namespaces 
  2.  
  3. NAMESPACE   NAME      STATUS        WEIGHT   LASTTRANSITIONTIME 
  4. test        podinfo   Progressing   15       2019-06-30T14:05:07Z 
  5. prod        frontend  Succeeded     0        2019-06-30T16:15:07Z 
  6. prod        backend   Failed        0        2019-06-30T17:05:07Z 

自動(dòng)回滾

在金絲雀分析期間,您可以生成 HTTP 500 錯(cuò)誤和高延遲來(lái)測(cè)試 Flagger 是否暫停并回滾有故障的版本。

觸發(fā)另一個(gè)金絲雀部署:

  1. kubectl -n test set image deployment/podinfo \ 
  2. podinfod=stefanprodan/podinfo:3.1.2 

使用以下命令執(zhí)行負(fù)載測(cè)試器 pod:

  1. kubectl -n test exec -it flagger-loadtester-xx-xx sh 

生成 HTTP 500 錯(cuò)誤:

  1. watch -n 1 curl http://podinfo-canary.test:9898/status/500 

生成延遲:

  1. watch -n 1 curl http://podinfo-canary.test:9898/delay/1 

當(dāng)失敗的檢查次數(shù)達(dá)到金絲雀分析閾值時(shí),流量將路由回主服務(wù)器,金絲雀縮放為零,并將推出標(biāo)記為失敗。

  1. kubectl -n test describe canary/podinfo 
  2.  
  3. Status: 
  4.   Canary Weight:         0 
  5.   Failed Checks:         10 
  6.   Phase:                 Failed 
  7. Events: 
  8.  Starting canary analysis for podinfo.test 
  9.  Pre-rollout check acceptance-test passed 
  10.  Advance podinfo.test canary weight 5 
  11.  Advance podinfo.test canary weight 10 
  12.  Advance podinfo.test canary weight 15 
  13.  Halt podinfo.test advancement success rate 69.17% < 99% 
  14.  Halt podinfo.test advancement success rate 61.39% < 99% 
  15.  Halt podinfo.test advancement success rate 55.06% < 99% 
  16.  Halt podinfo.test advancement request duration 1.20s > 0.5s 
  17.  Halt podinfo.test advancement request duration 1.45s > 0.5s 
  18.  Rolling back podinfo.test failed checks threshold reached 5 
  19.  Canary failed! Scaling down podinfo.test 

自定義指標(biāo)

Canary analysis 可以通過(guò) Prometheus 查詢進(jìn)行擴(kuò)展。

讓我們定義一個(gè)未找到錯(cuò)誤的檢查。編輯 canary analysis 并添加以下指標(biāo):

  1. analysis: 
  2.   metrics: 
  3.   - name"404s percentage" 
  4.     threshold: 3 
  5.     query: | 
  6.       100 - sum
  7.           rate( 
  8.               response_total{ 
  9.                   namespace="test"
  10.                   deployment="podinfo"
  11.                   status_code!="404"
  12.                   direction="inbound" 
  13.               }[1m] 
  14.           ) 
  15.       ) 
  16.       / 
  17.       sum
  18.           rate( 
  19.               response_total{ 
  20.                   namespace="test"
  21.                   deployment="podinfo"
  22.                   direction="inbound" 
  23.               }[1m] 
  24.           ) 
  25.       ) 
  26.       * 100 

上述配置通過(guò)檢查 HTTP 404 req/sec 百分比是否低于總流量的 3% 來(lái)驗(yàn)證金絲雀版本。如果 404s 率達(dá)到 3% 閾值,則分析將中止,金絲雀被標(biāo)記為失敗。

通過(guò)更新容器鏡像觸發(fā)金絲雀部署:

  1. kubectl -n test set image deployment/podinfo \ 
  2. podinfod=stefanprodan/podinfo:3.1.3 

生成 404:

  1. watch -n 1 curl http://podinfo-canary:9898/status/404 

監(jiān)視 Flagger 日志:

  1. kubectl -n linkerd logs deployment/flagger -f | jq .msg 
  2.  
  3. Starting canary deployment for podinfo.test 
  4. Pre-rollout check acceptance-test passed 
  5. Advance podinfo.test canary weight 5 
  6. Halt podinfo.test advancement 404s percentage 6.20 > 3 
  7. Halt podinfo.test advancement 404s percentage 6.45 > 3 
  8. Halt podinfo.test advancement 404s percentage 7.22 > 3 
  9. Halt podinfo.test advancement 404s percentage 6.50 > 3 
  10. Halt podinfo.test advancement 404s percentage 6.34 > 3 
  11. Rolling back podinfo.test failed checks threshold reached 5 
  12. Canary failed! Scaling down podinfo.test 

如果您配置了 Slack,F(xiàn)lager 將發(fā)送一條通知,說(shuō)明金絲雀失敗的原因。

Linkerd Ingress

有兩個(gè)入口控制器與 Flagger 和 Linkerd 兼容:NGINX 和 Gloo。

安裝 NGINX:

  1. helm upgrade -i nginx-ingress stable/nginx-ingress \ 
  2. --namespace ingress-nginx 

為 podinfo 創(chuàng)建一個(gè) ingress 定義,將傳入標(biāo)頭重寫為內(nèi)部服務(wù)名稱(Linkerd 需要):

  1. apiVersion: extensions/v1beta1 
  2. kind: Ingress 
  3. metadata: 
  4.   name: podinfo 
  5.   namespace: test 
  6.   labels: 
  7.     app: podinfo 
  8.   annotations: 
  9.     kubernetes.io/ingress.class: "nginx" 
  10.     nginx.ingress.kubernetes.io/configuration-snippet: | 
  11.       proxy_set_header l5d-dst-override $service_name.$namespace.svc.cluster.local:9898; 
  12.       proxy_hide_header l5d-remote-ip; 
  13.       proxy_hide_header l5d-server-id; 
  14. spec: 
  15.   rules: 
  16.     - host: app.example.com 
  17.       http: 
  18.         paths: 
  19.           - backend: 
  20.               serviceName: podinfo 
  21.               servicePort: 9898 

使用 ingress controller 時(shí),Linkerd 流量拆分不適用于傳入流量,因?yàn)?NGINX 在網(wǎng)格之外運(yùn)行。為了對(duì)前端應(yīng)用程序運(yùn)行金絲雀分析,F(xiàn)lagger 創(chuàng)建了一個(gè) shadow ingress 并設(shè)置了 NGINX 特定的注釋(annotations)。

A/B 測(cè)試

除了加權(quán)路由,F(xiàn)lagger 還可以配置為根據(jù) HTTP 匹配條件將流量路由到金絲雀。在 A/B 測(cè)試場(chǎng)景中,您將使用 HTTP headers 或 cookies 來(lái)定位您的特定用戶群。這對(duì)于需要會(huì)話關(guān)聯(lián)的前端應(yīng)用程序特別有用。

Flagger Linkerd Ingress

編輯 podinfo 金絲雀分析,將提供者設(shè)置為 nginx,添加 ingress 引用,移除 max/step 權(quán)重并添加匹配條件和 iterations:

  1. apiVersion: flagger.app/v1beta1 
  2. kind: Canary 
  3. metadata: 
  4.   name: podinfo 
  5.   namespace: test 
  6. spec: 
  7.   # ingress reference 
  8.   provider: nginx 
  9.   ingressRef: 
  10.     apiVersion: extensions/v1beta1 
  11.     kind: Ingress 
  12.     name: podinfo 
  13.   targetRef: 
  14.     apiVersion: apps/v1 
  15.     kind: Deployment 
  16.     name: podinfo 
  17.   autoscalerRef: 
  18.     apiVersion: autoscaling/v2beta2 
  19.     kind: HorizontalPodAutoscaler 
  20.     name: podinfo 
  21.   service: 
  22.     # container port 
  23.     port: 9898 
  24.   analysis: 
  25.     interval: 1m 
  26.     threshold: 10 
  27.     iterations: 10 
  28.     match: 
  29.       # curl -H 'X-Canary: always' http://app.example.com 
  30.       - headers: 
  31.           x-canary: 
  32.             exact: "always" 
  33.       # curl -b 'canary=always' http://app.example.com 
  34.       - headers: 
  35.           cookie: 
  36.             exact: "canary" 
  37.     # Linkerd Prometheus checks 
  38.     metrics: 
  39.     - name: request-success-rate 
  40.       thresholdRange: 
  41.         min: 99 
  42.       interval: 1m 
  43.     - name: request-duration 
  44.       thresholdRange: 
  45.         max: 500 
  46.       interval: 30s 
  47.     webhooks: 
  48.       - name: acceptance-test 
  49.         type: pre-rollout 
  50.         url: http://flagger-loadtester.test/ 
  51.         timeout: 30s 
  52.         metadata: 
  53.           type: bash 
  54.           cmd: "curl -sd 'test' http://podinfo-canary:9898/token | grep token" 
  55.       - nameload-test 
  56.         type: rollout 
  57.         url: http://flagger-loadtester.test/ 
  58.         metadata: 
  59.           cmd: "hey -z 2m -q 10 -c 2 -H 'Cookie: canary=always' http://app.example.com" 

上述配置將運(yùn)行 10 分鐘的分析,目標(biāo)用戶是:canary cookie 設(shè)置為 always 或使用 X-Canary: always header 調(diào)用服務(wù)。

請(qǐng)注意,負(fù)載測(cè)試現(xiàn)在針對(duì)外部地址并使用 canary cookie。

通過(guò)更新容器鏡像觸發(fā)金絲雀部署:

  1. kubectl -n test set image deployment/podinfo \ 
  2. podinfod=stefanprodan/podinfo:3.1.4 

Flagger 檢測(cè)到部署修訂已更改并開(kāi)始 A/B 測(cè)試:

  1. kubectl -n test describe canary/podinfo 
  2.  
  3. Events: 
  4.  Starting canary deployment for podinfo.test 
  5.  Pre-rollout check acceptance-test passed 
  6.  Advance podinfo.test canary iteration 1/10 
  7.  Advance podinfo.test canary iteration 2/10 
  8.  Advance podinfo.test canary iteration 3/10 
  9.  Advance podinfo.test canary iteration 4/10 
  10.  Advance podinfo.test canary iteration 5/10 
  11.  Advance podinfo.test canary iteration 6/10 
  12.  Advance podinfo.test canary iteration 7/10 
  13.  Advance podinfo.test canary iteration 8/10 
  14.  Advance podinfo.test canary iteration 9/10 
  15.  Advance podinfo.test canary iteration 10/10 
  16.  Copying podinfo.test template spec to podinfo-primary.test 
  17.  Waiting for podinfo-primary.test rollout to finish: 1 of 2 updated replicas are available 
  18.  Promotion completed! Scaling down podinfo.test 

 

責(zé)任編輯:姜華 來(lái)源: 黑客下午茶
相關(guān)推薦

2022-02-17 13:09:55

金絲雀部署服務(wù)集群測(cè)試

2022-11-30 08:00:00

金絲雀部署IT測(cè)試

2021-06-15 05:52:33

Linkerd canary網(wǎng)絡(luò)技術(shù)

2021-07-13 06:35:11

Argo Rollou GitOpsKubernetes

2023-10-08 07:34:04

2024-04-01 13:04:01

停機(jī)部署滾動(dòng)部署藍(lán)綠部署

2022-08-22 10:40:40

Kubernete部署分析運(yùn)行

2021-10-08 20:12:22

微服務(wù)架構(gòu)Service

2021-02-28 07:52:24

蠕蟲數(shù)據(jù)金絲雀

2024-01-18 08:24:08

2021-06-03 05:48:58

GitOps 云原生Kubernetes

2025-03-04 08:53:10

2022-08-15 20:48:28

Chrome安卓網(wǎng)頁(yè)

2013-11-01 11:00:10

2024-12-16 13:34:35

2023-11-09 07:23:57

Istio路由分析

2023-02-20 10:13:00

灰度發(fā)布實(shí)現(xiàn)

2021-10-14 18:21:52

架構(gòu)IstioService

2015-08-20 10:49:39

Windows 10版本

2023-09-05 07:24:33

Traefik加權(quán)輪詢
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)