Canary Deployment v Kubernetes #2: Argo Rollouts

Ke spuštění nasazení Canary na Kubernetes použijeme nativní řadič nasazení Argo Rollouts k8s a GitlabCI

Canary Deployment v Kubernetes #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Články v této sérii

Kanárské nasazení

Doufáme, že čtete první díl, kde jsme si krátce vysvětlili, co to Canary Deployments jsou. Ukázali jsme také, jak jej implementovat pomocí standardních zdrojů Kubernetes.

Zavádění Argo

Argo Rollouts je nativní řadič nasazení Kubernetes. Poskytuje CRD (Custom Resource Definition) pro Kubernetes. Díky tomu můžeme použít novou entitu: Rollout, který spravuje modrozelená a kanárková nasazení s různými možnostmi konfigurace.

Řadič Argo Rollouts používaný vlastním zdrojem Rollout, Umožňuje další strategie nasazení, jako je modrozelená a kanárková pro Kubernetes. Zdroj Rollout poskytuje ekvivalentní funkčnost Deployment, pouze s dalšími strategiemi nasazení.
prostředky Deployments má dvě strategie nasazení: RollingUpdate и Recreate. Ačkoli jsou tyto strategie vhodné pro většinu případů, pro nasazení na servery ve velmi velkém měřítku se používají další strategie, jako je modrozelená nebo kanárková, které nejsou k dispozici v řadiči nasazení. Aby uživatelé mohli používat tyto strategie v Kubernetes, museli psát skripty nad rámec svých nasazení. Argo Rollouts Controller odhaluje tyto strategie jako jednoduché, deklarativní a konfigurovatelné parametry.
https://argoproj.github.io/argo-rollouts

Existuje také Argo CI, které poskytuje pohodlné webové rozhraní pro použití s ​​Rollouts, na to se podíváme v příštím článku.

Instalace Argo Rollouts

Strana serveru

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

Do naší infrastruktury tuřín (viz níže) jsme již přidali install.yaml jako i/k8s/argo-rollouts/install.yaml. Tímto způsobem jej GitlabCI nainstaluje do clusteru.

Strana klienta (plugin kubectl)

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

Příklad aplikace

Je dobrou praxí mít oddělená úložiště pro aplikační kód a infrastrukturu.

Úložiště pro aplikaci

Kim Wuestkamp/k8s-deployment-example-app

Toto je velmi jednoduché Python+Flask API, které vrací odpověď jako JSON. Balíček vytvoříme pomocí GitlabCI a výsledek pošleme do registru Gitlab. 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ý soubor JSON. Tuto aplikaci používáme k co nejjednodušší vizualizaci, se kterou verzí komunikujeme.

Infrastrukturní úložiště

V tomto úložišti použijeme GitlabCI pro nasazení do Kubernetes, .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

Chcete-li jej spustit sami, 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 se rozdělit 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 do vašeho clusteru.

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

Infrastruktura Yaml

Uvnitř úložiště infrastruktury 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 stejně jako Deployment. Pokud nenastavíme strategii aktualizace (jako zde kanár), bude se chovat jako výchozí nasazení rolling-update.

Definujeme dva kroky v yaml pro nasazení canary:

  1. 10 % provozu na Kanárské ostrovy (počkej na manuální OK)
  2. 50% provoz na Kanárské ostrovy (počkejte 2 minuty a poté pokračujte na 100%)

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

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

Canary Deployment v Kubernetes #2: Argo Rollouts

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

Canary Deployment v Kubernetes #2: Argo Rollouts

Provádění Canary Deployment

Krok 1: 10% provoz

Chcete-li zahájit nasazení canary, stačí změnit verzi obrázku, jak to obvykle děláme u nasazení:

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 prosazujeme změny, takže Gitlab CI se nasadí a vidíme změny:

Canary Deployment v Kubernetes #2: Argo Rollouts

Nyní, pokud přistupujeme ke službě:

Canary Deployment v Kubernetes #2: Argo Rollouts

Skvělý! Jsme uprostřed našeho kanárského nasazení. Pokrok můžeme vidět spuštěním:

kubectl argo rollouts get rollout rollout-canary

Canary Deployment v Kubernetes #2: Argo Rollouts

Krok 2: 50% návštěvnost:

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

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

Canary Deployment v Kubernetes #2: Argo Rollouts

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

Canary Deployment v Kubernetes #2: Argo Rollouts

A recenze vydání:

Canary Deployment v Kubernetes #2: Argo Rollouts

Báječné.

Krok 3: 100% návštěvnost:

Nastavili jsme to tak, že po 2 minutách se automaticky ukončí 50% krok a spustí se 100% krok:

Canary Deployment v Kubernetes #2: Argo Rollouts

A výstup aplikace:

Canary Deployment v Kubernetes #2: Argo Rollouts

A recenze vydání:

Canary Deployment v Kubernetes #2: Argo Rollouts

Rozmístění Canary je dokončeno.

Další příklady s Argo Rollouts

Zde je více příkladů, například jak nastavit náhledy prostředí a srovnání na základě kanárků:

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

Video o Argo Rollouts a Argo CI

Toto video opravdu doporučuji, ukazuje, jak Argo Rollouts a Argo CI spolupracují:

Celkový

Opravdu se mi líbí myšlenka použití CRD, která spravují vytváření dalších typů nasazení nebo replikací, přesměrování provozu atd. Práce s nimi jde hladce. Dále bych chtěl otestovat integraci s Argo CI.

Zdá se však, že se blíží velká fúze Argo CI a Flux CI, takže bych mohl počkat, až vyjde nová verze: Argo Flux.

Máte nějaké zkušenosti s Argo Rollouts nebo Argo CI?

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

Zdroj: www.habr.com

Přidat komentář