Canary Deployment in Kubernetes #2: Argo Rollouts

Mir benotzen den k8s-gebiertegen Argo Rollouts Deployment Controller a GitlabCI fir Kanaresch Deployment op Kubernetes ze lafen

Canary Deployment in Kubernetes #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Artikelen an dëser Serie

Kanaresch Deployment

Mir hoffen Dir liest éischten Deel, wou mir kuerz erkläert hunn wat Canary Deployments sinn. Mir hunn och gewisen wéi een et mat Standard Kubernetes Ressourcen ëmsetzt.

Argo Rollouts

Argo Rollouts ass e Kubernetes native Deployment Controller. Et bitt eng CRD (Custom Resource Definition) fir Kubernetes. Dank et kënne mir eng nei Entitéit benotzen: Rollout, déi blo-gréng a kanaresch Deployementer mat verschiddene Konfiguratiounsoptiounen geréiert.

Argo Rollouts Controller benotzt vun enger personaliséierter Ressource Rollout, Erlaabt zousätzlech Deploymentstrategien wéi blo-gréng a Kanaresch fir Kubernetes. Ressource Rollout stellt Funktionalitéit gläichwäerteg Deployment, nëmme mat zousätzlech Deploymentstrategien.
Ressource Deployments huet zwou Strategien fir Deployment: RollingUpdate и Recreate. Obwuel dës Strategien fir déi meescht Fäll gëeegent sinn, fir Deployment op Serveren op enger ganz grousser Skala, ginn zousätzlech Strategien benotzt, wéi blo-gréng oder Kanaresch, déi net am Deployment Controller verfügbar sinn. Fir dës Strategien a Kubernetes ze benotzen, mussen d'Benotzer Skripte uewen op hiren Deployments schreiwen. Den Argo Rollouts Controller weist dës Strategien als einfach, deklarativ, konfiguréierbar Parameteren aus.
https://argoproj.github.io/argo-rollouts

Et gëtt och Argo CI, deen e prakteschen Webinterface ubitt fir mat Rollouts ze benotzen, mir kucken dat am nächsten Artikel.

Argo Rollouts installéieren

Server Säit

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

An eiser Infrastruktur turnip (kuckt hei ënnen) hu mir schonn install.yaml als i/k8s/argo-rollouts/install.yaml bäigefüügt. Dëse Wee wäert GitlabCI et an de Cluster installéieren.

Client Säit (kubectl Plugin)

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

Beispill Applikatioun

Et ass gutt Praxis separat Repositories fir Applikatiounscode an Infrastruktur ze hunn.

Repository fir d'Applikatioun

Kim Wuestkamp/k8s-deployment-example-app

Dëst ass eng ganz einfach Python + Flask API déi eng Äntwert als JSON zréckginn. Mir bauen de Package mat GitlabCI an dréckt d'Resultat op de Gitlab Registry. Am Registry hu mir zwou verschidde Verëffentlechungsversioune:

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

Deen eenzegen Ënnerscheed tëscht hinnen ass d'JSON Datei zréck. Mir benotzen dës Applikatioun fir sou einfach wéi méiglech ze visualiséieren mat wéi enger Versioun mir kommunizéieren.

Infrastruktur Repository

An dësem Repository benotze mir GitlabCI fir d'Deployment op Kubernetes, .gitlab-ci.yml gesäit esou aus:

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

Fir et selwer ze lafen braucht Dir e Cluster, Dir kënnt Gcloud benotzen:

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

Dir musst Gabel https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure a schafen eng Variabel KUBECONFIG an GitlabCI, déi d'Configuratioun fir Zougang enthält kubectl op Äre Stärekoup.

et ass Dir kënnt liesen iwwer wéi Dir Umeldungsinformatiounen fir e Cluster kritt (Gcloud).

Infrastruktur Yaml

Am Infrastrukturrepository hu mir 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

an 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 funktionnéiert d'selwecht wéi Deployment. Wa mir keng Updatestrategie setzen (wéi Kanaresch hei) wäert se sech behuelen wéi de Standard Rolling Update Deployment.

Mir definéieren zwee Schrëtt am Yaml fir Kanaresch Deployment:

  1. 10% vum Traffic op Kanaren (waart op manuell OK)
  2. 50% Traffic op Kanaresch (waart 2 Minutten a fuert weider op 100%)

Ausféieren initial Deployment

No der éischter Deployment wäerten eis Ressourcen esou ausgesinn:

Canary Deployment in Kubernetes #2: Argo Rollouts

A mir kréien eng Äntwert nëmmen aus der éischter Versioun vun der Applikatioun:

Canary Deployment in Kubernetes #2: Argo Rollouts

Kanaresch Deployment ausféieren

Schrëtt 1: 10% Verkéier

Fir e Kanaresch Deployment unzefänken, brauche mir just d'Bildversioun z'änneren wéi mir normalerweis mat Deployementer maachen:

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

A mir drécken Ännerungen, sou datt Gitlab CI deployéiert a mir gesinn d'Ännerungen:

Canary Deployment in Kubernetes #2: Argo Rollouts

Elo wa mir Zougang zum Service kréien:

Canary Deployment in Kubernetes #2: Argo Rollouts

Super! Mir sinn an der Mëtt vun eiser Kanaresch Deployment. Mir kënnen de Fortschrëtt gesinn andeems mir lafen:

kubectl argo rollouts get rollout rollout-canary

Canary Deployment in Kubernetes #2: Argo Rollouts

Schrëtt 2: 50% Traffic:

Loosst eis elo op de nächste Schrëtt weidergoen: 50% vum Traffic ëmgeleet. Mir hunn dëse Schrëtt konfiguréiert fir manuell ze lafen:

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

Canary Deployment in Kubernetes #2: Argo Rollouts

An eis Applikatioun huet 50% vun den Äntwerte vun neie Versiounen zréckginn:

Canary Deployment in Kubernetes #2: Argo Rollouts

A Rollout Bewäertung:

Canary Deployment in Kubernetes #2: Argo Rollouts

Wonnerbar.

Schrëtt 3: 100% Traffic:

Mir setzen et sou op, datt no 2 Minutten den 50% Schrëtt automatesch ophält an den 100% Schrëtt ufänkt:

Canary Deployment in Kubernetes #2: Argo Rollouts

An d'Applikatioun Output:

Canary Deployment in Kubernetes #2: Argo Rollouts

A Rollout Bewäertung:

Canary Deployment in Kubernetes #2: Argo Rollouts

Kanaresch Deployment ass fäerdeg.

Méi Beispiller mat Argo Rollouts

Et gi méi Beispiller hei, sou wéi d'Ëmfeldvirschau a Vergläicher op Basis vu Kanaresch opgeriicht ginn:

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

Video iwwer Argo Rollouts an Argo CI

Ech recommandéieren dëse Video wierklech, et weist wéi Argo Rollouts an Argo CI zesumme schaffen:

D 'Resultat

Ech hu wierklech gär d'Iddi fir CRDs ze benotzen déi d'Schafung vun zousätzlech Aarte vun Deployementer oder Replikasets verwalten, de Verkéier viruleeden, asw. Mat hinnen ze schaffen geet glat. Als nächst wëll ech d'Integratioun mam Argo CI testen.

Wéi och ëmmer, et schéngt eng grouss Fusioun vun Argo CI a Flux CI ze kommen, also kann ech waarden bis déi nei Verëffentlechung erauskënnt: Argo Flux.

Hutt Dir Erfahrung mat Argo Rollouts oder Argo CI?

Liest och aner Artikelen op eisem Blog:

Source: will.com

Setzt e Commentaire