Canary Deployment v Kubernetes #2: Argo Rollouts

Budeme používat k8s-native ovladač nasazení Argo Rollouts a GitlabCI k spuštění Canary nasazení v Kubernetes

Canary Deployment v Kubernetes #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Články této série

Canary Deployment

Doufáme, že jste četli první část, kde jsme stručně vysvětlili, co jsou Canary nasazení. Také jsme ukázali, jak je implementovat pomocí standardních zdrojů Kubernetes.

Argo Rollouts

Argo Rollouts je Kubernetes-native ovladač nasazení. Poskytuje CRD (Custom Resource Definition) pro Kubernetes. Díky němu můžeme použít novou entitu: Rollout, která spravuje blue-green a canary nasazení s různými možnostmi nastavení.

Ovladač Argo Rollouts, který se používá pro vlastní zdroje Rollout, umožňuje používat další strategie nasazení, jako je blue-green a canary pro Kubernetes. Zdroj Rollout poskytuje funkcionalitu rovnocennou Nasazení, jen s dalšími strategiemi nasazení.
Zdrojem Nasazení má dvě strategie pro nasazení: RollingUpdate a Recreate. I když tyto strategie vyhovují většině případů, pro nasazení na servery v velmi velkém měřítku se používají další strategie, jako je blue-green nebo canary, které v Deployment ovladači nejsou. Aby uživatelé mohli tyto strategie v Kubernetes používat, museli psát skripty nad svými Deployments. Ovladač Argo Rollouts tyto strategie poskytuje ve formě jednoduchých deklarativních konfigurovatelných parametrů.
https://argoproj.github.io/argo-rollouts

Existuje také Argo CI, které poskytuje uživatelské rozhraní pro použití společně s Rollouts, na které se podíváme v dalším článku.

Instalace Argo Rollouts

Na straně serveru

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

V naší infrastrukturní repozitáři (viz níže) jsme již přidali install.yaml jako i/k8s/argo-rollouts/install.yaml. Takto GitlabCI nainstaluje do clustera.

Na straně klienta (kubectl plugin)

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

Ukázková aplikace

Dobrou praxí je mít oddělené repozitáře pro kód aplikace a pro infrastrukturu.

Repozitář pro aplikaci

Kim Wuestkamp / k8s-deployment-example-app

Je to velmi jednoduché API v Pythonu+Flask, které vrací odpověď ve formátu JSON. Sestavíme balíček pomocí GitlabCI a nahrajeme výsledek do Gitlab Registry. V registru máme dvě různé verze vydání:

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

Jediný rozdíl mezi nimi je vrácený JSON soubor. Používáme tuto aplikaci pro maximálně jednoduchou vizualizaci toho, s jakou verzí komunikujeme.

Infrastrukturní repozitář

V tomto repozitáři budeme používat GitlabCI pro nasazení do Kubernetes, soubor .gitlab-ci.yml vypadá 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

Pro jeho spuštění samostatně budete potřebovat cluster, můžete použít 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 udělat fork https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure a vytvořit proměnnou KUBECONFIG v GitlabCI, která bude obsahovat konfiguraci pro přístup kubectl k vašemu clusteru.

Zde Můžete si přečíst, jak získat přihlašovací údaje pro cluster (Gcloud).

Infrastrukturní Yaml

Uvnitř infrastrukturního repozitáře 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 can be manually resumed by running `kubectl argo rollouts promote ROLLOUT`
     - pause: {}
     - setWeight: 50
     - pause: { duration: 120 } # dvě minuty

Rollout funguje stejně jako Deployment. Pokud nenastavíme strategii aktualizace (jako je canary zde), bude se chovat jako defaultní rolling-update Deployment.

Definujeme dva kroky v yaml pro canary deployment:

  1. 10% provozu na canary (čekat na manuální souhlas)
  2. 50% provozu na canary (čekat 2 minuty a pak pokračovat na 100%)

Provádění počátečního nasazení

Po počátečním nasazení budou naše zdroje vypadat takto:

Canary Deployment v Kubernetes #2: Argo Rollouts

A získáváme odpověď pouze od první verze aplikace:

Canary Deployment v Kubernetes #2: Argo Rollouts

Provádíme Canary Deployment

Krok 1: 10% provozu

Abychom začali canary nasazení, stačí změnit verzi obrázku, jak to obvykle děláme s nasazeními:

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 my pushujeme změny, takže Gitlab CI provede nasazení a vidíme změny:

Canary Deployment v Kubernetes #2: Argo Rollouts

Nyní pokud se obrátíme na službu:

Canary Deployment v Kubernetes #2: Argo Rollouts

Skvěle! Jsme uprostřed našeho canary nasazení. Můžeme vidět postup spuštěním:

kubectl argo rollouts get rollout rollout-canary

Canary Deployment v Kubernetes #2: Argo Rollouts

Krok 2: 50% provozu:

Nyní přistupujeme k dalšímu kroku: přesměrování 50% provozu. Tento krok jsme nastavili tak, aby byl spuštěn ručně:

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

Canary Deployment v Kubernetes #2: Argo Rollouts

A naše aplikace vrátila 50% odpovědí od nových verzí:

Canary Deployment v Kubernetes #2: Argo Rollouts

A přehled rollout:

Canary Deployment v Kubernetes #2: Argo Rollouts

Skvělé.

Krok 3: 100% provozu:

Nastavili jsme to tak, aby po 2 minutách krok s 50% automaticky skončil a spustil se krok se 100%:

Canary Deployment v Kubernetes #2: Argo Rollouts

A výstup aplikace:

Canary Deployment v Kubernetes #2: Argo Rollouts

A přehled rollout:

Canary Deployment v Kubernetes #2: Argo Rollouts

Canary nasazení bylo dokončeno.

Další příklady s Argo Rollouts

Zde jsou další příklady, například jak nastavit předběžný náhled prostředí a porovnání založená na canary:

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

Video o Argo Rollouts a Argo CI

Opravdu doporučuji toto video, ukazuje, jak Argo Rollouts a Argo CI fungují dohromady:

Přehrát video

Výsledek

Opravuji se mi myšlenka používání CRD, které řídí vytváření dalších typů nasazení nebo replicasets, přesměrování provozu atd. Práce s nimi probíhá hladce. Dále bych rád otestoval integraci s Argo CI.

Nicméně se zdá, že se blíží velké sloučení Argo CI a Flux CI, takže bych mohl počkat, až vyjde nová verze: Argo Flux.

Máte zkušenosti s Argo Rollouts nebo Argo CI?

Také si přečtěte další články na našem blogu:

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster