Bicihkirina Kanarya li Kubernetes #2: Argo Rollouts

Em ê k8s-a xwecî-kXNUMXs-kontrolkerê bicihkirina Argo Rollouts û GitlabCI bikar bînin da ku veguheztinên Canary li Kubernetes bimeşînin.

Bicihkirina Kanarya li Kubernetes #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Gotarên vê rêzê

Bicihkirina Kanarya

Em hêvî dikin ku hûn bixwînin beşa yekem, ku me bi kurtî rave kir ka Dabeşkirinên Canary çi ne. Me her weha destnîşan kir ka meriv wê çawa bi karanîna çavkaniyên standard Kubernetes bicîh tîne.

Argo Rollouts

Argo Rollouts kontrolkerek danûstendina xwecî ya Kubernetes e. Ew ji bo Kubernetes CRD (Pênase Çavkaniya Xweser) peyda dike. Bi saya wê, em dikarin saziyek nû bikar bînin: Rollout, ku bi vebijarkên cihêreng veavakirinê ve birêkûpêkkirina şîn-kesk û kanariyê birêve dibe.

Kontrolkerê Argo Rollouts ji hêla çavkaniyek xwerû ve tê bikar anîn Rollout, Ji bo Kubernetes-ê rê dide stratejiyên bicîhkirina zêde yên wekî şîn-kesk û canary. Kanî Rollout fonksiyonek wekhev peyda dike Deployment, tenê bi stratejiyên veqetandina zêde.
çavkaniyê binirxîne Deployments du stratejiyên ji bo belavkirinê hene: RollingUpdate и Recreate. Her çend ev stratejî ji bo pir rewşan maqûl in, ji bo bicîhkirina pêşkêşkeran di astek pir mezin de, stratejiyên din têne bikar anîn, wek şîn-kesk an kanarya, ku di kontrolkera Deployment de tune ne. Ji bo ku van stratejiyan li Kubernetes bikar bînin, bikarhêner neçar bûn ku li ser Dabeşkirinên xwe skrîptan binivîsin. Kontrolkerê Argo Rollouts van stratejiyan wekî pîvanên hêsan, daxuyandî, mîhengbar derdixe holê.
https://argoproj.github.io/argo-rollouts

Di heman demê de Argo CI jî heye, ku ji bo karanîna bi Rollouts re navbeynkariyek webê ya hêsan peyda dike, em ê di gotara pêş de li wê mêze bikin.

Sazkirina Argo Rollouts

Server Side

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

Di zincîreya binesaziya me de (li jêr binêre) me berê install.yaml wekî i/k8s/argo-rollouts/install.yaml zêde kiriye. Bi vî rengî GitlabCI dê wê di komê de saz bike.

Aliyê xerîdar (pêveka kubectl)

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

Serlêdana Mînak

Pratîkek baş e ku ji bo koda serîlêdanê û binesaziyê depoyên cihêreng hebin.

Depoya ji bo serîlêdanê

Kim Wuestkamp/k8s-deployment-example-app

Ev Python + Flask API-ya pir hêsan e ku bersivek wekî JSON vedigerîne. Em ê pakêtê bi karanîna GitlabCI ava bikin û encamê berbi Registry Gitlab vekin. Di qeydê de du guhertoyên cûda yên berdanê hene:

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

Cûdahiya di navbera wan de tenê pelê JSON vegerî ye. Em vê serîlêdanê bikar tînin da ku bi hêsanî bi kîjan guhertoya ku em pê re têkilî daynin xuyang bikin.

Depoya binesaziyê

Di vê depoyê de em ê GitlabCI-ê ji bo bicihkirina Kubernetes bikar bînin, .gitlab-ci.yml wiha xuya dike:

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

Ji bo ku hûn wê bixwe bimeşînin, hûn ê hewceyê komekê bin, hûn dikarin Gcloud bikar bînin:

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

Pêdivî ye ku hûn bişkînin https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure û guherbarekê biafirîne KUBECONFIG di GitlabCI de, ku dê veavakirina ji bo gihîştinê hebe kubectl ji koma xwe re.

Ev e Hûn dikarin li ser ka meriv çawa pêbaweriyên ji bo komek (Gcloud) bistîne bixwînin.

Binesaziya Yaml

Di hundurê depoya binesaziyê de karûbarê me heye:

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

and 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 heman wekî Deployment dixebite. Ger em stratejiyek nûvekirinê saz nekin (mîna kanarya li vir) ew ê mîna Dabeşkirina nûvekirina nûvekirî ya xwerû tevbigere.

Em du gavan di yaml de ji bo bicîhkirina canary diyar dikin:

  1. 10% seyrûsefera kanariyê (li benda OK bi destan bisekinin)
  2. 50% seyrûsefera kanariyê (2 hûrdeman bisekinin paşê heya 100% bidomînin)

Bicihkirina destpêkê

Piştî belavkirina destpêkê, çavkaniyên me dê bi vî rengî xuya bikin:

Bicihkirina Kanarya li Kubernetes #2: Argo Rollouts

Û em bersivek tenê ji guhertoya yekem a serîlêdanê digirin:

Bicihkirina Kanarya li Kubernetes #2: Argo Rollouts

Bicihkirina Kanaryayê pêk tîne

Gav 1: 10% trafîkê

Ji bo ku em dest bi danîna kanariyê bikin, em tenê hewce ne ku guhertoya wêneyê biguhezînin wekî ku em bi gelemperî bi belavkirinan re dikin:

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

Û em guhertinan dişoxilînin, ji ber vê yekê Gitlab CI bicîh dike û em guhertinan dibînin:

Bicihkirina Kanarya li Kubernetes #2: Argo Rollouts

Naha heke em bigihîjin karûbarê:

Bicihkirina Kanarya li Kubernetes #2: Argo Rollouts

Ecêb! Em di nîvê şandina kanaran de ne. Em dikarin bi rêveçûna pêşveçûnê bibînin:

kubectl argo rollouts get rollout rollout-canary

Bicihkirina Kanarya li Kubernetes #2: Argo Rollouts

Gav 2: 50% trafîkê:

Naha em biçin gavê din: 50% ji seyrûseferê beralî bikin. Me ev gav mîheng kir ku bi destan were xebitandin:

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

Bicihkirina Kanarya li Kubernetes #2: Argo Rollouts

Û serîlêdana me 50% ji bersivên ji guhertoyên nû vegerandin:

Bicihkirina Kanarya li Kubernetes #2: Argo Rollouts

Û vekolîna serîlêdanê:

Bicihkirina Kanarya li Kubernetes #2: Argo Rollouts

Pirxweş.

Gav 3: 100% trafîkê:

Me wiya saz kir ku piştî 2 hûrdem gava 50% bixweber biqede û gava 100% dest pê bike:

Bicihkirina Kanarya li Kubernetes #2: Argo Rollouts

Û hilberîna serîlêdanê:

Bicihkirina Kanarya li Kubernetes #2: Argo Rollouts

Û vekolîna serîlêdanê:

Bicihkirina Kanarya li Kubernetes #2: Argo Rollouts

Bicihkirina Kanarya qediya.

Nimûneyên bêtir bi Argo Rollouts re

Li vir mînakên zêdetir hene, wek mînak meriv çawa pêşdîtinên jîngehê û berhevokên li ser bingeha kanarya têne saz kirin:

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

Vîdyo di derbarê Argo Rollouts û Argo CI de

Ez bi rastî vê vîdyoyê pêşniyar dikim, ew destnîşan dike ka Argo Rollouts û Argo CI çawa bi hev re dixebitin:

Encam

Ez bi rastî ji ramana karanîna CRD-ên ku çêkirina cûreyên pêvekirî an berhevokan, rêvekirina seyrûseferê, hwd birêve dibin, hez dikim. Karkirina bi wan re bi hêsanî derbas dibe. Dûv re ez dixwazim entegrasyonê bi Argo CI re biceribînim.

Lêbelê, dixuye ku yekbûnek mezin a Argo CI û Flux CI tê, ji ber vê yekê ez dikarim li bendê bim heya ku serbestberdana nû derkeve: Argo Flux.

Ma bi Argo Rollouts an Argo CI re ezmûnek we heye?

Her weha gotarên din ên li ser bloga me bixwînin:

Source: www.habr.com

Add a comment