Canary nasadenie v Kubernetes #2: Argo Rollouts

Budeme používať k8s-natívny kontrolér nasadenia Argo Rollouts a GitlabCI na spustenie Canary nasadenia v Kubernetes

Canary nasadenie v Kubernetes #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Články v tejto sérii

Canary nasadenie

Dúfame, že ste čítali prvú časť, kde sme stručne vysvetlili, čo sú Canary nasadenia. Taktiež sme ukázali, ako ich realizovať pomocou štandardných prostriedkov Kubernetes.

Argo Rollouts

Argo Rollouts je Kubernetes-natívny kontrolér nasadenia. Poskytuje CRD (Custom Resource Definition) pre Kubernetes. Vďaka nemu môžeme používať novú entitu: Rollout, ktorá spravuje blue-green a canary nasadenia s rôznymi možnosťami nastavenia.

Kontrolér Argo Rollouts, ktorý sa používa s vlastným zdrojom Rollout, umožňuje používať dodatočné stratégie nasadenia, ako sú blue-green a canary pre Kubernetes. Zdroje Rollout poskytuje funkcie rovnocenné Nasadenie, iba s dodatočnými stratégiami nasadenia.
Zásob Deployments má dve stratégie pre nasadenie: RollingUpdate a Recreate. Napriek tomu, že tieto stratégie sú vhodné pre väčšinu prípadov, pre nasadenia na serveroch v veľmi veľkom meradle sa používajú dodatočné stratégie, ako sú blue-green alebo canary, ktoré chýbajú v kontroléri Deployment. Aby mohli používatelia tieto stratégie v Kubernetes využiť, museli písanie skriptov nad svojimi nasadeniami. Kontrolér Argo Rollouts poskytuje tieto stratégie vo forme jednoduchých deklaratívnych prispôsobiteľných parametrov.
https://argoproj.github.io/argo-rollouts

Existuje tiež Argo CI, ktorý poskytuje používateľské webové rozhranie na použitie spolu s Rollouts, na ktoré sa pozrieme v nasledujúcom článku.

Inštalácia Argo Rollouts

Na strane servera

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

V našej infraštruktúrnej repozitári (pozri nižšie) sme už pridali install.yaml ako i/k8s/argo-rollouts/install.yaml. Takto GitlabCI ho nainštaluje do klastra.

Na strane klienta (kubectl plugin)

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

Príklad aplikácie

Dobrou praxou je mať oddelené repozitáre pre kód aplikácie a pre infraštruktúru.

Repozitár pre aplikáciu

Kim Wuestkamp / k8s-deployment-example-app

Je to veľmi jednoduché API na Python+Flask, ktoré vracia odpoveď vo forme JSON. Zostavíme balík pomocou GitlabCI a nahodíme výsledok do Gitlab Registry. V registri máme dve rôzne verzie vydaní:

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

Jediný rozdiel medzi nimi je vracaný JSON súbor. Používame túto aplikáciu na maximálne jednoduchú vizualizáciu toho, s ktorou verziou komunikujeme.

Infraštruktúrny repozitár

V tomto repozitári budeme používať GitlabCI na nasadenie do Kubernetes, .gitlab-ci.yml vyzerá nasledovne:

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

Na jeho spustenie potrebujete 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

Musíte si urobiť fork https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure a vytvoriť premennú KUBECONFIG v GitlabCI, ktorá bude obsahovať konfiguráciu na prístup kubectl k vášmu klastru.

Tu možete si prečítať, ako získať poverenia pre klaster (Gcloud).

Informačný Yaml

V infraštruktúrnom repozitári máme 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

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 môžu byť manuálne obnovené spustením `kubectl argo rollouts promote ROLLOUT`
     - pause: {}
     - setWeight: 50
     - pause: { duration: 120 } # dve minúty

Rollout funguje rovnako ako Deployment. Ak nenastavíme stratégiu aktualizácie (ako canary tu), bude sa správať ako predvolený rolling-update Deployment.

Definujeme dva kroky v yaml pre canary deployment:

  1. 10% prevádzky na canary (čakajte na manuálne OK)
  2. 50% prevádzky na canary (čakajte 2 minúty a potom pokračujte na 100%)

Realizácia počiatočného depozitu

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

Canary nasadenie v Kubernetes #2: Argo Rollouts

A dostávame odpoveď iba od prvej verzie aplikácie:

Canary nasadenie v Kubernetes #2: Argo Rollouts

Vykonávame Canary Deployment

Krok 1: 10% prevádzky

Aby sme začali canary nasadenie, musíme jednoducho zmeniť verziu obrazu, ako to zvyčajne robíme pri nasadeniach:

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 posielame zmeny, takže Gitlab CI robí nasadenie a vidíme zmeny:

Canary nasadenie v Kubernetes #2: Argo Rollouts

Teraz, ak sa obrátime na službu:

Canary nasadenie v Kubernetes #2: Argo Rollouts

Skvelé! Sme v strede nášho canary nasadenia. Môžeme vidieť pokrok, ak spustíme:

kubectl argo rollouts get rollout rollout-canary

Canary nasadenie v Kubernetes #2: Argo Rollouts

Krok 2: 50% prevádzky:

Teraz pristupujeme k ďalšiemu kroku: presmerovanie 50% prevádzky. Nastavili sme to tak, aby tento krok bol spustený manuálne:

kubectl argo rollouts promote rollout-canary # pokračovať na krok 2

Canary nasadenie v Kubernetes #2: Argo Rollouts

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

Canary nasadenie v Kubernetes #2: Argo Rollouts

A prehľad rollout:

Canary nasadenie v Kubernetes #2: Argo Rollouts

Výborne.

Krok 3: 100% prevádzky:

Nastavili sme to tak, aby po 2 minútach krok so 50% bol dokončený automaticky a spustený krok so 100%:

Canary nasadenie v Kubernetes #2: Argo Rollouts

A výstup aplikácie:

Canary nasadenie v Kubernetes #2: Argo Rollouts

A prehľad rollout:

Canary nasadenie v Kubernetes #2: Argo Rollouts

Canary deploy je dokončený.

Ďalšie príklady s Argo Rollouts

Tu sú ďalšie príklady, napríklad, ako nastaviť náhľad prostredia a porovnania založené na kanáli:

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

Video o Argo Rollouts a Argo CI

Oprávnene odporúčam toto video, ukazuje, ako Argo Rollouts a Argo CI spolupracujú:

Prehrajte video

Záver

Veľmi sa mi páči myšlienka využívania CRD, ktoré riadia vytváranie ďalších typov nasadení alebo replikovaných sad, presmerovávajú prevádzku atď. Práca s nimi prebieha hladko. Potom by som chcel otestovať integráciu s Argo CI.

Avšak, zdá sa, že sa blíži veľké zlúčenie Argo CI a Flux CI, takže by som mohol počkať, kým vyjde nový release: Argo Flux.

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

Čítajte tiež ďalšie články na našom blogu:

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster