Canary Deployment hauv Kubernetes #3: Istio

Siv Istio + Kiali los tso tawm thiab pom lub Canary xa tawm

Canary Deployment hauv Kubernetes #3: Istio

Cov lus hauv no series

  1. Canary Deployment hauv Kubernetes #1: Gitlab CI
  2. Canary Deployment hauv Kubernetes #2: Argo Rollouts
  3. (Cov kab lus no)
  4. Canary Deployment siv Jenkins-X Istio Flagger

Canary Deployment

Peb vam tias koj nyeem thawj ntu, qhov twg peb tau piav qhia luv luv txog qhov kev xa tawm Canary yog dab tsi thiab qhia tias yuav ua li cas siv lawv siv cov peev txheej Kubernetes tus qauv.

Istio

Thiab peb xav tias los ntawm kev nyeem cov kab lus no koj twb paub tias Istio yog dab tsi. Yog tias tsis yog, koj tuaj yeem nyeem txog nws no.

Daim ntawv thov rau kev xeem

Canary Deployment hauv Kubernetes #3: Istio

Txhua lub pod muaj ob lub thawv: peb daim ntawv thov thiab istio-proxy.

Peb yuav siv daim ntawv thov sim yooj yim nrog frontend-nginx thiab backend python pods. Lub nginx pod yuav tsuas redirect txhua qhov kev thov mus rau lub backend pod thiab ua hauj lwm raws li ib tug proxy. Cov ntsiab lus tuaj yeem pom hauv yamls hauv qab no:

Khiav daim ntawv thov kev xeem koj tus kheej

Yog tias koj xav ua raws li kuv qhov piv txwv thiab siv daim ntawv thov xeem no koj tus kheej, saib project readme.

Kev xa tawm thawj zaug

Thaum peb tso tawm thawj Kev Tshaj Tawm, peb pom tias cov pods ntawm peb daim ntawv thov tsuas muaj 2 lub thawv, uas yog, Istio sidecar tsuas yog ua tiav:

Canary Deployment hauv Kubernetes #3: Istio

Thiab peb kuj pom Istio Gateway Loadbalancer hauv lub npe istio-system:

Canary Deployment hauv Kubernetes #3: Istio

Kev tsim tsheb

Peb yuav siv tus IP hauv qab no los tsim cov tsheb thauj mus los uas yuav tau txais los ntawm cov pods frontend thiab xa mus rau tom qab pods:

while true; do curl -s --resolve 'frontend.istio-test:80:35.242.202.152' frontend.istio-test; sleep 0.1; done

Peb kuj yuav ntxiv frontend.istio-test rau peb cov ntaub ntawv hosts.

Saib Mesh ntawm Kiali

Peb tau teeb tsa daim ntawv thov xeem thiab Istio nrog rau Tracing, Grafana, Prometheus thiab Kiali (saib hauv qab kom paub meej). project readme). Yog li peb tuaj yeem siv Kiali ntawm:

istioctl dashboard kiali # admin:admin

Canary Deployment hauv Kubernetes #3: Istio

Kiali pom cov tsheb khiav tam sim no los ntawm Mesh

Raws li peb tuaj yeem pom, 100% ntawm cov tsheb khiav mus rau qhov kev pabcuam pem hauv ntej, tom qab ntawd mus rau pem hauv ntej pods nrog daim ntawv lo v1, txij li thaum peb tab tom siv nginx proxy yooj yim uas redirects thov mus rau qhov kev pabcuam backend, uas tig rov qab lawv mus rau lub backend pods. nrog daim ntawv v1.

Kiali ua haujlwm zoo nrog Istio thiab muab lub thawv mesh rendering tov. Zoo heev.

Canary Deployment

Peb lub backend twb muaj ob qhov kev xa tawm k8s, ib qho rau v1 thiab ib qho rau v2. Tam sim no peb tsuas yog xav qhia Istio kom xa ib feem pua ​​​​ntawm kev thov rau v2.

Kauj Ruam 1: 10%

Thiab txhua yam peb yuav tsum tau ua yog kho qhov hnyav ntawm VirtualService hauv istio. yaml:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: backend
  namespace: default
spec:
  gateways: []
  hosts:
  - "backend.default.svc.cluster.local"
  http:
  - match:
    - {}
    route:
    - destination:
        host: backend.default.svc.cluster.local
        subset: v1
        port:
          number: 80
      weight: 90
    - destination:
        host: backend.default.svc.cluster.local
        subset: v2
        port:
          number: 80
      weight: 10

Canary Deployment hauv Kubernetes #3: Istio

Peb pom tias 10% ntawm kev thov raug xa mus rau v2.

Kauj Ruam 2: 50%

Thiab tam sim no nws txaus tsuas yog nce nws mus rau 50%:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: backend
  namespace: default
spec:
...
    - destination:
        host: backend.default.svc.cluster.local
        subset: v1
        port:
          number: 80
      weight: 50
    - destination:
        host: backend.default.svc.cluster.local
        subset: v2
        port:
          number: 80
      weight: 50

Canary Deployment hauv Kubernetes #3: Istio

Kauj Ruam 3: 100%

Tam sim no Canary xa tawm tuaj yeem suav tias ua tiav thiab tag nrho cov tsheb khiav mus rau v2:

Canary Deployment hauv Kubernetes #3: Istio

Kuaj Canary manually

Cia peb hais tias tam sim no peb xa 2% ntawm tag nrho cov kev thov mus rau v10 backend. Yuav ua li cas yog tias peb xav manually sim v2 kom paub tseeb tias txhua yam ua haujlwm raws li peb xav tau?

Peb tuaj yeem ntxiv txoj cai tshwj xeeb sib xws raws li HTTP headers:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: backend
  namespace: default
spec:
  gateways: []
  hosts:
  - "backend.default.svc.cluster.local"
  http:
  - match:
    - headers:
        canary:
          exact: "canary-tester"
    route:
    - destination:
        host: backend.default.svc.cluster.local
        subset: v2
        port:
          number: 80
      weight: 100
  - match:
    - {}
    route:
    - destination:
        host: backend.default.svc.cluster.local
        subset: v1
        port:
          number: 80
      weight: 90
    - destination:
        host: backend.default.svc.cluster.local
        subset: v2
        port:
          number: 80
      weight: 10

Tam sim no siv curl peb tuaj yeem yuam kev thov v2 los ntawm kev xa cov header:

Canary Deployment hauv Kubernetes #3: Istio

Kev thov yam tsis muaj header tseem yuav tau tsav los ntawm 1/10 piv:

Canary Deployment hauv Kubernetes #3: Istio

Canary rau ob txoj kev vam meej

Tam sim no peb yuav xav txog qhov kev xaiv uas peb muaj version v2 rau ob qho tib si frontend thiab backend. Rau ob qho tib si, peb tau hais tias 10% ntawm cov tsheb yuav tsum mus rau v2:

Canary Deployment hauv Kubernetes #3: Istio

Peb pom tias frontend v1 thiab v2 ob qho tib si rau pem hauv ntej ntawm qhov sib piv ntawm 1/10 rau backend v1 thiab v2.

Yuav ua li cas yog tias peb xav tau kev xa mus los ntawm frontend-v2 tsuas yog rau backend-v2 vim nws tsis sib haum nrog v1? Txhawm rau ua qhov no, peb yuav teeb tsa 1/10 piv rau frontend, uas tswj cov tsheb khiav mus rau backend-v2 siv kev sib tham. sourceLabels :

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: backend
  namespace: default
spec:
  gateways: []
  hosts:
  - "backend.default.svc.cluster.local"
  http:
...
  - match:
    - sourceLabels:
        app: frontend
        version: v2
    route:
    - destination:
        host: backend.default.svc.cluster.local
        subset: v2
        port:
          number: 80
      weight: 100

Yog li ntawd, peb tau txais yam peb xav tau:

Canary Deployment hauv Kubernetes #3: Istio

Qhov sib txawv ntawm phau ntawv Canary mus kom ze

Π’ thawj ntu Peb tau ua Canary xa tawm manually, kuj siv ob k8s xa tawm. Nyob ntawd peb tswj qhov piv txwv ntawm kev thov los ntawm kev hloov tus lej ntawm cov replicas. Txoj kev no ua haujlwm, tab sis muaj teeb meem loj.

Istio ua rau nws muaj peev xwm txiav txim siab qhov piv ntawm kev thov tsis hais tus naj npawb ntawm replicas. Qhov no txhais tau hais tias, piv txwv li, peb tuaj yeem siv HPAs ( Kab rov tav Pod Autoscalers ) thiab tsis tas yuav tsum tau teeb tsa raws li lub xeev tam sim no ntawm Canary xa tawm.

Qhov no

Istio ua haujlwm zoo thiab siv nws ua ke nrog Kiali ua rau kev sib xyaw ua ke muaj zog heev. Tom ntej no ntawm kuv daim ntawv teev cov kev txaus siab yog sib txuas Spinnaker nrog Istio rau automation thiab Canary analytics.

Tau qhov twg los: www.hab.com

Ntxiv ib saib