Em ê k8s-a xwecî-kXNUMXs-kontrolkerê bicihkirina Argo Rollouts û GitlabCI bikar bînin da ku veguheztinên Canary li Kubernetes bimeşînin.

Gotarên vê rêzê
- (Ev gotar)
- Dabeşkirina Kanarya bi karanîna Istio
- Dabeşkirina Kanarya Jenkins-X Istio Flagger bikar tîne
Bicihkirina Kanarya
Em hêvî dikin ku hûn bixwînin , ku me bi kurtî rave kir ka Dabeşkirinên Canary çi ne. Me her weha destnîşan kir ka meriv wê çawa bi karanîna çavkaniyên standard Kubernetes bicîh tîne.
Argo Rollouts
Argo Rollouts kontrolkerek danûstendina xwecî ya Kubernetes e. Ew ji bo Kubernetes CRD (Pênase Çavkaniya Xweser) peyda dike. Bi saya wê, em dikarin saziyek nû bikar bînin: Rollout, ku bi vebijarkên cihêreng veavakirinê ve birêkûpêkkirina şîn-kesk û kanariyê birêve dibe.
Kontrolkerê Argo Rollouts ji hêla çavkaniyek xwerû ve tê bikar anîn
Rollout,Ji bo Kubernetes-ê rê dide stratejiyên bicîhkirina zêde yên wekî şîn-kesk û canary. KanîRolloutfonksiyonek wekhev peyda dikeDeployment, tenê bi stratejiyên veqetandina zêde.
çavkaniyê binirxîneDeploymentsdu stratejiyên ji bo belavkirinê hene:RollingUpdateиRecreate. Her çend ev stratejî ji bo pir rewşan maqûl in, ji bo bicîhkirina pêşkêşkeran di astek pir mezin de, stratejiyên din têne bikar anîn, wek şîn-kesk an kanarya, ku di kontrolkera Deployment de tune ne. Ji bo ku van stratejiyan li Kubernetes bikar bînin, bikarhêner neçar bûn ku li ser Dabeşkirinên xwe skrîptan binivîsin. Kontrolkerê Argo Rollouts van stratejiyan wekî pîvanên hêsan, daxuyandî, mîhengbar derdixe holê.
Di heman demê de Argo CI jî heye, ku ji bo karanîna bi Rollouts re navbeynkariyek webê ya hêsan peyda dike, em ê di gotara pêş de li wê mêze bikin.
Sazkirina Argo Rollouts
Server Side
kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml
Di zincîreya binesaziya me de (li jêr binêre) me berê install.yaml wekî i/k8s/argo-rollouts/install.yaml zêde kiriye. Bi vî rengî GitlabCI dê wê di komê de saz bike.
Aliyê xerîdar (pêveka kubectl)
Serlêdana Mînak
Pratîkek baş e ku ji bo koda serîlêdanê û binesaziyê depoyên cihêreng hebin.
Depoya ji bo serîlêdanê
Ev Python + Flask API-ya pir hêsan e ku bersivek wekî JSON vedigerîne. Em ê pakêtê bi karanîna GitlabCI ava bikin û encamê berbi Registry Gitlab vekin. Di qeydê de du guhertoyên cûda yên berdanê hene:
- wuestkamp/k8s-deployment-example-app:v1
- wuestkamp/k8s-deployment-example-app:v2
Cûdahiya di navbera wan de tenê pelê JSON vegerî ye. Em vê serîlêdanê bikar tînin da ku bi hêsanî bi kîjan guhertoya ku em pê re têkilî daynin xuyang bikin.
Depoya binesaziyê
Di vê depoyê de em ê GitlabCI-ê ji bo bicihkirina Kubernetes bikar bînin, .gitlab-ci.yml wiha xuya dike:
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:
- masterJi bo ku hûn wê bixwe bimeşînin, hûn ê hewceyê komekê bin, hûn dikarin Gcloud bikar bînin:
gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80Pêdivî ye ku hûn bişkînin û guherbarekê biafirîne KUBECONFIG di GitlabCI de, ku dê veavakirina ji bo gihîştinê hebe kubectl ji koma xwe re.
Hûn dikarin li ser ka meriv çawa pêbaweriyên ji bo komek (Gcloud) bistîne bixwînin.
Binesaziya Yaml
Di hundurê depoya binesaziyê de karûbarê me heye:
apiVersion: v1
kind: Service
metadata:
labels:
id: rollout-canary
name: app
spec:
ports:
- port: 80
protocol: TCP
targetPort: 5000
selector:
id: app
type: LoadBalancerand 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 heman wekî Deployment dixebite. Ger em stratejiyek nûvekirinê saz nekin (mîna kanarya li vir) ew ê mîna Dabeşkirina nûvekirina nûvekirî ya xwerû tevbigere.
Em du gavan di yaml de ji bo bicîhkirina canary diyar dikin:
- 10% seyrûsefera kanariyê (li benda OK bi destan bisekinin)
- 50% seyrûsefera kanariyê (2 hûrdeman bisekinin paşê heya 100% bidomînin)
Bicihkirina destpêkê
Piştî belavkirina destpêkê, çavkaniyên me dê bi vî rengî xuya bikin:

Û em bersivek tenê ji guhertoya yekem a serîlêdanê digirin:

Bicihkirina Kanaryayê pêk tîne
Gav 1: 10% trafîkê
Ji bo ku em dest bi danîna kanariyê bikin, em tenê hewce ne ku guhertoya wêneyê biguhezînin wekî ku em bi gelemperî bi belavkirinan re dikin:
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
...Û em guhertinan dişoxilînin, ji ber vê yekê Gitlab CI bicîh dike û em guhertinan dibînin:

Naha heke em bigihîjin karûbarê:

Ecêb! Em di nîvê şandina kanaran de ne. Em dikarin bi rêveçûna pêşveçûnê bibînin:
kubectl argo rollouts get rollout rollout-canary

Gav 2: 50% trafîkê:
Naha em biçin gavê din: 50% ji seyrûseferê beralî bikin. Me ev gav mîheng kir ku bi destan were xebitandin:
kubectl argo rollouts promote rollout-canary # continue to step 2

Û serîlêdana me 50% ji bersivên ji guhertoyên nû vegerandin:

Û vekolîna serîlêdanê:

Pirxweş.
Gav 3: 100% trafîkê:
Me wiya saz kir ku piştî 2 hûrdem gava 50% bixweber biqede û gava 100% dest pê bike:

Û hilberîna serîlêdanê:

Û vekolîna serîlêdanê:

Bicihkirina Kanarya qediya.
Nimûneyên bêtir bi Argo Rollouts re
Li vir mînakên zêdetir hene, wek mînak meriv çawa pêşdîtinên jîngehê û berhevokên li ser bingeha kanarya têne saz kirin:
Vîdyo di derbarê Argo Rollouts û Argo CI de
Ez bi rastî vê vîdyoyê pêşniyar dikim, ew destnîşan dike ka Argo Rollouts û Argo CI çawa bi hev re dixebitin:

Encam
Ez bi rastî ji ramana karanîna CRD-ên ku çêkirina cûreyên pêvekirî an berhevokan, rêvekirina seyrûseferê, hwd birêve dibin, hez dikim. Karkirina bi wan re bi hêsanî derbas dibe. Dûv re ez dixwazim entegrasyonê bi Argo CI re biceribînim.
Lêbelê, dixuye ku yekbûnek mezin a Argo CI û Flux CI tê, ji ber vê yekê ez dikarim li bendê bim heya ku serbestberdana nû derkeve: .
Ma bi Argo Rollouts an Argo CI re ezmûnek we heye?
Her weha gotarên din ên li ser bloga me bixwînin:
Source: www.habr.com
