Kanariar inplementazioa Kubernetes #2: Argo inplementazioak

k8s jatorrizko Argo Rollouts inplementazio kontrolatzailea eta GitlabCI erabiliko ditugu Kubernetesen Canary inplementazioak exekutatzeko.

Kanariar inplementazioa Kubernetes #2: Argo inplementazioak

https://unsplash.com/photos/V41PulGL1z0

Serie honetako artikuluak

Kanariarren hedapena

Irakurtzea espero dugu lehen zatia, non laburki azaldu genuen zer diren Canary Deployments. Kubernetes baliabide estandarrak erabiliz nola inplementatu ere erakutsi genuen.

Argo inplementazioak

Argo Rollouts Kubernetes jatorrizko inplementazio-kontrolatzailea da. CRD (Custom Resource Definition) bat eskaintzen du Kubernetesentzat. Horri esker, entitate berri bat erabil dezakegu: Rollout, urdin-berdeak eta kanariar inplementazioak kudeatzen dituena, hainbat konfigurazio aukerarekin.

Baliabide pertsonalizatu batek erabiltzen duen Argo Rollouts kontrolagailua Rollout, Kubernetesentzako inplementazio-estrategia gehigarriak egiteko aukera ematen du, hala nola, urdin-berdea eta kanaria. Baliabidea Rollout funtzionalitate baliokidea eskaintzen du Deployment, inplementazio estrategia osagarriekin soilik.
baliabidea Deployments bi estrategia ditu zabaltzeko: RollingUpdate ΠΈ Recreate. Estrategia hauek kasu gehienetarako egokiak badira ere, oso eskala handian zerbitzarietan hedatzeko, estrategia osagarriak erabiltzen dira, hala nola, urdin-berdea edo kanaria, Deployment controller-en eskuragarri ez daudenak. Estrategia hauek Kubernetesen erabiltzeko, erabiltzaileek script-ak idatzi behar zituzten beren Inplementazioen gainean. Argo Rollouts Controller-ek estrategia hauek parametro sinple, deklaratibo eta konfiguragarri gisa azaltzen ditu.
https://argoproj.github.io/argo-rollouts

Argo CI ere badago, web interfaze erosoa eskaintzen duena Rollouts-ekin erabiltzeko, hurrengo artikuluan ikusiko dugu.

Argo Rollouts instalatzea

Zerbitzariaren Aldea

kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml

Gure azpiegituretan (ikus behean) install.yaml gehitu dugu i/k8s/argo-rollouts/install.yaml gisa. Modu honetan GitlabCI-k klusterrean instalatuko du.

Bezeroaren aldean (kubectl plugina)

https://argoproj.github.io/argo-rollouts/features/kubectl-plugin

Aplikazio adibidea

Praktika ona da aplikazioen kodea eta azpiegiturarako biltegi bereiziak izatea.

Aplikaziorako biltegia

Kim Wuestkamp/k8s-deployment-example-app

Oso sinplea den Python+Flask API bat da, erantzun bat JSON gisa itzultzen duena. GitlabCI erabiliz paketea eraikiko dugu eta emaitza Gitlab Erregistrora eramango dugu. Erregistroan bi bertsio ezberdin ditugu:

  • wuestkamp/k8s-deployment-example-app:v1
  • wuestkamp/k8s-deployment-example-app:v2

Haien arteko desberdintasun bakarra itzultzen den JSON fitxategia da. Aplikazio hau zein bertsiorekin komunikatzen garen ahalik eta errazen ikusteko erabiltzen dugu.

Azpiegituren biltegia

Biltegi honetan GitlabCI erabiliko dugu Kubernetes-en hedatzeko, .gitlab-ci.yml-ek honela dauka:

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

Zuk zeuk exekutatzeko kluster bat beharko duzu, Gcloud erabil dezakezu:

gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80

Sardexka egin behar duzu https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure eta aldagai bat sortu KUBECONFIG GitlabCIn, sarbidea izateko konfigurazioa edukiko duena kubectl zure multzora.

Hemen Kluster baterako (Gcloud) kredentzialak nola lortu irakur dezakezu.

Azpiegitura Yaml

Azpiegitura biltegiaren barruan zerbitzua dugu:

apiVersion: v1
kind: Service
metadata:
 labels:
   id: rollout-canary
 name: app
spec:
 ports:
 - port: 80
   protocol: TCP
   targetPort: 5000
 selector:
   id: app
 type: LoadBalancer

eta 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 minutes

Rollout Deployment-en berdin funtzionatzen du. Ez badugu eguneratze-estrategia bat ezartzen (kanary hemen bezala) lehenetsitako rolling-update Deployment bezala jokatuko du.

Yaml-en bi urrats definitzen ditugu canary inplementatzeko:

  1. Trafikoaren % 10 kanariara (itxaron eskuz ondo arte)
  2. %50eko trafikoa Kanarietara (itxaron 2 minutu eta jarraitu %100era arte

Hasierako hedapena egitea

Hasierako hedapenaren ondoren, gure baliabideak honela izango dira:

Kanariar inplementazioa Kubernetes #2: Argo inplementazioak

Eta erantzun bat jasoko dugu aplikazioaren lehen bertsiotik soilik:

Kanariar inplementazioa Kubernetes #2: Argo inplementazioak

Kanariarren hedapena egitea

1. urratsa: %10eko trafikoa

Kanariar inplementazio bat hasteko, irudiaren bertsioa aldatu behar dugu inplementazioekin egin ohi dugun moduan:

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

Eta aldaketak bultzatzen ditugu, beraz, Gitlab CI inplementatzen da eta aldaketak ikusten ditugu:

Kanariar inplementazioa Kubernetes #2: Argo inplementazioak

Orain zerbitzura sartzen bagara:

Kanariar inplementazioa Kubernetes #2: Argo inplementazioak

Bikaina! Kanariarren hedapenaren erdian gaude. Aurrerapena exekutatuta ikus dezakegu:

kubectl argo rollouts get rollout rollout-canary

Kanariar inplementazioa Kubernetes #2: Argo inplementazioak

2. urratsa: %50eko trafikoa:

Goazen orain hurrengo urratsera: trafikoaren %50 birbideratzea. Urrats hau eskuz exekutatzeko konfiguratu dugu:

kubectl argo rollouts promote rollout-canary # continue to step 2

Kanariar inplementazioa Kubernetes #2: Argo inplementazioak

Eta gure aplikazioak bertsio berrien erantzunen % 50 itzuli zuen:

Kanariar inplementazioa Kubernetes #2: Argo inplementazioak

Eta inplementazioaren berrikuspena:

Kanariar inplementazioa Kubernetes #2: Argo inplementazioak

Zoragarria.

3. urratsa: %100eko trafikoa:

Konfiguratu dugu 2 minuturen buruan %50eko urratsa automatikoki amai dadin eta %100eko urratsa hasteko:

Kanariar inplementazioa Kubernetes #2: Argo inplementazioak

Eta aplikazioaren irteera:

Kanariar inplementazioa Kubernetes #2: Argo inplementazioak

Eta inplementazioaren berrikuspena:

Kanariar inplementazioa Kubernetes #2: Argo inplementazioak

Kanariarren hedapena amaitu da.

Adibide gehiago Argo Rollouts-ekin

Adibide gehiago daude hemen, adibidez, nola konfiguratu ingurunearen aurrebistak eta konparaketak canary-n oinarrituta:

https://github.com/argoproj/argo-rollouts/tree/master/examples

Argo Rollouts eta Argo CI buruzko bideoa

Benetan gomendatzen dut bideo hau, Argo Rollouts eta Argo CI elkarrekin nola funtzionatzen duten erakusten du:

Guztira

Asko gustatzen zait inplementazio edo erreplika-multzo osagarriak sortzea, trafikoa birbideratzen dutenak eta abar kudeatzen dituzten CRDak erabiltzearen ideia. Haiekin lan egitea ondo doa. Ondoren, Argo CI-rekin integrazioa probatu nahiko nuke.

Hala ere, badirudi Argo CI eta Flux CIren bat-egite handi bat etorriko dela, beraz, baliteke bertsio berria atera arte itxarongo nuke: Argo Fluxua.

Esperientziarik izan al duzu Argo Rollouts edo Argo CI-rekin?

Irakurri beste artikulu batzuk ere gure blogean:

Iturria: www.habr.com

Gehitu iruzkin berria