Canary Deployment in Kubernetes #2: Argo Rollouts

Uporabili bomo Argo Rollouts, Kubernetes-nativni kontroler za razmestitev, in GitlabCI za zagon Canary razmestitve v Kubernetesu

Canary Deployment in Kubernetes #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Članki tega cikla

Canary Deployment

Upamo, da ste prebrali prvi del, kjer smo na kratko razložili, kaj so Canary razmestitve. Prav tako smo prikazali, kako jih lahko izvedemo z uporabo standardnih virov Kubernetes.

Argo Rollouts

Argo Rollouts je Kubernetes-nativni kontroler za razmestitev. Ponuja CRD (Custom Resource Definition) za Kubernetes. Z njegovo pomočjo lahko uporabimo novo entiteto: Rollout, ki upravlja blue-green in canary razmestitve z različnimi možnostmi konfiguracije.

Kontroler Argo Rollouts, ki ga uporablja prilagojeni vir Rollout, omogoča uporabo dodatnih strategij razmestitve, kot sta blue-green in canary za Kubernetes. Vir Rollout ponuja funkcionalnosti, ki so enakovredne Deployment, le s dodatnimi strategijami razmestitve.
Resource Razmestitve imajo dve strategiji za razmestitev: RollingUpdate in Recreate. Kljub temu, da ti strategiji ustrezata večini primerov, se za razmestitve na strežnike v zelo velikem obsegu uporabljajo dodatne strategije, kot sta blue-green ali canary, ki jih v kontrolerju Razmestitev ni. Da bi uporabniki lahko uporabili te strategije v Kubernetesu, so morali pisati skripte nad svojimi Razmestitvami. Kontroler Argo Rollouts te strategije predstavlja v obliki preprostih deklarativnih nastavljivih parametrov.
https://argoproj.github.io/argo-rollouts

Obstaja tudi Argo CI, ki ponuja prijazen spletni vmesnik, ki se uporablja skupaj z Rollouts, nanj se bomo osredotočili v naslednjem članku.

Namestitev Argo Rollouts

Na strani strežnika

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

V naši infrastrukturni repo (glej spodaj) smo že dodali install.yaml kot i/k8s/argo-rollouts/install.yaml. Tako ga bo GitlabCI namestil v grozd.

Na strani odjemalca (kubectl vtičnik)

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

Aplikacija za primer

Dobra praksa je imeti ločene repozitorije za kodo aplikacije in za infrastrukturo.

Repozitorij za aplikacijo

Kim Wuestkamp / k8s-deployment-example-app

To je zelo preprosta API na Python+Flask, ki vrača odgovor v obliki JSON. Pakirali bomo paket z uporabo GitlabCI in potisnili rezultat v Gitlab Registry. V registru imamo dve različni različici izdaj:

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

Edina razlitsa mezhdu nimi eto vozvrashayemyy JSON-fayl. My ispol'zuyem eto prilozhenie dlya maksimal'no prostoy vizualizatsii togo, s kakoy versiyey my obshchayemsya.

Infrastrukturnyy repozytoriy

V etom repozytorii my budem ispol'zovat' GitlabCI dlya deplaya v Kubernetes, .gitlab-ci.yml vyglyadit sleduyushchim obrazom:

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

Dlya ego zapuska samostoyatel'no vam poyavitsya klaster, mozhno ispol'zovat' Gcloud:

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

Vam nuzhno sdelat' fork https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure i sozdanie peremennoy KUBECONFIG v GitlabCI, kotoraya budet soderzhat' konfih dlya dostupa kubectl k vashim klasteru.

Tukaj mozhno pochitat' o tom, kak poluchit' uchetniye dannye dlya klastera (Gcloud).

Infrastrukturnyy Yaml

Vnutri infrastrukturnogo repozytoriy u nas est' 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

i 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 can be manually resumed by running `kubectl argo rollouts promote ROLLOUT`
     - pause: {}
     - setWeight: 50
     - pause: { duration: 120 } # two minutes

Rollout rabotayet tak zhe kak i Deployment. Esli my ne zadadem strategiyu obnovleniya (kak canary zdes'), on budet vestis' sebya kak defol'tnyy rolling-update Deployment.

My opredelyaem dva shaga v yaml dlya canary deployment:

  1. 10% trafik na canary (wait for manual OK)
  2. 50% trafik na canary (wait 2 minutes then continue to 100%)

Vypolnenie nachal'nogo depleya

Posle nachal'nogo depleya nashi resursy budut vyglyadit' tak:

Canary Deployment in Kubernetes #2: Argo Rollouts

I poluchayem otvet tol'ko ot pervoy versii prilozheniya:

Canary Deployment in Kubernetes #2: Argo Rollouts

Vypolnyaem Canary Deployment

Shag 1: 10% trafika

Chtoby nachat' canary razvertyvanie, nam prosto nuzhno izmenit' versiyu obraza, kak my obychno delayem s razvertyvaniyami:

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

I my pushim izmeneniya, poetomu Gitlab CI delayet deploy i my vidim izmeneniya:

Canary Deployment in Kubernetes #2: Argo Rollouts

Seichas esli my obratimsya k servisu:

Canary Deployment in Kubernetes #2: Argo Rollouts

Otlichno! My v seredine nashego canary deployment. My mozhem uvidet' progress, zapustiv:

kubectl argo rollouts get rollout rollout-canary

Canary Deployment in Kubernetes #2: Argo Rollouts

Korak 2: 50% prometa:

Sada prelazimo na sljedeći korak: preusmjeravanje 50% prometa. Postavili smo ga tako da se ovaj korak pokrene ručno:

kubectl argo rollouts promote rollout-canary # nastaviti na korak 2

Canary Deployment in Kubernetes #2: Argo Rollouts

I naša aplikacija je vratila 50% odgovora od novih verzija:

Canary Deployment in Kubernetes #2: Argo Rollouts

I pregled rollout-a:

Canary Deployment in Kubernetes #2: Argo Rollouts

Odlično.

Korak 3: 100% prometa:

Postavili smo ga tako da se nakon 2 minute korak s 50% automatski završava i pokreće se korak sa 100%:

Canary Deployment in Kubernetes #2: Argo Rollouts

I izlaz aplikacije:

Canary Deployment in Kubernetes #2: Argo Rollouts

I pregled rollout-a:

Canary Deployment in Kubernetes #2: Argo Rollouts

Canary deployment je završeno.

Još primjera s Argo Rollouts

Ovdje je još nekoliko primjera, na primjer, kako postaviti pregled okruženja i usporedbe temeljene na canary:

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

Video o Argo Rollouts i Argo CI

Zaista preporučujem ovaj video, prikazuje kako Argo Rollouts i Argo CI rade zajedno:

Predvajaj video

Zaključek

Sviđa mi se ideja korištenja CRD-ova koji upravljaju stvaranjem dodatnih tipova deploymenta ili replicaseta, preusmjeravaju promet itd. Rad s njima ide glatko. Sljedeće bih želio testirati integraciju s Argo CI.

Međutim, izgleda da dolazi veliko spajanje Argo CI i Flux CI, pa bih mogao pričekati da izađe nova verzija: Argo Flux.

Imate li iskustva s Argo Rollouts ili Argo CI?

Preberite tudi druge članke v našem blogu:

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster