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

Články této série
- (Tento článek)
- Canary nasazení pomocí Istio
- Canary nasazení pomocí Jenkins-X Istio Flagger
Canary Deployment
Doufáme, že jste četli , 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. ZdrojRolloutposkytuje funkcionalitu rovnocennouNasazení, jen s dalšími strategiemi nasazení.
ZdrojemNasazenímá dvě strategie pro nasazení:RollingUpdateaRecreate. 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ů.
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)
Ukázková aplikace
Dobrou praxí je mít oddělené repozitáře pro kód aplikace a pro infrastrukturu.
Repozitář pro aplikaci
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:
- masterPro 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:80Musíte si udělat fork a vytvořit proměnnou KUBECONFIG v GitlabCI, která bude obsahovat konfiguraci pro přístup kubectl k vašemu clusteru.
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: LoadBalancera 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ě minutyRollout 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:
- 10% provozu na canary (čekat na manuální souhlas)
- 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:

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

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:

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

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

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

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

A přehled rollout:

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%:

A výstup aplikace:

A přehled rollout:

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:
Video o Argo Rollouts a Argo CI
Opravdu doporučuji toto video, ukazuje, jak Argo Rollouts a Argo CI fungují dohromady:

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