Kanāriju izvietoŔana Kubernetes #2: Argo Rollouts

Mēs izmantosim k8s vietējo Argo Rollouts izvietoÅ”anas kontrolieri un GitlabCI, lai palaistu Canary izvietoÅ”anu Kubernetes.

Kanāriju izvietoŔana Kubernetes #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Raksti Å”ajā sērijā

Kanāriju izvietoŔana

Mēs ceram, ka jūs izlasīsit pirmā daļa, kur mēs īsi paskaidrojām, kas ir Canary Deployments. Mēs arī parādījām, kā to ieviest, izmantojot standarta Kubernetes resursus.

Argo Rollouts

Argo Rollouts ir Kubernetes vietējais izvietoÅ”anas kontrolieris. Tas nodroÅ”ina Kubernetes CRD (pielāgoto resursu definÄ«ciju). Pateicoties tam, mēs varam izmantot jaunu entÄ«tiju: Rollout, kas pārvalda zili zaļo un kanāriju izvietoÅ”anu ar dažādām konfigurācijas opcijām.

Argo Rollouts kontrolieris, ko izmanto pielāgots resurss Rollout, Ä»auj Kubernetes papildu izvietoÅ”anas stratēģijas, piemēram, zili zaļo un kanārijputnu. Resurss Rollout nodroÅ”ina lÄ«dzvērtÄ«gu funkcionalitāti Deployment, tikai ar papildu izvietoÅ”anas stratēģijām.
resursi Deployments ir divas izvietoÅ”anas stratēģijas: RollingUpdate Šø Recreate. Lai gan Ŕīs stratēģijas ir piemērotas vairumam gadÄ«jumu, izvietoÅ”anai serveros ļoti lielā mērogā tiek izmantotas papildu stratēģijas, piemēram, zili zaļa vai kanārijas, kas nav pieejamas izvietoÅ”anas kontrollerÄ«. Lai izmantotu Ŕīs stratēģijas pakalpojumā Kubernetes, lietotājiem bija jāraksta skripti papildus izvietoÅ”anai. Argo Rollouts Controller Ŕīs stratēģijas atklāj kā vienkārÅ”us, deklaratÄ«vus, konfigurējamus parametrus.
https://argoproj.github.io/argo-rollouts

Ir arÄ« Argo CI, kas nodroÅ”ina ērtu tÄ«mekļa saskarni lietoÅ”anai ar Rollouts, mēs to aplÅ«kosim nākamajā rakstā.

Argo Rollouts instalēŔana

Servera puse

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

Savā infrastruktÅ«ras rācenÄ« (skatiet tālāk) mēs jau esam pievienojuÅ”i install.yaml kā i/k8s/argo-rollouts/install.yaml. Tādā veidā GitlabCI to instalēs klasterÄ«.

Klienta puse (kubectl spraudnis)

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

Pieteikuma piemērs

Tā ir laba prakse, ja lietojumprogrammas kodam un infrastruktūrai ir atseviŔķi krātuves.

Lietojumprogrammas repozitorijs

Kim Wuestkamp/k8s-deployment-example-app

Å Ä« ir ļoti vienkārÅ”a Python+Flask API, kas atgriež atbildi kā JSON. Mēs izveidosim pakotni, izmantojot GitlabCI, un nosÅ«tÄ«sim rezultātu Gitlab reÄ£istram. ReÄ£istrā mums ir divas dažādas laidiena versijas:

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

VienÄ«gā atŔķirÄ«ba starp tām ir atgrieztais JSON fails. Mēs izmantojam Å”o lietojumprogrammu, lai pēc iespējas vienkārŔāk vizualizētu, ar kuru versiju mēs sazināmies.

Infrastruktūras repozitorijs

Å ajā repozitorijā mēs izmantosim GitlabCI izvietoÅ”anai Kubernetes, .gitlab-ci.yml izskatās Ŕādi:

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

Lai to palaistu pats, jums būs nepiecieŔams klasteris, varat izmantot Gcloud:

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

Jums vajag dakÅ”iņu https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure un izveidojiet mainÄ«go KUBECONFIG GitlabCI, kurā bÅ«s piekļuves konfigurācija kubectl uz jÅ«su kopu.

Šeit Varat lasīt par to, kā iegūt klastera (Gcloud) akreditācijas datus.

Infrastruktūra Yaml

Infrastruktūras repozitorijā mums ir pakalpojums:

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

un 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 darbojas tāpat kā izvietoÅ”ana. Ja mēs neiestatÄ«sim atjaunināŔanas stratēģiju (piemēram, Å”eit), tā darbosies kā noklusējuma slÄ«doŔā atjauninājuma izvietoÅ”ana.

Mēs definējam divus soļus yaml kanāriju izvietoÅ”anai:

  1. 10% no satiksmes uz Kanāriju salām (pagaidiet manuāli OK)
  2. 50% satiksmes uz Kanāriju (pagaidiet 2 minūtes un turpiniet uz 100%)

Veicot sākotnējo izvietoÅ”anu

Pēc sākotnējās izvietoÅ”anas mÅ«su resursi izskatÄ«sies Ŕādi:

Kanāriju izvietoŔana Kubernetes #2: Argo Rollouts

Un mēs saņemam atbildi tikai no pirmās lietojumprogrammas versijas:

Kanāriju izvietoŔana Kubernetes #2: Argo Rollouts

Kanāriju izvietoŔanas veikŔana

1. darbÄ«ba: 10% satiksmes

Lai sāktu Canary izvietoÅ”anu, mums vienkārÅ”i jāmaina attēla versija, kā mēs parasti darām ar izvietoÅ”anu:

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

Mēs veicinām izmaiņas, tāpēc Gitlab CI tiek ieviests, un mēs redzam izmaiņas:

Kanāriju izvietoŔana Kubernetes #2: Argo Rollouts

Tagad, ja mēs piekļūstam pakalpojumam:

Kanāriju izvietoŔana Kubernetes #2: Argo Rollouts

Lieliski! Mēs esam mÅ«su kanāriju izvietoÅ”anas vidÅ«. Mēs varam redzēt progresu, izpildot:

kubectl argo rollouts get rollout rollout-canary

Kanāriju izvietoŔana Kubernetes #2: Argo Rollouts

2. darbÄ«ba: 50% satiksmes:

Tagad pāriesim pie nākamās darbÄ«bas: 50% datplÅ«smas novirzÄ«Å”anas. Mēs konfigurējām Å”o darbÄ«bu manuālai izpildei:

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

Kanāriju izvietoŔana Kubernetes #2: Argo Rollouts

Un mūsu lietojumprogramma atgrieza 50% atbilžu no jaunajām versijām:

Kanāriju izvietoŔana Kubernetes #2: Argo Rollouts

Un izlaiŔanas pārskats:

Kanāriju izvietoŔana Kubernetes #2: Argo Rollouts

BrīniŔķīgi.

3. darbÄ«ba: 100% satiksmes:

Mēs to iestatÄ«jām tā, lai pēc 2 minÅ«tēm automātiski beigtos 50% solis un sāktos 100% solis:

Kanāriju izvietoŔana Kubernetes #2: Argo Rollouts

Un lietojumprogrammas izvade:

Kanāriju izvietoŔana Kubernetes #2: Argo Rollouts

Un izlaiŔanas pārskats:

Kanāriju izvietoŔana Kubernetes #2: Argo Rollouts

Kanāriju izvietoŔana ir pabeigta.

Vairāk piemēru ar Argo Rollouts

Å eit ir vairāk piemēru, piemēram, kā iestatÄ«t vides priekÅ”skatÄ«jumus un salÄ«dzinājumus, pamatojoties uz kanārijputnu:

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

Video par Argo Rollouts un Argo CI

Es tieŔām iesaku Ŕo video, tas parāda, kā Argo Rollouts un Argo CI strādā kopā:

Kopsavilkums

Man ļoti patÄ«k ideja izmantot CRD, kas pārvalda papildu izvietoÅ”anas vai replikātu veidu izveidi, trafika novirzÄ«Å”anu utt. Darbs ar viņiem norit raiti. Tālāk es vēlētos pārbaudÄ«t integrāciju ar Argo CI.

Tomēr Ŕķiet, ka gaidāma liela Argo CI un Flux CI apvienoÅ”anās, tāpēc es varētu pagaidÄ«t, lÄ«dz iznāks jaunais laidiens: Argo Flux.

Vai jums ir bijusi pieredze ar Argo Rollouts vai Argo CI?

Lasiet arī citus rakstus mūsu emuārā:

Avots: www.habr.com

Pievieno komentāru