Usambazaji wa Canary katika Kubernetes #2: Utoaji wa Argo

Tutatumia kidhibiti cha uwekaji cha K8s-asili cha Argo Rollouts na GitlabCI kutekeleza utumaji wa Canary hadi Kubernetes.

Usambazaji wa Canary katika Kubernetes #2: Utoaji wa Argo

https://unsplash.com/photos/V41PulGL1z0

Makala katika mfululizo huu

Usambazaji wa Canary

Tunatumai umesoma sehemu ya kwanza, ambapo tulielezea kwa ufupi nini Canary Deployments ni. Pia tulionyesha jinsi ya kuitekeleza kwa kutumia rasilimali za Kubernetes za kawaida.

Utoaji wa Argo

Argo Rollouts ni kidhibiti asili cha uwekaji cha Kubernetes. Inatoa CRD (Ufafanuzi wa Rasilimali Maalum) kwa Kubernetes. Shukrani kwa hilo, tunaweza kutumia huluki mpya: Rollout, ambayo inasimamia uwekaji wa bluu-kijani na canary na chaguzi mbalimbali za usanidi.

Kidhibiti cha Argo Rollouts kinachotumiwa na rasilimali maalum Rollout, Huruhusu mikakati ya ziada ya utumaji kama vile bluu-kijani na canary kwa Kubernetes. Rasilimali Rollout hutoa utendaji sawa Deployment, tu na mikakati ya ziada ya kusambaza.
rasilimali Deployments ina mikakati miwili ya kupeleka: RollingUpdate и Recreate. Ingawa mikakati hii inafaa kwa hali nyingi, kwa kutumwa kwa seva kwa kiwango kikubwa sana, mikakati ya ziada hutumiwa, kama vile bluu-kijani au canary, ambayo haipatikani katika kidhibiti cha Usambazaji. Ili kutumia mikakati hii katika Kubernetes, watumiaji walilazimika kuandika hati juu ya Usambazaji wao. Kidhibiti cha Utoaji wa Argo hufichua mikakati hii kama vigezo rahisi, vya kutangaza na vinavyoweza kusanidiwa.
https://argoproj.github.io/argo-rollouts

Pia kuna Argo CI, ambayo hutoa kiolesura cha wavuti kinachofaa kwa matumizi na Utoaji, tutaangalia hilo katika makala inayofuata.

Inasakinisha Argo Rollouts

Upande wa seva

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

Katika turnip yetu ya miundombinu (tazama hapa chini) tayari tumeongeza install.yaml kama i/k8s/argo-rollouts/install.yaml. Kwa njia hii GitlabCI itaisakinisha kwenye nguzo.

Upande wa mteja (kubectl jalizi)

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

Mfano Maombi

Ni mazoezi mazuri kuwa na hazina tofauti za nambari za maombi na miundombinu.

Hifadhi ya maombi

Kim Wuestkamp/k8s-mfano-programu-ya-programu

Hii ni API rahisi sana ya Python+Flask ambayo inarudisha jibu kama JSON. Tutaunda kifurushi kwa kutumia GitlabCI na kusukuma matokeo kwenye Usajili wa Gitlab. Katika Usajili tuna matoleo mawili tofauti ya kutolewa:

  • wuestkamp/k8s-mfano-programu-ya-upelekaji:v1
  • wuestkamp/k8s-mfano-programu-ya-upelekaji:v2

Tofauti pekee kati yao ni faili ya JSON iliyorejeshwa. Tunatumia programu hii kuibua kwa urahisi iwezekanavyo ni toleo gani tunawasiliana nalo.

Hifadhi ya miundombinu

Katika hazina hii tutatumia GitlabCI kupeleka Kubernetes, .gitlab-ci.yml inaonekana kama hii:

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

Ili kuiendesha mwenyewe utahitaji nguzo, unaweza kutumia Gcloud:

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

Unahitaji uma https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure na unda kigezo KUBECONFIG katika GitlabCI, ambayo itakuwa na usanidi wa ufikiaji kubectl kwa nguzo yako.

Hapa Unaweza kusoma kuhusu jinsi ya kupata vitambulisho kwa kundi (Gcloud).

Miundombinu Yaml

Ndani ya hazina ya miundombinu tunayo huduma:

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

na 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 inafanya kazi sawa na Usambazaji. Ikiwa hatutaweka mkakati wa kusasisha (kama vile canary hapa) itakuwa kama Usambazaji chaguomsingi wa kusasisha.

Tunafafanua hatua mbili katika yaml kwa uwekaji wa canary:

  1. 10% ya trafiki hadi canary (subiri mwongozo Sawa)
  2. 50% ya trafiki hadi canary (subiri dakika 2 kisha uendelee hadi 100%)

Kufanya uwekaji wa awali

Baada ya kupelekwa kwa awali, rasilimali zetu zitaonekana kama hii:

Usambazaji wa Canary katika Kubernetes #2: Utoaji wa Argo

Na tunapata jibu tu kutoka kwa toleo la kwanza la programu:

Usambazaji wa Canary katika Kubernetes #2: Utoaji wa Argo

Kufanya Usambazaji wa Canary

Hatua ya 1: 10% ya trafiki

Ili kuanza usambazaji wa canary, tunahitaji tu kubadilisha toleo la picha kama kawaida tunavyofanya na usambazaji:

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

Na tunasukuma mabadiliko, kwa hivyo Gitlab CI haipeleki na tunaona mabadiliko:

Usambazaji wa Canary katika Kubernetes #2: Utoaji wa Argo

Sasa ikiwa tunapata huduma:

Usambazaji wa Canary katika Kubernetes #2: Utoaji wa Argo

Kubwa! Tuko katikati ya upelekaji wetu wa canary. Tunaweza kuona maendeleo kwa kukimbia:

kubectl argo rollouts get rollout rollout-canary

Usambazaji wa Canary katika Kubernetes #2: Utoaji wa Argo

Hatua ya 2: 50% ya trafiki:

Sasa hebu tuendelee kwenye hatua inayofuata: kuelekeza upya 50% ya trafiki. Tulisanidi hatua hii kuendeshwa kwa mikono:

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

Usambazaji wa Canary katika Kubernetes #2: Utoaji wa Argo

Na programu yetu ilirejesha 50% ya majibu kutoka kwa matoleo mapya:

Usambazaji wa Canary katika Kubernetes #2: Utoaji wa Argo

Na mapitio ya usambazaji:

Usambazaji wa Canary katika Kubernetes #2: Utoaji wa Argo

Ajabu.

Hatua ya 3: 100% ya trafiki:

Tunaiweka ili baada ya dakika 2 hatua ya 50% imalizike kiatomati na hatua ya 100% ianze:

Usambazaji wa Canary katika Kubernetes #2: Utoaji wa Argo

Na matokeo ya maombi:

Usambazaji wa Canary katika Kubernetes #2: Utoaji wa Argo

Na mapitio ya usambazaji:

Usambazaji wa Canary katika Kubernetes #2: Utoaji wa Argo

Usambazaji wa Canary umekamilika.

Mifano zaidi na Argo Rollouts

Kuna mifano zaidi hapa, kama vile jinsi ya kusanidi muhtasari wa mazingira na ulinganisho kulingana na canary:

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

Video kuhusu Argo Rollouts na Argo CI

Ninapendekeza video hii, inaonyesha jinsi Argo Rollouts na Argo CI hufanya kazi pamoja:

Jumla ya

Ninapenda sana wazo la kutumia CRD zinazodhibiti uundaji wa aina za ziada za utumaji au nakala, kuelekeza trafiki, n.k. Kufanya kazi nao huenda vizuri. Ifuatayo ningependa kujaribu ujumuishaji na Argo CI.

Walakini, inaonekana kuna muunganisho mkubwa wa Argo CI na Flux CI unakuja, kwa hivyo naweza kungoja hadi toleo jipya litoke: Argo Flux.

Je, umekuwa na uzoefu wowote na Argo Rollouts au Argo CI?

Pia soma nakala zingine kwenye blogi yetu:

Chanzo: mapenzi.com

Kuongeza maoni