Canary Deployment në Kubernetes #3: Istio

Përdorimi i Istio+Kiali për nisjen dhe visualizimin e Canary deploy

Canary Deployment në Kubernetes #3: Istio

Artikujt e këtij cikli

  1. Shpërndarja Canary në Kubernetes #1: Gitlab CI
  2. Implementimi Canary në Kubernetes #2: Argo Rollouts
  3. (ky artikull)
  4. Canary Deployment duke përdorur Jenkins-X Istio Flagger

Shpërndarja Canary

Shpresojmë që keni lexuar pjesën e parë, ku shpjeguam shkurtimisht se çfarë janë deploy-t e Canary dhe tregonim si t'i realizoni duke përdorur burimet standarde të Kubernetes.

Istio

Dhe ne supozojmë se, duke lexuar këtë artikull, tashmë e dini se çfarë është Istio. Nëse jo, mund të lexoni për të këtu.

Aplikacioni për teste

Canary Deployment në Kubernetes #3: Istio

Çdo pod pĂ«rmban dy kontejnerĂ«: aplikacionin tonĂ« dhe istio-proxy.

Ne do të përdorim një aplikacion të thjeshtë testimi me pod-at frontend-nginx dhe backend në python. Pod-i me nginx do të thjesht të ridrejtojë çdo kërkesë në pod-in me backend dhe do të funksionojë si proxy. Detajet mund të shihni më hollësisht në yamlet e mëposhtme:

Nisja e aplikacionit testues vetë

Nëse dëshironi të ndiqni shembullin tim dhe të përdorni këtë aplikacion testimi vetë, shihni readme e projektit.

Deployment-i fillestar

Kur të nisim Deployment-in e parë, shohim që pod-et e aplikacionit tonë kanë vetëm nga 2 kontejnerë, domethënë Istio sidecar akoma po integrohet:

Canary Deployment në Kubernetes #3: Istio

Dhe gjithashtu shohim Istio Gateway Loadbalancer në namespace istio-system:

Canary Deployment në Kubernetes #3: Istio

Krijimi i trafikut

Do të përdorim IP-në e mëposhtme për të gjeneruar trafik, i cili do të pranohet nga pod-et frontend dhe do të ridrejtohet në pod-et backend:

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

Ne gjithashtu do ta shtojmë frontend.istio-test në skedarin tonë hosts.

Shikimi i Mesh-it përmes Kiali

Ne kemi instaluar aplikacionin testues dhe Istio bashkë me Tracing, Grafana, Prometheus dhe Kiali (më shumë shihni readme e projektit). Si rezultat, mund ta përdorim Kiali përmes:

istioctl dashboard kiali # admin:admin

Canary Deployment në Kubernetes #3: Istio

Kiali vizualizon trafikun aktual përmes Mesh-it

Siç shohim, 100% e trafikut shkon në shërbimin frontend, pastaj në pod-in e frontend-it me label v1, pasi po përdorim një nginx-proxy të thjeshtë, i cili ridrejton kërkesat në shërbimin backend, i cili nga ana e tij i ridrejton ato në pod-et backend me label v1.

Kiali punon shkëlqyeshëm bashkë me Istio dhe ofron një zgjidhje të kutisë për vizualizimin e Mesh-it. Thjesht e shkëlqyer.

Shpërndarja Canary

Backend-i ynë tashmë ka dy deployment-e k8s, një për v1 dhe një për v2. Tani duhet thjesht të i themi Istio të ridrejtojë një përqindje të caktuar të kërkesave në v2.

Hapi 1: 10%

Dhe e gjitha që na nevojitet është të rregullojmë pesha e VirtualService në 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 në Kubernetes #3: Istio

Ne shohim se 10% e kërkesave janë redirectuar në v2.

Hapi 2: 50%

Dhe tani është mjaft e thjeshtë ta rritni atë në 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 në Kubernetes #3: Istio

Hapi 3: 100%

Tani implementimi Canary mund të konsiderohet i përfunduar dhe i gjithë trafiku redirectohet në v2:

Canary Deployment në Kubernetes #3: Istio

Testimi manual i Canary

TĂ« supozojmĂ« se tani po dĂ«rgojmĂ« nĂ« backend v2 10% tĂ« tĂ« gjitha kĂ«rkesave. ÇfarĂ« nĂ«se dĂ«shirojmĂ« tĂ« testojmĂ« nĂ« mĂ«nyrĂ« manuale v2 pĂ«r tĂ« siguruar se gjithçka funksionon siç e presim?

Mund të shtojmë një rregull të veçantë të përshtatjes, të bazuar në header-at HTTP:

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

Tani duke përdorur curl mund të kërkojmë me forcë v2 duke dërguar header-in:

Canary Deployment në Kubernetes #3: Istio

Kërkesat pa header ende do të trajtohen në raportin 1/10:

Canary Deployment në Kubernetes #3: Istio

Canary për dy versione të varura

Tani do të shqyrtojmë një rast, ku kemi version v2 si për frontend ashtu edhe për backend. Për të dy do të përcaktojmë se 10% e trafik duhet të shkojë në v2:

Canary Deployment në Kubernetes #3: Istio

Shohim se frontend v1 dhe v2 të dy e transferojnë trafikun në raportin 1/10 në backend v1 dhe v2.

ÇfarĂ« nĂ«se do tĂ« na duhej tĂ« transferonim trafik nga frontend-v2 vetĂ«m nĂ« backend-v2, sepse ai nuk Ă«shtĂ« kompatibil me v1? PĂ«r kĂ«tĂ« do tĂ« vendosim raportin 1/10 pĂ«r frontend, i cili kontrollon se cili trafik kalon nĂ« backend-v2 duke pĂ«rdorur pĂ«rputhjen sipas 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

Si përfundim merrim atë që na nevojitet:

Canary Deployment në Kubernetes #3: Istio

Dallimet nga qasja manuale e Canary

Në pjesën e parë ne e realizuam Canary deployment manualisht, duke përdorur gjithashtu dy k8s deployments. Aty menaxhonim raportin e kërkesave, duke ndryshuar numrin e replikave. Ky qasje punon, por ka disavantazhe serioze.

Istio ofron mundĂ«sinĂ« pĂ«r tĂ« pĂ«rcaktuar raportin e kĂ«rkesave pavarĂ«sisht nga numri i replikave. Kjo do tĂ« thotĂ«, pĂ«r shembull, qĂ« mund tĂ« pĂ«rdorim HPAs (Horizontal Pod Autoscalers — shkallĂ«zim horizontal tĂ« podĂ«ve) dhe nuk Ă«shtĂ« e nevojshme ta konfigurojmĂ« nĂ« pĂ«rputhje me gjendjen aktuale tĂ« Canary deployment.

Përfundimi

Istio punon shkëlqyeshëm dhe duke e përdorur atë së bashku me Kiali marrim një kombinim shumë të fuqishëm. E ardhshmja në listën time të interesave është kombinimi i Spinnaker me Istio për automatizimin dhe analitikën e Canary.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster