Vendosja e Kanarinave në Kubernetes #2: Argo Rollouts

Ne do të përdorim kontrolluesin e vendosjes së Argo Rollouts të k8s dhe GitlabCI për të ekzekutuar vendosjet Canary në Kubernetes

Vendosja e Kanarinave në Kubernetes #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Artikuj në këtë seri

Vendosja e Kanarinave

Shpresojmë ta lexoni pjesa e pare, ku shpjeguam shkurtimisht se çfarë janë vendosjet e Kanarit. Ne treguam gjithashtu se si ta zbatojmë atë duke përdorur burimet standarde të Kubernetes.

Argo Rollouts

Argo Rollouts është një kontrollues vendas i vendosjes së Kubernetes. Ai siguron një CRD (Përkufizimi i Burimeve të Përshtatshme) për Kubernetes. Falë tij, ne mund të përdorim një entitet të ri: Rollout, i cili menaxhon vendosjet blu-jeshile dhe kanarinë me opsione të ndryshme konfigurimi.

Kontrolluesi Argo Rollouts përdoret nga një burim i personalizuar Rollout, Lejon strategji shtesë të vendosjes si blu-jeshile dhe kanarinë për Kubernetes. Burim Rollout ofron funksionalitet ekuivalent Deployment, vetëm me strategji shtesë të vendosjes.
burime Deployments ka dy strategji për vendosjen: RollingUpdate и Recreate. Edhe pse këto strategji janë të përshtatshme për shumicën e rasteve, për vendosje në serverë në një shkallë shumë të madhe, përdoren strategji shtesë, të tilla si blu-jeshile ose kanarinë, të cilat nuk janë të disponueshme në kontrolluesin Deployment. Për të përdorur këto strategji në Kubernetes, përdoruesit duhej të shkruanin skripta në krye të vendosjeve të tyre. Kontrolluesi Argo Rollouts i ekspozon këto strategji si parametra të thjeshtë, deklarativë dhe të konfigurueshëm.
https://argoproj.github.io/argo-rollouts

Ekziston gjithashtu Argo CI i cili ofron një ndërfaqe ueb miqësore për përdorim me Rollouts, ne do t'i hedhim një vështrim në artikullin vijues.

Instalimi i Argo Rollouts

Ana e serverit

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

Në rrepën tonë të infrastrukturës (shih më poshtë) ne kemi shtuar tashmë install.yaml si i/k8s/argo-rollouts/install.yaml. Në këtë mënyrë GitlabCI do ta instalojë atë në grup.

Ana e klientit (shtojca kubectl)

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

Shembull Aplikimi

Është praktikë e mirë që të ketë depo të veçanta për kodin e aplikacionit dhe infrastrukturën.

Depo për aplikacionin

Kim Wuestkamp/k8s-deployment-example-app

Ky është një API shumë i thjeshtë Python+Flask që kthen një përgjigje si JSON. Ne do të ndërtojmë paketën duke përdorur GitlabCI dhe do ta shtyjmë rezultatin në Regjistrin Gitlab. Në regjistër kemi dy versione të ndryshme të lëshimit:

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

Dallimi i vetëm midis tyre është skedari JSON i kthyer. Ne e përdorim këtë aplikacion për të vizualizuar sa më lehtë se me cilin version po komunikojmë.

Depoja e infrastrukturës

Në këtë depo ne do të përdorim GitlabCI për vendosjen në Kubernetes, .gitlab-ci.yml duket kështu:

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

Për ta ekzekutuar vetë do t'ju duhet një grup, mund të përdorni Gcloud:

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

Ju duhet të piruni https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure dhe krijoni një ndryshore KUBECONFIG në GitlabCI, i cili do të përmbajë konfigurimin për akses kubectl në grupin tuaj.

Këtu Mund të lexoni se si të merrni kredencialet për një grup (Gcloud).

Infrastruktura Yaml

Brenda depove të infrastrukturës kemi shërbim:

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

dhe 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 funksionon njësoj si Deployment. Nëse nuk caktojmë një strategji përditësimi (si kanarinë këtu) ajo do të sillet si vendosja e parazgjedhur e përditësimit të parazgjedhur.

Ne përcaktojmë dy hapa në yaml për vendosjen e kanarinës:

  1. 10% e trafikut në kanarinë (prit manualisht OK)
  2. 50% trafik në kanarinë (prit 2 minuta pastaj vazhdo në 100%)

Kryerja e vendosjes fillestare

Pas vendosjes fillestare, burimet tona do të duken kështu:

Vendosja e Kanarinave në Kubernetes #2: Argo Rollouts

Dhe marrim një përgjigje vetëm nga versioni i parë i aplikacionit:

Vendosja e Kanarinave në Kubernetes #2: Argo Rollouts

Kryerja e vendosjes së Kanarit

Hapi 1: 10% trafik

Për të filluar vendosjen e kanarinave, thjesht duhet të ndryshojmë versionin e imazhit siç bëjmë zakonisht me vendosjet:

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

Dhe ne shtyjmë ndryshimet, kështu që Gitlab CI vendoset dhe ne shohim ndryshimet:

Vendosja e Kanarinave në Kubernetes #2: Argo Rollouts

Tani nëse aksesojmë shërbimin:

Vendosja e Kanarinave në Kubernetes #2: Argo Rollouts

E shkëlqyeshme! Jemi në mes të vendosjes së kanarinave. Ne mund të shohim përparimin duke vrapuar:

kubectl argo rollouts get rollout rollout-canary

Vendosja e Kanarinave në Kubernetes #2: Argo Rollouts

Hapi 2: 50% trafik:

Tani le të kalojmë në hapin tjetër: ridrejtimi i 50% të trafikut. Ne e konfiguruam këtë hap që të ekzekutohet manualisht:

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

Vendosja e Kanarinave në Kubernetes #2: Argo Rollouts

Dhe aplikacioni ynë ktheu 50% të përgjigjeve nga versionet e reja:

Vendosja e Kanarinave në Kubernetes #2: Argo Rollouts

Dhe rishikimi i prezantimit:

Vendosja e Kanarinave në Kubernetes #2: Argo Rollouts

Prekrasno.

Hapi 3: 100% trafik:

E vendosëm në mënyrë që pas 2 minutash hapi 50% të përfundojë automatikisht dhe hapi 100% të fillojë:

Vendosja e Kanarinave në Kubernetes #2: Argo Rollouts

Dhe dalja e aplikacionit:

Vendosja e Kanarinave në Kubernetes #2: Argo Rollouts

Dhe rishikimi i prezantimit:

Vendosja e Kanarinave në Kubernetes #2: Argo Rollouts

Vendosja e Kanarinave ka përfunduar.

Më shumë shembuj me Argo Rollouts

Këtu ka më shumë shembuj, si për shembull se si të vendosni pamjet paraprake dhe krahasimet e mjedisit bazuar në kanarinë:

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

Video rreth Argo Rollouts dhe Argo CI

Unë me të vërtetë rekomandoj këtë video, ajo tregon se si Argo Rollouts dhe Argo CI punojnë së bashku:

Total

Më pëlqen shumë ideja e përdorimit të CRD-ve që menaxhojnë krijimin e llojeve shtesë të vendosjeve ose replikasetave, ridrejtimin e trafikut, etj. Puna me ta shkon pa probleme. Më pas do të doja të testoja integrimin me Argo CI.

Sidoqoftë, duket se do të ketë një bashkim të madh të Argo CI dhe Flux CI, kështu që mund të pres derisa të dalë publikimi i ri: Argo Flux.

A keni pasur ndonjë përvojë me Argo Rollouts ose Argo CI?

Lexoni gjithashtu artikuj të tjerë në blogun tonë:

Burimi: www.habr.com

Shto një koment