Canary Deployment i Kubernetes #3: Istio

AnvÀnda Istio+Kiali för att initiera och visualisera Canary-deployments

Canary Deployment i Kubernetes #3: Istio

Artiklar i denna cykel

  1. Canary Deployment i Kubernetes #1: Gitlab CI
  2. Canary Deployment i Kubernetes #2: Argo Rollouts
  3. (denna artikel)
  4. Canary-deployment med Jenkins-X Istio Flagger

Canary-deployment

Vi hoppas att du har lÀst den första delen, dÀr vi kort förklarade vad Canary-deployments Àr och visade hur man genomför dem med standardresurser i Kubernetes.

Istio

Och vi förutsÀtter att nÀr du lÀser denna artikel vet du redan vad Istio Àr. Om inte, kan du lÀsa om det hÀr.

App för tester

Canary Deployment i Kubernetes #3: Istio

Varje pod innehÄller tvÄ containrar: vÄr applikation och istio-proxy.

Vi kommer att anvÀnda en enkel testapplikation med pods frontend-nginx och backend i Python. Podden med nginx kommer bara att omdirigera varje begÀran till podden med backend och fungera som en proxy. Detaljer kan ses mer i de följande yaml-filerna:

Köra testapplikationen sjÀlv

Om du vill följa mitt exempel och anvÀnda denna testapplikation sjÀlv, se readme-filen för projektet.

Initial Deployment

Vid starten av den första deploymenten ser vi att pods i vÄr applikation har endast tvÄ containrar, vilket innebÀr att Istio-sidecar för nÀrvarande bara implementeras:

Canary Deployment i Kubernetes #3: Istio

Och vi ser ocksÄ Istio Gateway Loadbalancer i namnomrÄdet istio-system:

Canary Deployment i Kubernetes #3: Istio

Skapa trafik

Vi kommer att anvÀnda följande IP för att generera trafik som kommer att tas emot av frontend-pods och omdirigeras till backend-pods:

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

Vi kommer ocksÄ att lÀgga till frontend.istio-test i vÄr hosts-fil.

Visa Mesh via Kiali

Vi har installerat testapplikationen och Istio tillsammans med Tracing, Grafana, Prometheus och Kiali (se mer pÄ readme-filen för projektet). Följaktligen kan vi anvÀnda Kiali via:

istioctl dashboard kiali # admin:admin

Canary Deployment i Kubernetes #3: Istio

Kiali visualiserar den aktuella trafiken genom Mesh

Som vi kan se, gÄr 100% av trafiken till frontend-tjÀnsten, sedan till frontend-poden med etikett v1, eftersom vi anvÀnder en enkel nginx-proxy som omdirigerar begÀrningar till backend-tjÀnsten, som i sin tur omdirigerar dem till backend-pods med etikett v1.

Kiali fungerar utmÀrkt tillsammans med Istio och erbjuder en fÀrdig lösning för att visualisera Mesh. Bara fantastiskt.

Canary-deployment

VÄr backend har redan tvÄ k8s-deployments, en för v1 och en för v2. Nu behöver vi bara sÀga till Istio att omdirigera en viss procentandel av begÀrningarna till v2.

Steg 1: 10%

Och allt vi behöver göra Àr att justera vikten pÄ VirtualService i 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 i Kubernetes #3: Istio

Vi ser att 10 % av förfrÄgningarna omdirigeras till v2.

Steg 2: 50 %

Och nu Àr det tillrÀckligt enkelt att öka den till 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 i Kubernetes #3: Istio

Steg 3: 100 %

Nu kan Canary-distributionen anses vara slutförd och all trafik omdirigeras till v2:

Canary Deployment i Kubernetes #3: Istio

Manuell testning av Canary

Anta att vi nu skickar 10 % av alla förfrÄgningar till backend v2. Vad hÀnder om vi vill testa v2 manuellt för att se till att allt fungerar som vi förvÀntar oss?

Vi kan lÀgga till en speciell matchningsregel baserad pÄ HTTP-huvuden:

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

Nu anvÀnder vi curl för att tvinga en begÀran till v2 genom att skicka huvudet:

Canary Deployment i Kubernetes #3: Istio

BegÀrningar utan huvudet kommer fortfarande att hanteras enligt förhÄllandet 1/10:

Canary Deployment i Kubernetes #3: Istio

Canary för tvÄ beroende versioner

Nu ska vi se ett scenario dÀr vi har version v2 för bÄde frontend och backend. För bÄda har vi angett att 10 % av trafiken ska gÄ till v2:

Canary Deployment i Kubernetes #3: Istio

Vi ser att bÄde frontend v1 och v2 skickar trafik i förhÄllandet 1/10 till backend v1 och v2.

Vad hÀnder om vi behöver skicka trafik frÄn frontend-v2 endast till backend-v2, eftersom det inte Àr kompatibelt med v1? För detta kommer vi att stÀlla in ett förhÄllande 1/10 för frontend, som kontrollerar vilken trafik som gÄr till backend-v2 med hjÀlp av matchning baserat pÄ 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

Som vi fÄr det vi behöver:

Canary Deployment i Kubernetes #3: Istio

Skillnaderna frÄn den manuella Canary-metoden

I första delen Vi utförde Canary-distribution manuellt, ocksÄ med hjÀlp av tvÄ k8s-distributioner. DÀr hanterade vi förhÄllandet mellan förfrÄgningar genom att Àndra antalet repliker. Denna metod fungerar, men har allvarliga nackdelar.

Istio ger möjlighet att definiera förhĂ„llandet mellan förfrĂ„gningar oavsett antalet repliker. Det betyder till exempel att vi kan anvĂ€nda HPAs (Horizontal Pod Autoscalers — horisontell skalning av pods) och det behöver inte stĂ€llas in utifrĂ„n det aktuella tillstĂ„ndet av Canary-distributionen.

Resultat

Istio fungerar utmÀrkt och genom att anvÀnda det tillsammans med Kiali fÄr vi en mycket kraftfull kombination. NÀsta pÄ min lista över intressen Àr kombinationen av Spinnaker med Istio för automatisering och Canary-analys.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster