Canary Deployment i Kubernetes #2: Argo Rollouts

Vi kommer att anvÀnda k8s-nativa distributionskontrollern Argo Rollouts och GitlabCI för att starta Canary-distribution i Kubernetes

Canary Deployment i Kubernetes #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Artiklar i denna cykel

Canary-deployment

Vi hoppas att du har lÀst den första delen, dÀr vi kort förklarade vad Canary-distributioner Àr. Vi visade ocksÄ hur man implementerar det med standardresurser i Kubernetes.

Argo Rollouts

Argo Rollouts Àr en Kubernetes-nativ distributionskontroller. Den tillhandahÄller CRD (Custom Resource Definition) för Kubernetes. Med den kan vi anvÀnda en ny enhet: Rollout, som hanterar blue-green och canary-distributioner med olika konfigurationsalternativ.

Kontrollern Argo Rollouts, som anvÀnds av den anpassade resursen Rollout, möjliggör ytterligare distributionsstrategier, sÄsom blue-green och canary för Kubernetes. Resursen Rollout erbjuder funktionalitet jÀmförbar med Deployment, men med de extra distributionsstrategierna.
Resurs Deployments har tvĂ„ strategier för distribution: RollingUpdate och Recreate. Även om dessa strategier passar för de flesta scenarier, anvĂ€nds extra strategier, sĂ„som blue-green eller canary, för distribution till servrar i mycket stor skala, vilket inte finns i Deployment-kontrollern. För att anvĂ€nda dessa strategier i Kubernetes var anvĂ€ndarna tvungna att skriva skript ovanpĂ„ sina Distributioner. Kontrollern Argo Rollouts tillhandahĂ„ller dessa strategier som enkla deklarativa anpassningsparametrar.
https://argoproj.github.io/argo-rollouts

Det finns ocksÄ Argo CI, som erbjuder ett anvÀndarvÀnligt webbgrÀnssnitt för att anvÀndas tillsammans med Rollouts, vi kommer att titta pÄ det i nÀsta artikel.

Installation av Argo Rollouts

PĂ„ serversidan

kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml

I vÄrt infrastrukturrepo (se nedan) har vi redan lagt till install.yaml som i/k8s/argo-rollouts/install.yaml. SÄ GitlabCI kommer att installera det i klustret.

PĂ„ klientsidan (kubectl plugin)

https://argoproj.github.io/argo-rollouts/features/kubectl-plugin

Exempelapplikation

En god praxis Àr att ha separata arkiv för applikationskoden och för infrastrukturen.

Arkivet för applikationen

Kim Wuestkamp / k8s-deployment-example-app

Detta Àr en mycket enkel API i Python+Flask som returnerar ett svar i JSON-format. Vi kommer att bygga paketet med GitlabCI och skicka resultatet till Gitlab Registry. I registret har vi tvÄ olika versionsslÀpp:

  • wuestkamp/k8s-deployment-example-app:v1
  • wuestkamp/k8s-deployment-example-app:v2

Den enda skillnaden mellan dem Àr den JSON-fil som returneras. Vi anvÀnder den hÀr applikationen för att pÄ ett sÄ enkelt sÀtt som möjligt visualisera vilken version vi kommunicerar med.

Infrastrukturens repository

I detta repository kommer vi att anvÀnda GitlabCI för deployment till Kubernetes, .gitlab-ci.yml ser ut som följer:

image: traherom/kustomize-dockerbefore_script:
   - printenv
   - kubectl versionstages:
 - deploydeploy test:
   stage: deploy
   before_script:
     - echo $KUBECONFIG
   script:
     - kubectl get all
     - kubectl apply -f i/k8s    only:
     - master

För att köra det pÄ egen hand behöver du en kluster, du kan anvÀnda Gcloud:

gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80

Du behöver göra en fork https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure och skapa en variabel KUBECONFIG i GitlabCI som kommer att innehÄlla konfigurationen för Ätkomst kubectl till din kluster.

HÀr du kan lÀsa om hur man fÄr autentisering för klustret (Gcloud).

Infrastrukturens Yaml

Inuti det infrastrukturella repositoryt har vi service:

apiVersion: v1
kind: Service
metadata:
 labels:
   id: rollout-canary
 name: app
spec:
 ports:
 - port: 80
   protocol: TCP
   targetPort: 5000
 selector:
   id: app
 type: LoadBalancer

och rollout.yaml :

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
 name: rollout-canary
spec:
 replicas: 10
 revisionHistoryLimit: 2
 selector:
   matchLabels:
     id: rollout-canary
 template:
   metadata:
     labels:
       id: rollout-canary
   spec:
     containers:
     - name: rollouts-demo
       image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
       imagePullPolicy: Always
 strategy:
   canary:
     steps:
     - setWeight: 10
     # Rollouts kan manuellt Äterupptas genom att köra `kubectl argo rollouts promote ROLLOUT`
     - pause: {}
     - setWeight: 50
     - pause: { duration: 120 } # tvÄ minuter

Rollout fungerar pÄ samma sÀtt som ett Deployment. Om vi inte anger en uppdateringsstrategi (som canary hÀr) kommer den att bete sig som en standard rolling-update Deployment.

Vi definierar tvÄ steg i yaml för canary deployment:

  1. 10% trafik till canary (vÀnta pÄ manuell OK)
  2. 50% trafik till canary (vÀnta 2 minuter och fortsÀtt till 100%)

Utför den initiala deploymenten

Efter den initiala deploymenten kommer vÄra resurser att se ut sÄ hÀr:

Canary Deployment i Kubernetes #2: Argo Rollouts

Och vi fÄr svar endast frÄn den första versionen av applikationen:

Canary Deployment i Kubernetes #2: Argo Rollouts

Utför Canary Deployment

Steg 1: 10% trafik

För att inleda canary-utplaceringen behöver vi bara Àndra versionen av bilden, precis som vi vanligtvis gör med deployment:

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
 name: rollout-canary
spec:
...
 template:
   metadata:
     labels:
       id: rollout-canary
   spec:
     containers:
     - name: rollouts-demo
       image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
...

Och vi pushar Àndringarna sÄ att Gitlab CI gör deployment och vi ser Àndringarna:

Canary Deployment i Kubernetes #2: Argo Rollouts

Just nu, om vi tillgÄr tjÀnsten:

Canary Deployment i Kubernetes #2: Argo Rollouts

Fantastiskt! Vi Àr mitt i vÄr canary deployment. Vi kan se framstegen genom att köra:

kubectl argo rollouts get rollout rollout-canary

Canary Deployment i Kubernetes #2: Argo Rollouts

Steg 2: 50% av trafiken:

Nu gÄr vi vidare till nÀsta steg: omdirigera 50% av trafiken. Vi har stÀllt in sÄ att detta steg startas manuellt:

kubectl argo rollouts promote rollout-canary # fortsÀtt till steg 2

Canary Deployment i Kubernetes #2: Argo Rollouts

Och vÄr applikation har returnerat 50% svar frÄn de nya versionerna:

Canary Deployment i Kubernetes #2: Argo Rollouts

Och översikten av rollout:

Canary Deployment i Kubernetes #2: Argo Rollouts

UtmÀrkt.

Steg 3: 100% av trafiken:

Vi har stÀllt in sÄ att steget med 50% automatiskt avslutas efter 2 minuter och steget med 100% startas:

Canary Deployment i Kubernetes #2: Argo Rollouts

Och applikationsutdata:

Canary Deployment i Kubernetes #2: Argo Rollouts

Och översikten av rollout:

Canary Deployment i Kubernetes #2: Argo Rollouts

Canary-deploymentet Àr komplett.

Fler exempel med Argo Rollouts

HÀr finns fler exempel, till exempel hur man konfigurerar förhandsgranskning av miljö och jÀmförelser baserade pÄ canary:

https://github.com/argoproj/argo-rollouts/tree/master/examples

Video om Argo Rollouts och Argo CI

Jag rekommenderar verkligen denna video, som visar hur Argo Rollouts och Argo CI fungerar tillsammans:

Spela video

Resultat

Jag gillar verkligen idén med att anvÀnda CRD:er som hanterar skapandet av ytterligare typer av deployments eller replicasets, omdirigerar trafik osv. Att arbeta med dem gÄr smidigt. Jag skulle vilja testa integrationen med Argo CI.

Men tydligen stÄr ett stort samgÄende mellan Argo CI och Flux CI för dörren, sÄ jag skulle kunna vÀnta pÄ att den nya versionen slÀpps: Argo Flux.

Har ni haft erfarenhet av Argo Rollouts eller Argo CI?

LÀs Àven andra artiklar i vÄr blogg:

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