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

Články v této sérii
- (Tento článek)
- Canary Deployment pomocí Istio
- Canary Deployment pomocí Jenkins-X Istio Flagger
Kanárské nasazení
Doufáme, že čtete , 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. ZdrojRolloutposkytuje ekvivalentní funkčnostDeployment, pouze s dalšími strategiemi nasazení.
prostředkyDeploymentsmá 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.
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)
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
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:
- masterChcete-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:80Musíte se rozdělit a vytvořit proměnnou KUBECONFIG v GitlabCI, který bude obsahovat konfiguraci pro přístup kubectl do vašeho clusteru.
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: 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 } # two minutesRollout 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:
- 10 % provozu na Kanárské ostrovy (počkej na manuální OK)
- 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:

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

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:

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

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

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

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

A recenze vydání:

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:

A výstup aplikace:

A recenze vydání:

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