Uporabili bomo Argo Rollouts, Kubernetes-nativni kontroler za razmestitev, in GitlabCI za zagon Canary razmestitve v Kubernetesu

Članki tega cikla
- (Ta članek)
- Canary Razmestitev z uporabo Istio
- Canary Razmestitev z uporabo Jenkins-X Istio Flagger
Canary Deployment
Upamo, da ste prebrali , kjer smo na kratko razložili, kaj so Canary razmestitve. Prav tako smo prikazali, kako jih lahko izvedemo z uporabo standardnih virov Kubernetes.
Argo Rollouts
Argo Rollouts je Kubernetes-nativni kontroler za razmestitev. Ponuja CRD (Custom Resource Definition) za Kubernetes. Z njegovo pomočjo lahko uporabimo novo entiteto: Rollout, ki upravlja blue-green in canary razmestitve z različnimi možnostmi konfiguracije.
Kontroler Argo Rollouts, ki ga uporablja prilagojeni vir
Rollout,omogoča uporabo dodatnih strategij razmestitve, kot sta blue-green in canary za Kubernetes. VirRolloutponuja funkcionalnosti, ki so enakovredneDeployment, le s dodatnimi strategijami razmestitve.
ResourceRazmestitveimajo dve strategiji za razmestitev:RollingUpdateinRecreate. Kljub temu, da ti strategiji ustrezata večini primerov, se za razmestitve na strežnike v zelo velikem obsegu uporabljajo dodatne strategije, kot sta blue-green ali canary, ki jih v kontrolerju Razmestitev ni. Da bi uporabniki lahko uporabili te strategije v Kubernetesu, so morali pisati skripte nad svojimi Razmestitvami. Kontroler Argo Rollouts te strategije predstavlja v obliki preprostih deklarativnih nastavljivih parametrov.
Obstaja tudi Argo CI, ki ponuja prijazen spletni vmesnik, ki se uporablja skupaj z Rollouts, nanj se bomo osredotočili v naslednjem članku.
Namestitev Argo Rollouts
Na strani strežnika
kubectl create namespace argo-rollouts; kubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml
V naši infrastrukturni repo (glej spodaj) smo že dodali install.yaml kot i/k8s/argo-rollouts/install.yaml. Tako ga bo GitlabCI namestil v grozd.
Na strani odjemalca (kubectl vtičnik)
Aplikacija za primer
Dobra praksa je imeti ločene repozitorije za kodo aplikacije in za infrastrukturo.
Repozitorij za aplikacijo
To je zelo preprosta API na Python+Flask, ki vrača odgovor v obliki JSON. Pakirali bomo paket z uporabo GitlabCI in potisnili rezultat v Gitlab Registry. V registru imamo dve različni različici izdaj:
- wuestkamp/k8s-deployment-example-app:v1
- wuestkamp/k8s-deployment-example-app:v2
Edina razlitsa mezhdu nimi eto vozvrashayemyy JSON-fayl. My ispol'zuyem eto prilozhenie dlya maksimal'no prostoy vizualizatsii togo, s kakoy versiyey my obshchayemsya.
Infrastrukturnyy repozytoriy
V etom repozytorii my budem ispol'zovat' GitlabCI dlya deplaya v Kubernetes, .gitlab-ci.yml vyglyadit sleduyushchim obrazom:
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:
- masterDlya ego zapuska samostoyatel'no vam poyavitsya klaster, mozhno ispol'zovat' Gcloud:
gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80Vam nuzhno sdelat' fork i sozdanie peremennoy KUBECONFIG v GitlabCI, kotoraya budet soderzhat' konfih dlya dostupa kubectl k vashim klasteru.
mozhno pochitat' o tom, kak poluchit' uchetniye dannye dlya klastera (Gcloud).
Infrastrukturnyy Yaml
Vnutri infrastrukturnogo repozytoriy u nas est' service:
apiVersion: v1
kind: Service
metadata:
labels:
id: rollout-canary
name: app
spec:
ports:
- port: 80
protocol: TCP
targetPort: 5000
selector:
id: app
type: LoadBalanceri 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 rabotayet tak zhe kak i Deployment. Esli my ne zadadem strategiyu obnovleniya (kak canary zdes'), on budet vestis' sebya kak defol'tnyy rolling-update Deployment.
My opredelyaem dva shaga v yaml dlya canary deployment:
- 10% trafik na canary (wait for manual OK)
- 50% trafik na canary (wait 2 minutes then continue to 100%)
Vypolnenie nachal'nogo depleya
Posle nachal'nogo depleya nashi resursy budut vyglyadit' tak:

I poluchayem otvet tol'ko ot pervoy versii prilozheniya:

Vypolnyaem Canary Deployment
Shag 1: 10% trafika
Chtoby nachat' canary razvertyvanie, nam prosto nuzhno izmenit' versiyu obraza, kak my obychno delayem s razvertyvaniyami:
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
...I my pushim izmeneniya, poetomu Gitlab CI delayet deploy i my vidim izmeneniya:

Seichas esli my obratimsya k servisu:

Otlichno! My v seredine nashego canary deployment. My mozhem uvidet' progress, zapustiv:
kubectl argo rollouts get rollout rollout-canary

Korak 2: 50% prometa:
Sada prelazimo na sljedeći korak: preusmjeravanje 50% prometa. Postavili smo ga tako da se ovaj korak pokrene ručno:
kubectl argo rollouts promote rollout-canary # nastaviti na korak 2

I naša aplikacija je vratila 50% odgovora od novih verzija:

I pregled rollout-a:

Odlično.
Korak 3: 100% prometa:
Postavili smo ga tako da se nakon 2 minute korak s 50% automatski završava i pokreće se korak sa 100%:

I izlaz aplikacije:

I pregled rollout-a:

Canary deployment je završeno.
Još primjera s Argo Rollouts
Ovdje je još nekoliko primjera, na primjer, kako postaviti pregled okruženja i usporedbe temeljene na canary:
Video o Argo Rollouts i Argo CI
Zaista preporučujem ovaj video, prikazuje kako Argo Rollouts i Argo CI rade zajedno:

Zaključek
Sviđa mi se ideja korištenja CRD-ova koji upravljaju stvaranjem dodatnih tipova deploymenta ili replicaseta, preusmjeravaju promet itd. Rad s njima ide glatko. Sljedeće bih želio testirati integraciju s Argo CI.
Međutim, izgleda da dolazi veliko spajanje Argo CI i Flux CI, pa bih mogao pričekati da izađe nova verzija: .
Imate li iskustva s Argo Rollouts ili Argo CI?
Preberite tudi druge članke v našem blogu:
Izvor: habr.com
