Budeme používať k8s-natívny kontrolér nasadenia Argo Rollouts a GitlabCI na spustenie Canary nasadenia v Kubernetes

Články v tejto sérii
- (Tento článok)
- Canary nasadenie pomocou Istio
- Canary nasadenie pomocou Jenkins-X Istio Flagger
Canary nasadenie
Dúfame, že ste čítali , kde sme stručne vysvetlili, čo sú Canary nasadenia. Taktiež sme ukázali, ako ich realizovať pomocou štandardných prostriedkov Kubernetes.
Argo Rollouts
Argo Rollouts je Kubernetes-natívny kontrolér nasadenia. Poskytuje CRD (Custom Resource Definition) pre Kubernetes. Vďaka nemu môžeme používať novú entitu: Rollout, ktorá spravuje blue-green a canary nasadenia s rôznymi možnosťami nastavenia.
Kontrolér Argo Rollouts, ktorý sa používa s vlastným zdrojom
Rollout,umožňuje používať dodatočné stratégie nasadenia, ako sú blue-green a canary pre Kubernetes. ZdrojeRolloutposkytuje funkcie rovnocennéNasadenie, iba s dodatočnými stratégiami nasadenia.
ZásobDeploymentsmá dve stratégie pre nasadenie:RollingUpdateaRecreate. Napriek tomu, že tieto stratégie sú vhodné pre väčšinu prípadov, pre nasadenia na serveroch v veľmi veľkom meradle sa používajú dodatočné stratégie, ako sú blue-green alebo canary, ktoré chýbajú v kontroléri Deployment. Aby mohli používatelia tieto stratégie v Kubernetes využiť, museli písanie skriptov nad svojimi nasadeniami. Kontrolér Argo Rollouts poskytuje tieto stratégie vo forme jednoduchých deklaratívnych prispôsobiteľných parametrov.
Existuje tiež Argo CI, ktorý poskytuje používateľské webové rozhranie na použitie spolu s Rollouts, na ktoré sa pozrieme v nasledujúcom článku.
Inštalácia Argo Rollouts
Na strane servera
kubectl create namespace argo-rollouts kubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml
V našej infraštruktúrnej repozitári (pozri nižšie) sme už pridali install.yaml ako i/k8s/argo-rollouts/install.yaml. Takto GitlabCI ho nainštaluje do klastra.
Na strane klienta (kubectl plugin)
Príklad aplikácie
Dobrou praxou je mať oddelené repozitáre pre kód aplikácie a pre infraštruktúru.
Repozitár pre aplikáciu
Je to veľmi jednoduché API na Python+Flask, ktoré vracia odpoveď vo forme JSON. Zostavíme balík pomocou GitlabCI a nahodíme výsledok do Gitlab Registry. V registri máme dve rôzne verzie vydaní:
- wuestkamp/k8s-deployment-example-app:v1
- wuestkamp/k8s-deployment-example-app:v2
Jediný rozdiel medzi nimi je vracaný JSON súbor. Používame túto aplikáciu na maximálne jednoduchú vizualizáciu toho, s ktorou verziou komunikujeme.
Infraštruktúrny repozitár
V tomto repozitári budeme používať GitlabCI na nasadenie do Kubernetes, .gitlab-ci.yml vyzerá nasledovne:
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:
- masterNa jeho spustenie potrebujete klaster, môžete použiť 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 urobiť fork a vytvoriť premennú KUBECONFIG v GitlabCI, ktorá bude obsahovať konfiguráciu na prístup kubectl k vášmu klastru.
možete si prečítať, ako získať poverenia pre klaster (Gcloud).
Informačný Yaml
V infraštruktúrnom repozitári 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 môžu byť manuálne obnovené spustením `kubectl argo rollouts promote ROLLOUT`
- pause: {}
- setWeight: 50
- pause: { duration: 120 } # dve minútyRollout funguje rovnako ako Deployment. Ak nenastavíme stratégiu aktualizácie (ako canary tu), bude sa správať ako predvolený rolling-update Deployment.
Definujeme dva kroky v yaml pre canary deployment:
- 10% prevádzky na canary (čakajte na manuálne OK)
- 50% prevádzky na canary (čakajte 2 minúty a potom pokračujte na 100%)
Realizácia počiatočného depozitu
Po počiatočnom nasadení naše zdroje budú vyzerať takto:

A dostávame odpoveď iba od prvej verzie aplikácie:

Vykonávame Canary Deployment
Krok 1: 10% prevádzky
Aby sme začali canary nasadenie, musíme jednoducho zmeniť verziu obrazu, ako to zvyčajne robíme pri nasadeniach:
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 posielame zmeny, takže Gitlab CI robí nasadenie a vidíme zmeny:

Teraz, ak sa obrátime na službu:

Skvelé! Sme v strede nášho canary nasadenia. Môžeme vidieť pokrok, ak spustíme:
kubectl argo rollouts get rollout rollout-canary

Krok 2: 50% prevádzky:
Teraz pristupujeme k ďalšiemu kroku: presmerovanie 50% prevádzky. Nastavili sme to tak, aby tento krok bol spustený manuálne:
kubectl argo rollouts promote rollout-canary # pokračovať na krok 2

A naša aplikácia vrátila 50% odpovedí od nových verzií:

A prehľad rollout:

Výborne.
Krok 3: 100% prevádzky:
Nastavili sme to tak, aby po 2 minútach krok so 50% bol dokončený automaticky a spustený krok so 100%:

A výstup aplikácie:

A prehľad rollout:

Canary deploy je dokončený.
Ďalšie príklady s Argo Rollouts
Tu sú ďalšie príklady, napríklad, ako nastaviť náhľad prostredia a porovnania založené na kanáli:
Video o Argo Rollouts a Argo CI
Oprávnene odporúčam toto video, ukazuje, ako Argo Rollouts a Argo CI spolupracujú:

Záver
Veľmi sa mi páči myšlienka využívania CRD, ktoré riadia vytváranie ďalších typov nasadení alebo replikovaných sad, presmerovávajú prevádzku atď. Práca s nimi prebieha hladko. Potom by som chcel otestovať integráciu s Argo CI.
Avšak, zdá sa, že sa blíži veľké zlúčenie Argo CI a Flux CI, takže by som mohol počkať, kým vyjde nový release: .
Máte skúsenosti s Argo Rollouts alebo Argo CI?
Čítajte tiež ďalšie články na našom blogu:
Zdroj: habr.com
