Canary Deployment sa Kubernetes #2: Argo Rollouts

Gagamitin namin ang k8s-native na Argo Rollouts deployment controller at GitlabCI para magpatakbo ng mga Canary deployment sa Kubernetes

Canary Deployment sa Kubernetes #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Mga artikulo sa seryeng ito

Pag-deploy ng Canary

Sana basahin niyo unang parte, kung saan maikli naming ipinaliwanag kung ano ang Canary Deployments. Ipinakita rin namin kung paano ito ipatupad gamit ang mga karaniwang mapagkukunan ng Kubernetes.

Argo Rollouts

Ang Argo Rollouts ay isang Kubernetes native deployment controller. Nagbibigay ito ng CRD (Custom Resource Definition) para sa Kubernetes. Salamat dito, maaari tayong gumamit ng bagong entity: Rollout, na namamahala sa mga blue-green at canary deployment na may iba't ibang opsyon sa configuration.

Argo Rollouts controller na ginagamit ng isang custom na mapagkukunan Rollout, Nagbibigay-daan para sa karagdagang mga diskarte sa pag-deploy tulad ng asul-berde at canary para sa Kubernetes. mapagkukunan Rollout nagbibigay ng katumbas ng functionality Deployment, na may mga karagdagang diskarte sa pag-deploy lamang.
mapagkukunan Deployments ay may dalawang estratehiya para sa pag-deploy: RollingUpdate ΠΈ Recreate. Bagama't angkop ang mga diskarteng ito para sa karamihan ng mga kaso, para sa pag-deploy sa mga server sa napakalaking sukat, ginagamit ang mga karagdagang diskarte, gaya ng asul-berde o canary, na hindi available sa Deployment controller. Para magamit ang mga diskarteng ito sa Kubernetes, kinailangan ng mga user na magsulat ng mga script sa ibabaw ng kanilang Mga Deployment. Inilalantad ng Argo Rollouts Controller ang mga diskarte na ito bilang simple, declarative, at configurable na mga parameter.
https://argoproj.github.io/argo-rollouts

Mayroon ding Argo CI, na nagbibigay ng maginhawang web interface para magamit sa Rollouts, titingnan natin iyon sa susunod na artikulo.

Pag-install ng Argo Rollouts

Sa panig ng server

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

Sa aming infrastructure turnip (tingnan sa ibaba) naidagdag na namin ang install.yaml bilang i/k8s/argo-rollouts/install.yaml. Sa ganitong paraan, mai-install ito ng GitlabCI sa cluster.

Gilid ng kliyente (kubectl plugin)

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

Halimbawa ng Aplikasyon

Magandang kasanayan na magkaroon ng hiwalay na mga repository para sa code ng aplikasyon at imprastraktura.

Imbakan para sa aplikasyon

Kim Wuestkamp/k8s-deployment-example-app

Ito ay isang napakasimpleng Python+Flask API na nagbabalik ng tugon bilang JSON. Bubuo kami ng package gamit ang GitlabCI at itulak ang resulta sa Gitlab Registry. Sa registry mayroon kaming dalawang magkaibang bersyon ng paglabas:

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

Ang tanging pagkakaiba sa pagitan nila ay ang JSON file na ibinalik. Ginagamit namin ang application na ito upang mailarawan nang madali hangga't maaari kung saang bersyon kami nakikipag-usap.

Imbakan ng imprastraktura

Sa repositoryong ito gagamitin namin ang GitlabCI para sa pag-deploy sa Kubernetes, ganito ang hitsura ng .gitlab-ci.yml:

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

Upang patakbuhin ito nang mag-isa, kakailanganin mo ng isang kumpol, maaari mong gamitin ang Gcloud:

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

Kailangan mong tinidor https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure at lumikha ng isang variable KUBECONFIG sa GitlabCI, na maglalaman ng config para sa pag-access kubectl sa iyong kumpol.

Dito Maaari mong basahin ang tungkol sa kung paano makakuha ng mga kredensyal para sa isang cluster (Gcloud).

Imprastraktura Yaml

Sa loob ng imbakan ng imprastraktura mayroon kaming serbisyo:

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

at 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 gumagana katulad ng Deployment. Kung hindi kami magtatakda ng diskarte sa pag-update (tulad ng canary dito) ito ay gagana tulad ng default na rolling-update Deployment.

Tinukoy namin ang dalawang hakbang sa yaml para sa pag-deploy ng canary:

  1. 10% ng trapiko sa canary (hintayin ang manual OK)
  2. 50% trapiko sa canary (maghintay ng 2 minuto pagkatapos ay magpatuloy sa 100%)

Nagsasagawa ng paunang pag-deploy

Pagkatapos ng paunang deployment, magiging ganito ang hitsura ng aming mga mapagkukunan:

Canary Deployment sa Kubernetes #2: Argo Rollouts

At nakakakuha lamang kami ng tugon mula sa unang bersyon ng application:

Canary Deployment sa Kubernetes #2: Argo Rollouts

Nagsasagawa ng Canary Deployment

Hakbang 1: 10% trapiko

Upang magsimula ng pag-deploy ng canary, kailangan lang naming baguhin ang bersyon ng imahe gaya ng karaniwan naming ginagawa sa mga deployment:

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

At itinutulak namin ang mga pagbabago, kaya nag-deploy ang Gitlab CI at nakita namin ang mga pagbabago:

Canary Deployment sa Kubernetes #2: Argo Rollouts

Ngayon kung i-access natin ang serbisyo:

Canary Deployment sa Kubernetes #2: Argo Rollouts

Malaki! Nasa kalagitnaan tayo ng deployment ng canary natin. Makikita natin ang pag-unlad sa pamamagitan ng pagtakbo:

kubectl argo rollouts get rollout rollout-canary

Canary Deployment sa Kubernetes #2: Argo Rollouts

Hakbang 2: 50% trapiko:

Ngayon ay lumipat tayo sa susunod na hakbang: pag-redirect ng 50% ng trapiko. Na-configure namin ang hakbang na ito upang patakbuhin nang manu-mano:

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

Canary Deployment sa Kubernetes #2: Argo Rollouts

At ibinalik ng aming application ang 50% ng mga tugon mula sa mga bagong bersyon:

Canary Deployment sa Kubernetes #2: Argo Rollouts

At pagsusuri sa paglulunsad:

Canary Deployment sa Kubernetes #2: Argo Rollouts

Kahanga-hanga.

Hakbang 3: 100% trapiko:

Ise-set up namin ito upang pagkatapos ng 2 minuto ang 50% na hakbang ay awtomatikong magtatapos at ang 100% na hakbang ay magsisimula:

Canary Deployment sa Kubernetes #2: Argo Rollouts

At ang output ng application:

Canary Deployment sa Kubernetes #2: Argo Rollouts

At pagsusuri sa paglulunsad:

Canary Deployment sa Kubernetes #2: Argo Rollouts

Kumpleto na ang pag-deploy ng Canary.

Higit pang mga halimbawa sa Argo Rollouts

Mayroong higit pang mga halimbawa dito, tulad ng kung paano mag-set up ng mga preview sa kapaligiran at paghahambing batay sa canary:

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

Video tungkol sa Argo Rollouts at Argo CI

Talagang inirerekomenda ko ang video na ito, ipinapakita nito kung paano nagtutulungan ang Argo Rollouts at Argo CI:

Kabuuan

Talagang gusto ko ang ideya ng paggamit ng mga CRD na namamahala sa paglikha ng mga karagdagang uri ng deployment o replicase, pag-redirect ng trapiko, atbp. Ang pakikipagtulungan sa kanila ay maayos. Susunod na gusto kong subukan ang pagsasama sa Argo CI.

Gayunpaman, mukhang may malaking merger ng Argo CI at Flux CI na paparating, kaya maaaring maghintay ako hanggang sa lumabas ang bagong release: Argo Flux.

Nagkaroon ka na ba ng anumang karanasan sa Argo Rollouts o Argo CI?

Basahin din ang iba pang mga artikulo sa aming blog:

Pinagmulan: www.habr.com

Magdagdag ng komento