Uvedba Canary v Kubernetes #2: Uvedbe Argo

Uporabili bomo krmilnik uvajanja Argo Rollouts, ki izvira iz k8s, in GitlabCI za izvajanje uvajanj Canary v Kubernetes

Uvedba Canary v Kubernetes #2: Uvedbe Argo

https://unsplash.com/photos/V41PulGL1z0

Članki v tej seriji

Canary Deployment

Upamo, da berete prvi del, kjer smo na kratko razložili, kaj so Canary Deployments. Pokazali smo tudi, kako ga implementirati s standardnimi viri Kubernetes.

Argo Rollouts

Argo Rollouts je izvorni krmilnik za uvajanje Kubernetes. Zagotavlja CRD (definicija virov po meri) za Kubernetes. Zahvaljujoč temu lahko uporabimo novo entiteto: Rollout, ki upravlja modro-zelene in kanarčke uvedbe z različnimi konfiguracijskimi možnostmi.

Krmilnik Argo Rollouts, ki ga uporablja vir po meri Rollout, Omogoča dodatne strategije uvajanja, kot sta modro-zelena in kanarček za Kubernetes. Vir Rollout zagotavlja enakovredno funkcionalnost Deployment, samo z dodatnimi strategijami uvajanja.
vir Deployments ima dve strategiji za uvajanje: RollingUpdate и Recreate. Čeprav so te strategije primerne za večino primerov, se za uvajanje v strežnike v zelo velikem obsegu uporabljajo dodatne strategije, kot sta modro-zelena ali kanarčkova, ki nista na voljo v krmilniku razmestitve. Za uporabo teh strategij v Kubernetesu so morali uporabniki napisati skripte poleg svojih uvedb. Argo Rollouts Controller izpostavlja te strategije kot preproste, deklarativne, nastavljive parametre.
https://argoproj.github.io/argo-rollouts

Obstaja tudi Argo CI, ki ponuja priročen spletni vmesnik za uporabo z Rollouts, to si bomo ogledali v naslednjem članku.

Namestitev Argo Rollouts

Strežniška stran

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

V našo infrastrukturo (glejte spodaj) smo že dodali install.yaml kot i/k8s/argo-rollouts/install.yaml. Tako ga bo GitlabCI namestil v gručo.

Stran odjemalca (vtičnik kubectl)

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

Primer aplikacije

Dobra praksa je imeti ločena skladišča za aplikacijsko kodo in infrastrukturo.

Repozitorij za aplikacijo

Kim Wuestkamp/k8s-deployment-example-app

To je zelo preprost API Python+Flask, ki vrne odgovor kot JSON. Paket bomo zgradili z uporabo GitlabCI in rezultat potisnili v register Gitlab. V registru imamo dve različni različici izdaje:

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

Edina razlika med njima je vrnjena datoteka JSON. To aplikacijo uporabljamo za čim lažjo vizualizacijo, s katero različico komuniciramo.

Repozitorij infrastrukture

V tem repozitoriju bomo uporabili GitlabCI za uvajanje v Kubernetes, .gitlab-ci.yml je videti takole:

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

Če ga želite zagnati sami, potrebujete gručo, lahko uporabite Gcloud:

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

Morate vilice https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure in ustvarite spremenljivko KUBECONFIG v GitlabCI, ki bo vseboval konfiguracijo za dostop kubectl v vaš grozd.

Tukaj Preberete lahko o tem, kako pridobiti poverilnice za gručo (Gcloud).

Infrastruktura Yaml

Znotraj infrastrukturnega repozitorija imamo storitve:

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

in 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 deluje enako kot Deployment. Če ne nastavimo strategije posodabljanja (kot tukaj Canary), se bo obnašala kot privzeta uvedba tekočega posodabljanja.

V yamlu definiramo dva koraka za uvajanje kanarčka:

  1. 10 % prometa do kanarčka (počakajte na ročno OK)
  2. 50 % prometa do kanarčka (počakajte 2 minuti in nato nadaljujte do 100 %)

Izvajanje začetne uvedbe

Po začetni uvedbi bodo naši viri izgledali takole:

Uvedba Canary v Kubernetes #2: Uvedbe Argo

In dobimo odgovor samo iz prve različice aplikacije:

Uvedba Canary v Kubernetes #2: Uvedbe Argo

Izvajanje Canary Deployment

1. korak: 10 % prometa

Za začetek uvajanja kanarčka moramo le spremeniti slikovno različico, kot običajno počnemo pri uvajanjih:

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

In potiskamo spremembe, tako da se Gitlab CI uvede in vidimo spremembe:

Uvedba Canary v Kubernetes #2: Uvedbe Argo

Zdaj, če dostopamo do storitve:

Uvedba Canary v Kubernetes #2: Uvedbe Argo

Super! Smo sredi naše kanarčkove uvedbe. Napredek lahko vidimo tako, da zaženemo:

kubectl argo rollouts get rollout rollout-canary

Uvedba Canary v Kubernetes #2: Uvedbe Argo

2. korak: 50 % prometa:

Zdaj pa preidimo na naslednji korak: preusmeritev 50 % prometa. Ta korak smo konfigurirali za ročno izvajanje:

kubectl argo rollouts promote rollout-canary # continue to step 2

Uvedba Canary v Kubernetes #2: Uvedbe Argo

In naša aplikacija je vrnila 50% odgovorov iz novih različic:

Uvedba Canary v Kubernetes #2: Uvedbe Argo

In pregled uvajanja:

Uvedba Canary v Kubernetes #2: Uvedbe Argo

čudovito

3. korak: 100 % prometa:

Nastavili smo tako, da se po 2 minutah samodejno konča korak 50 % in začne korak 100 %:

Uvedba Canary v Kubernetes #2: Uvedbe Argo

In izhod aplikacije:

Uvedba Canary v Kubernetes #2: Uvedbe Argo

In pregled uvajanja:

Uvedba Canary v Kubernetes #2: Uvedbe Argo

Razporeditev Canary je končana.

Več primerov z Argo Rollouts

Tukaj je več primerov, na primer, kako nastaviti predogled okolja in primerjave na podlagi kanarčka:

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

Video o Argo Rollouts in Argo CI

Ta videoposnetek res priporočam, saj prikazuje, kako Argo Rollouts in Argo CI delujeta skupaj:

Skupaj

Resnično mi je všeč zamisel o uporabi CRD-jev, ki upravljajo ustvarjanje dodatnih vrst uvajanj ali replikasetov, preusmerjajo promet itd. Delo z njimi poteka gladko. Nato bi rad preizkusil integracijo z Argo CI.

Vendar se zdi, da prihaja velika združitev Argo CI in Flux CI, zato bom morda počakal, da izide nova izdaja: Argo Flux.

Ste imeli izkušnje z Argo Rollouts ali Argo CI?

Preberite tudi druge članke na našem blogu:

Vir: www.habr.com

Dodaj komentar