Canary Deployment i Kubernetes #2: Argo Rollouts

Vi vil bruke en k8s-nativ distribusjonskontroller, Argo Rollouts, og GitlabCI for Ă„ implementere Canary-deploy i Kubernetes

Canary Deployment i Kubernetes #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Artiklene i denne serien

Canary Deployment

Vi hÄper du har lest den fÞrste delen, hvor vi kort forklarte hva Canary-distribusjoner er. Vi viste ogsÄ hvordan man kan implementere dette ved Ä bruke standardressurser fra Kubernetes.

Argo Rollouts

Argo Rollouts er en Kubernetes-nativ distribusjonskontroller. Den gir CRD (Custom Resource Definition) for Kubernetes. Med den kan vi bruke en ny enhet: Rollout, som administrerer blue-green og canary-distribusjoner med ulike konfigurasjonsalternativer.

Argo Rollouts-kontrolleren, som bruker den tilpassede ressursen Rollout, gjĂžr det mulig Ă„ bruke ekstra distribusjonsstrategier som blue-green og canary for Kubernetes. Ressursen Rollout tilbyr funksjonalitet lik Deployment, bare med ekstra distribusjonsstrategier.
Ressurs Deployments har to strategier for distribusjon: RollingUpdate og Recreate. Selv om disse strategiene passer for de fleste tilfeller, brukes ekstra strategier som blue-green eller canary for distribusjoner til servere i svÊrt stor skala, som ikke finnes i distribusjonskontrolleren. For Ä bruke disse strategiene i Kubernetes mÄtte brukerne skrive skript over sine distribusjoner. Argo Rollouts-kontrolleren gir disse strategiene i form av enkle deklarative konfigurerbare parametere.
https://argoproj.github.io/argo-rollouts

Det finnes ogsÄ Argo CI, som gir et brukervennlig webgrensesnitt for Ä brukes sammen med Rollouts; vi vil se pÄ det i neste artikkel.

Installer Argo Rollouts

PĂ„ serversiden

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

I vÄrt infrastrukturnotat (se nedenfor) har vi allerede lagt til install.yaml som i/k8s/argo-rollouts/install.yaml. Dermed vil GitlabCI installere det i klyngen.

PĂ„ klientsiden (kubectl-plugin)

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

Eksempelapplikasjonen

Det er god praksis Ă„ ha separate repositoryer for applikasjonskoden og for infrastrukturen.

Repository for applikasjonen

Kim Wuestkamp / k8s-deployment-example-app

Dette er et veldig enkelt API bygget med Python+Flask som returnerer et svar i JSON-format. Vi vil bygge pakken ved hjelp av GitlabCI og laste opp resultatet til Gitlab Registry. I registeret har vi to forskjellige versjoner av utgivelsene:

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

Den eneste forskjellen mellom dem er JSON-filen som returneres. Vi bruker denne applikasjonen for en maksimal enkel visualisering av hvilken versjon vi kommuniserer med.

Infrastrukturrepository

I denne repositoriet vil vi bruke GitlabCI for distribusjon til Kubernetes, .gitlab-ci.yml ser slik ut:

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

For Ă„ kjĂžre det selv trenger du et klynge, du kan bruke Gcloud:

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

Du mÄ gjÞre en fork https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure og opprette en variabel KUBECONFIG i GitlabCI, som vil inneholde konfigurasjonen for tilgang kubectl til klyngen din.

Her Du kan lese om hvordan du fÄr legitimasjon for klyngen (Gcloud).

Infrastruktur-YAML

Inne i infrastruktur-repositoriet 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

og 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 manuelt gjenopptas ved Ă„ kjĂžre `kubectl argo rollouts promote ROLLOUT`
     - pause: {}
     - setWeight: 50
     - pause: { duration: 120 } # to minutter

Rollout fungerer pÄ samme mÄte som Deployment. Hvis vi ikke angir oppdateringsstrategi (som canary her) vil det oppfÞre seg som en standard rolling-update Deployment.

Vi definerer to trinn i yaml for canary distribusjon:

  1. 10% av trafikken pÄ canary (vent pÄ manuell OK)
  2. 50% av trafikken pÄ canary (vent 2 minutter fÞr vi gÄr videre til 100%)

UtfĂžring av initial deployment

Etter den fÞrste distribusjonen vil ressursene vÄre se slik ut:

Canary Deployment i Kubernetes #2: Argo Rollouts

Og vi fÄr svar kun fra den fÞrste versjonen av applikasjonen:

Canary Deployment i Kubernetes #2: Argo Rollouts

UtfĂžrer Canary Deployment

Trinn 1: 10% trafikk

For Ä starte canary distribusjonen mÄ vi bare endre versjonen av bildet, som vi vanligvis gjÞr med distribusjoner:

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
...

Og vi pusher endringene, sÄ Gitlab CI gjÞr distribusjonen og vi ser endringene:

Canary Deployment i Kubernetes #2: Argo Rollouts

NĂ„, hvis vi henvender oss til tjenesten:

Canary Deployment i Kubernetes #2: Argo Rollouts

Flott! Vi er i midten av vÄr canary-distribusjon. Vi kan se fremdriften ved Ä kjÞre:

kubectl argo rollouts get rollout rollout-canary

Canary Deployment i Kubernetes #2: Argo Rollouts

Trinn 2: 50% trafikk:

NÄ gÄr vi videre til neste trinn: omdirigere 50% av trafikken. Vi har satt opp dette trinnet til Ä bli startet manuelt:

kubectl argo rollouts promote rollout-canary # fortsett til trinn 2

Canary Deployment i Kubernetes #2: Argo Rollouts

Og applikasjonen vÄr returnerte 50% svar fra de nye versjonene:

Canary Deployment i Kubernetes #2: Argo Rollouts

Og oversikt over rollout:

Canary Deployment i Kubernetes #2: Argo Rollouts

Flott.

Trinn 3: 100% trafikk:

Vi har satt opp slik at etter 2 minutter avsluttes trinnet med 50% automatisk og trinnet med 100% startes:

Canary Deployment i Kubernetes #2: Argo Rollouts

Og utskriften av applikasjonen:

Canary Deployment i Kubernetes #2: Argo Rollouts

Og oversikt over rollout:

Canary Deployment i Kubernetes #2: Argo Rollouts

Canary distribusjon fullfĂžrt.

Flere eksempler med Argo Rollouts

Her er flere eksempler, som hvordan man kan sette opp forhÄndsvisning av miljÞer og sammenligninger basert pÄ canary:

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

Video om Argo Rollouts og Argo CI

Jeg anbefaler virkelig denne videoen, den viser hvordan Argo Rollouts og Argo CI fungerer sammen:

Spill video

Resultat

Jeg liker veldig godt ideen om Ä bruke CRD-er som styrer opprettingen av flere typer deployments eller replicasets, omdirigerer trafikk osv. Jobben med dem gÄr smertefritt. Jeg vil gjerne teste integrasjonen med Argo CI.

Men det ser ut til at en stor fusjon mellom Argo CI og Flux CI nÊrmer seg, sÄ jeg kan vente til den nye versjonen kommer: Argo Flux.

Har du hatt erfaring med Argo Rollouts eller Argo CI?

Les ogsÄ andre artikler i bloggen vÄr:

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster