Canary Deployment v Kubernetes #2: Argo Rollouts

Na spustenie nasadení Canary v Kubernetes použijeme natívny radič nasadenia Argo Rollouts k8s a GitlabCI

Canary Deployment v Kubernetes #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Články v tejto sérii

Kanárske nasadenie

Dúfame, že čítate prvá časť, kde sme si v krátkosti vysvetlili, čo sú to Canary Deployments. Ukázali sme tiež, ako to implementovať pomocou štandardných zdrojov Kubernetes.

Zavádzanie Argo

Argo Rollouts je natívny radič nasadenia Kubernetes. Poskytuje CRD (Custom Resource Definition) pre Kubernetes. Vďaka nej môžeme použiť novú entitu: Rollout, ktorý spravuje modro-zelené a kanárske nasadenie s rôznymi možnosťami konfigurácie.

Ovládač Argo Rollouts používaný vlastným zdrojom Rollout, Umožňuje ďalšie stratégie nasadenia, ako je modrozelená a kanáriková pre Kubernetes. Zdroj Rollout poskytuje ekvivalentnú funkčnosť Deploymentlen s dodatočnými stratégiami nasadenia.
prostriedky Deployments má dve stratégie nasadenia: RollingUpdate и Recreate. Aj keď sú tieto stratégie vhodné pre väčšinu prípadov, na nasadenie na servery vo veľmi veľkom meradle sa používajú ďalšie stratégie, ako napríklad modrozelená alebo kanáriková, ktoré nie sú dostupné v ovládači nasadenia. Na použitie týchto stratégií v Kubernetes museli používatelia písať skripty nad rámec svojich nasadení. Argo Rollouts Controller odhaľuje tieto stratégie ako jednoduché, deklaratívne, konfigurovateľné parametre.
https://argoproj.github.io/argo-rollouts

Existuje aj Argo CI, ktoré poskytuje pohodlné webové rozhranie na použitie s Rollouts, na to sa pozrieme v ďalšom článku.

Inštalácia Argo Rollouts

Strana servera

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

V našej infraštruktúre okrúhlice (pozri nižšie) sme už pridali install.yaml ako i/k8s/argo-rollouts/install.yaml. Týmto spôsobom ho GitlabCI nainštaluje do klastra.

Strana klienta (doplnok kubectl)

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

Príklad aplikácie

Je dobrou praxou mať oddelené úložiská pre aplikačný kód a infraštruktúru.

Úložisko pre aplikáciu

Kim Wuestkamp/k8s-deployment-example-app

Toto je veľmi jednoduché Python+Flask API, ktoré vracia odpoveď ako JSON. Balík vytvoríme pomocou GitlabCI a výsledok vložíme do registra Gitlab. V registri máme dve rôzne verzie vydania:

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

Jediný rozdiel medzi nimi je vrátený súbor JSON. Túto aplikáciu používame na čo najjednoduchšiu vizualizáciu, s ktorou verziou komunikujeme.

Úložisko infraštruktúry

V tomto úložisku použijeme GitlabCI na nasadenie do Kubernetes, .gitlab-ci.yml vyzerá takto:

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

Ak ho chcete spustiť sami, budete potrebovať klaster, môžete použiť Gcloud:

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

Potrebujete vidličku https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure a vytvorte premennú KUBECONFIG v GitlabCI, ktorý bude obsahovať konfiguráciu pre prístup kubectl do vášho klastra.

Tu Môžete si prečítať o tom, ako získať poverenia pre klaster (Gcloud).

Infraštruktúra Yaml

V rámci úložiska infraštruktúry máme službu:

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

a 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 funguje rovnako ako Deployment. Ak nenastavíme stratégiu aktualizácie (ako tu kanárik), bude sa správať ako predvolené nasadenie rolling-update.

Definujeme dva kroky v yaml pre nasadenie canary:

  1. 10 % premávky na Kanárske ostrovy (čakajte na manuálne OK)
  2. 50 % návštevnosť na Kanárske ostrovy (počkajte 2 minúty a potom pokračujte na 100 %)

Vykonávanie počiatočného nasadenia

Po počiatočnom nasadení budú naše zdroje vyzerať takto:

Canary Deployment v Kubernetes #2: Argo Rollouts

A dostávame odpoveď len z prvej verzie aplikácie:

Canary Deployment v Kubernetes #2: Argo Rollouts

Vykonávanie kanárskeho nasadenia

Krok 1: 10 % návštevnosť

Ak chcete spustiť nasadenie canary, stačí zmeniť verziu obrázka, ako to zvyčajne robíme pri nasadení:

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 posúvame zmeny, takže Gitlab CI sa nasadí a vidíme zmeny:

Canary Deployment v Kubernetes #2: Argo Rollouts

Teraz, ak pristúpime k službe:

Canary Deployment v Kubernetes #2: Argo Rollouts

Skvelé! Sme v polovici nášho kanárskeho nasadenia. Pokrok môžeme vidieť spustením:

kubectl argo rollouts get rollout rollout-canary

Canary Deployment v Kubernetes #2: Argo Rollouts

Krok 2: 50 % návštevnosť:

Teraz prejdime k ďalšiemu kroku: presmerovanie 50 % návštevnosti. Tento krok sme nakonfigurovali na manuálne spustenie:

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

Canary Deployment v Kubernetes #2: Argo Rollouts

A naša aplikácia vrátila 50 % odpovedí z nových verzií:

Canary Deployment v Kubernetes #2: Argo Rollouts

A recenzia uvedenia:

Canary Deployment v Kubernetes #2: Argo Rollouts

úžasné.

Krok 3: 100 % návštevnosť:

Nastavili sme to tak, že po 2 minútach sa automaticky ukončí 50% krok a spustí sa 100% krok:

Canary Deployment v Kubernetes #2: Argo Rollouts

A výstup aplikácie:

Canary Deployment v Kubernetes #2: Argo Rollouts

A recenzia uvedenia:

Canary Deployment v Kubernetes #2: Argo Rollouts

Nasadenie Canary je dokončené.

Viac príkladov s Argo Rollouts

Tu je viac príkladov, napríklad ako nastaviť náhľady a porovnania prostredia na základe kanárikov:

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

Video o Argo Rollouts a Argo CI

Toto video naozaj odporúčam, ukazuje, ako Argo Rollouts a Argo CI spolupracujú:

Celkový

Veľmi sa mi páči myšlienka používania CRD, ktoré riadia vytváranie ďalších typov nasadení alebo replikátov, presmerovanie prevádzky atď. Práca s nimi ide hladko. Ďalej by som chcel otestovať integráciu s Argo CI.

Zdá sa však, že prichádza veľká fúzia Argo CI a Flux CI, takže môžem počkať, kým vyjde nové vydanie: Argo Flux.

Máte nejaké skúsenosti s Argo Rollouts alebo Argo CI?

Prečítajte si aj ďalšie články na našom blogu:

Zdroj: hab.com

Pridať komentár