Kanári bevetés a Kubernetesben #2: Argo Rollouts

A k8s-natív Argo Rollouts telepítési vezérlőt és a GitlabCI-t fogjuk használni a Canary-telepítések futtatásához Kubernetesen

Kanári bevetés a Kubernetesben #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Cikkek ebben a sorozatban

Kanári bevetés

Reméljük, olvassa első rész, ahol röviden elmagyaráztuk, mi is az a Canary Deployments. Megmutattuk azt is, hogyan kell megvalósítani szabványos Kubernetes-erőforrásokkal.

Argo Rollouts

Az Argo Rollouts a Kubernetes natív telepítési vezérlője. CRD-t (Custom Resource Definition) biztosít a Kubernetes számára. Ennek köszönhetően egy új entitást használhatunk: Rollout, amely különféle konfigurációs opciókkal kezeli a kék-zöld és a kanári telepítéseket.

Egyéni erőforrás által használt Argo Rollouts vezérlő Rollout, Lehetővé teszi további telepítési stratégiák alkalmazását, például a kék-zöld és a canary a Kubernetes számára. Forrás Rollout egyenértékű funkcionalitást biztosít Deployment, csak további telepítési stratégiákkal.
forrás Deployments két stratégiája van a telepítéshez: RollingUpdate и Recreate. Bár ezek a stratégiák a legtöbb esetben megfelelőek, nagyon nagy léptékű kiszolgálókra történő telepítéshez, további stratégiákat használnak, például kék-zöld vagy kanári, amelyek nem érhetők el a telepítési vezérlőben. E stratégiák Kubernetesben való használatához a felhasználóknak szkripteket kellett írniuk a telepítéseik tetejére. Az Argo Rollouts Controller ezeket a stratégiákat egyszerű, deklaratív, konfigurálható paraméterekként jeleníti meg.
https://argoproj.github.io/argo-rollouts

Létezik továbbá az Argo CI is, amely kényelmes webes felületet biztosít a Rollouts használatához, ezt a következő cikkben nézzük meg.

Az Argo Rollouts telepítése

Szerver oldal

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

Infrastruktúra-répa (lásd alább) már hozzáadtuk az install.yaml fájlt i/k8s/argo-rollouts/install.yaml néven. Így a GitlabCI telepíti a fürtbe.

Kliens oldal (kubectl beépülő modul)

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

Példa alkalmazás

Jó gyakorlat, ha az alkalmazáskódhoz és az infrastruktúrához külön tárolók vannak.

Az alkalmazás tárháza

Kim Wuestkamp/k8s-deployment-example-app

Ez egy nagyon egyszerű Python+Flask API, amely JSON-ként ad vissza választ. A csomagot a GitlabCI segítségével készítjük, és az eredményt a Gitlab Registry-be küldjük. A rendszerleíró adatbázisban két különböző kiadási verzió található:

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

Az egyetlen különbség köztük a visszaadott JSON-fájl. Ezzel az alkalmazással a lehető legegyszerűbben vizualizáljuk, hogy melyik verzióval kommunikálunk.

Infrastruktúra adattár

Ebben a tárolóban a GitlabCI-t fogjuk használni a Kubernetes rendszerbe történő telepítéshez, a .gitlab-ci.yml így néz ki:

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

A saját maga futtatásához szüksége lesz egy fürtre, használhatja a Gcloudot:

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

El kell villázni https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure és hozzon létre egy változót KUBECONFIG a GitlabCI-ben, amely tartalmazza a hozzáféréshez szükséges konfigurációt kubectl a klaszteredhez.

Itt Itt olvashat arról, hogyan szerezhet be hitelesítési adatokat egy fürthöz (Gcloud).

Infrastruktúra Yaml

Az infrastruktúra-táron belül a következő szolgáltatásaink vannak:

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

és 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 ugyanúgy működik, mint a telepítés. Ha nem állítunk be frissítési stratégiát (mint itt a canary), az alapértelmezett gördülő frissítési telepítésként fog működni.

A yamlban két lépést határozunk meg a kanári telepítéshez:

  1. A kanári forgalom 10%-a (várja meg a kézi OK-t)
  2. 50%-os forgalom a kanári felé (várjon 2 percet, majd folytassa a 100%-ot)

Kezdeti telepítés végrehajtása

A kezdeti üzembe helyezés után erőforrásaink így fognak kinézni:

Kanári bevetés a Kubernetesben #2: Argo Rollouts

És csak az alkalmazás első verziójából kapunk választ:

Kanári bevetés a Kubernetesben #2: Argo Rollouts

Kanári bevetés végrehajtása

1. lépés: 10% forgalom

A Canary telepítés elindításához csak a képverziót kell módosítanunk, ahogy azt általában a telepítéseknél tesszük:

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

És mi nyomjuk a változtatásokat, így a Gitlab CI üzembe helyezi, és látjuk a változásokat:

Kanári bevetés a Kubernetesben #2: Argo Rollouts

Most, ha elérjük a szolgáltatást:

Kanári bevetés a Kubernetesben #2: Argo Rollouts

Nagy! Kanári bevetésünk közepén járunk. A fejlődést a következő futtatással láthatjuk:

kubectl argo rollouts get rollout rollout-canary

Kanári bevetés a Kubernetesben #2: Argo Rollouts

2. lépés: 50% forgalom:

Most térjünk át a következő lépésre: a forgalom 50%-ának átirányítása. Ezt a lépést úgy konfiguráltuk, hogy manuálisan futtassuk:

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

Kanári bevetés a Kubernetesben #2: Argo Rollouts

És az alkalmazásunk az új verziók válaszainak 50%-át adta vissza:

Kanári bevetés a Kubernetesben #2: Argo Rollouts

És a bevezetés áttekintése:

Kanári bevetés a Kubernetesben #2: Argo Rollouts

Csodálatos.

3. lépés: 100% forgalom:

Úgy állítottuk be, hogy 2 perc elteltével az 50%-os lépés automatikusan véget ér és a 100%-os lépés kezdődik:

Kanári bevetés a Kubernetesben #2: Argo Rollouts

És az alkalmazás kimenete:

Kanári bevetés a Kubernetesben #2: Argo Rollouts

És a bevezetés áttekintése:

Kanári bevetés a Kubernetesben #2: Argo Rollouts

A Kanári bevetés befejeződött.

További példák az Argo Rollouts-szal

További példák vannak itt, például a környezeti előnézetek és összehasonlítások beállítása Kanári alapján:

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

Videó az Argo Rolloutsról és az Argo CI-ről

Nagyon ajánlom ezt a videót, megmutatja, hogyan működik együtt az Argo Rollouts és az Argo CI:

Teljes

Nagyon szeretem a CRD-k használatát, amelyek további telepítési típusok vagy replikátumok létrehozását, a forgalom átirányítását stb. A velük való munka zökkenőmentesen megy. Ezután szeretném tesztelni az Argo CI-vel való integrációt.

Úgy tűnik azonban, hogy az Argo CI és a Flux CI egy nagy összeolvadás következik, így lehet, hogy megvárom az új kiadás megjelenését: Argo Flux.

Van tapasztalatod az Argo Rollouts vagy az Argo CI használatáról?

Olvassa el blogunk további cikkeit is:

Forrás: will.com

Hozzászólás