Kanāru izvietošana Kubernetes #2: Argo Rollouts

Mēs izmantosim k8s dzimtā Argo Rollouts izvietošanas kontroli un GitlabCI, lai uzsāktu Canary izvietošanu Kubernetes.

Kanāru izvietošana Kubernetes #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Šī cikla raksti

Kanāru izvietošana

Ceram, ka esat lasījuši pirmo daļu, kur mēs īsi izskaidrojām, kas ir Canary izvietojumi. Mēs arī parādījām, kā to īstenot, izmantojot standarta Kubernetes resursus.

Argo Rollouts

Argo Rollouts ir Kubernetes dzimtā izvietošanas kontrole. Tā piedāvā CRD (pielāgota resursa definīcija) Kubernetes. Pateicoties tam, mēs varam izmantot jaunu objektu: Rollout, kas pārvalda blue-green un canary izvietojumus ar dažādām konfigurācijas iespējām.

Argo Rollouts kontrolieris, kas izmanto pielāgoto resursu Rollout, ļauj izmantot papildu izvietošanas stratēģijas, piemēram, blue-green un canary Kubernetes. Resurss Rollout piedāvā funkcionalitāti, kas tillīdzīga Deployment, tikai ar papildu izvietošanas stratēģijām.
Resursa Izvietojumi ir divas stratēģijas izvietošanai: RollingUpdate un Recreate. Lai gan šīs stratēģijas der lielākajai daļai gadījumu, lielu mērogu serveru izvietošanai tiek izmantotas papildu stratēģijas, piemēram, blue-green vai canary, kuras nav pieejamas Izvietojumu kontrolierī. Lai izmantotu šīs stratēģijas Kubernetes, lietotājiem bija jāraksta skripti virs saviem Izvietojumiem. Argo Rollouts kontrolieris piedāvā šīs stratēģijas kā vienkāršas deklaratīvas konfigurācijas opcijas.
https://argoproj.github.io/argo-rollouts

Pastāv arī Argo CI, kas nodrošina ērtu tīmekļa saskarni, ko var izmantot kopā ar Rollouts; mēs aplūkosim to nākamajā rakstā.

Argo Rollouts uzstādīšana

Servera pusē

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

Mūsu infrastruktūras repozitorijā (skatīt zemāk) mēs jau esam pievienojuši install.yaml kā i/k8s/argo-rollouts/install.yaml. Tādējādi GitlabCI to uzstādīs klasterī.

Klienta pusē (kubectl paplašinājums)

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

Parauga lietotne

Laba prakse ir izveidot atsevišķus repozitorijus lietotnes kodam un infrastruktūrai.

Lietotnes repozitorijs

Kim Wuestkamp / k8s-deployment-example-app

Šī ir ļoti vienkārša API, kas izveidota Python+Flask, atgriežot atbildi JSON formātā. Mēs izveidosim pakotni, izmantojot GitlabCI, un nosūtīsim rezultātu Gitlab reģistrā. Reģistrā mums ir divas dažādas relīzes versijas:

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

Vienīgā atšķirība starp tiem ir atgrieztā JSON failā. Mēs izmantojam šo lietotni, lai maksimāli vienkārši vizualizētu, ar kuru versiju mēs sazināmies.

Infrastruktūru 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 jāizveido forka https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure un jāizveido mainīgais KUBECONFIG GitlabCI, kas saturēs konfigurāciju piekļuvei kubectl jūsu klasterim.

Šeit varat lasīt par to, kā iegūt piekļuves datus klasterim (Gcloud).

Infrastruktūras Yaml

Iekš infrastruktūras repozitorija mums ir service:

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 } # divas minūtes

Rollout darbojas tāpat kā Deployment. Ja mēs nenosakām atjaunināšanas stratēģiju (kā canary šeit), tas uzvedīsies kā noklusējuma rolling-update Deployment.

Mēs definējam divus soļus yaml canary izvietošanai:

  1. 10% satiksmes uz canary (gaidīt manuālu apstiprinājumu)
  2. 50% satiksmes uz canary (gaidīt 2 minūtes, pēc tam turpināt uz 100%)

Sākotnējā izvietošanas izpilde

Pēc sākotnējās izvietošanas mūsu resursi izskatīsies šādi:

Kanāru izvietošana Kubernetes #2: Argo Rollouts

Un mēs iegūstam atbildi tikai no pirmās versijas lietotnes:

Kanāru izvietošana Kubernetes #2: Argo Rollouts

Izpildām Canary Deployment

1. solis: 10% satiksmes

Lai uzsāktu canary izvietošanu, mums vienkārši jāmaina attēla versija, kā mēs parasti darām ar izvietojumiem:

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

Un mēs nospiežam izmaiņas, tāpēc Gitlab CI veic izvietošanu un mēs redzam izmaiņas:

Kanāru izvietošana Kubernetes #2: Argo Rollouts

Tagad, ja mēs vēršamies pie pakalpojuma:

Kanāru izvietošana Kubernetes #2: Argo Rollouts

Lieliski! Mēs esam vidū mūsu canary izvietošanā. Mēs varam redzēt progresu, palaidot:

kubectl argo rollouts get rollout rollout-canary

Kanāru izvietošana Kubernetes #2: Argo Rollouts

2. solis: 50% satiksmes:

Tagad pārejam pie nākamā soļa: 50% satiksmes novirzīšana. Mēs esam to iestatījuši, lai šis solis tiktu uzsākts manuāli:

kubectl argo rollouts promote rollout-canary # turpinām pie 2. soļa

Kanāru izvietošana Kubernetes #2: Argo Rollouts

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

Kanāru izvietošana Kubernetes #2: Argo Rollouts

Un rollout apskats:

Kanāru izvietošana Kubernetes #2: Argo Rollouts

Izcili.

3. solis: 100% satiksmes:

Mēs to esam iestatījuši tā, ka pēc 2 minūtēm solis ar 50% automātiski pabeidzas un sākas solis ar 100%:

Kanāru izvietošana Kubernetes #2: Argo Rollouts

Un lietotnes izvadīšana:

Kanāru izvietošana Kubernetes #2: Argo Rollouts

Un rollout apskats:

Kanāru izvietošana Kubernetes #2: Argo Rollouts

Canary izvietojums pabeigts.

Vēl piemēri ar Argo Rollouts

Šeit ir vēl piemēri, piemēram, kā iestatīt priekšskatījumu vidi un salīdzinājumus, pamatojoties uz canary:

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

Video par Argo Rollouts un Argo CI

Es patiešām iesaku šo video, kurā parādīts, kā Argo Rollouts un Argo CI strādā kopā:

Atskaņot video

Rezultāts

Man ļoti patīk ideja izmantot CRDs, kas pārvalda papildu veidu deployments vai replicasets izveidi, novirzot satiksmi utt. Darbs ar tiem norit plūstoši. Tālāk es gribētu izmēģināt integrāciju ar Argo CI.

Tomēr, šķiet, tuvojas liels Argo CI un Flux CI saplūšanas brīdis, tāpēc es varētu pagaidīt, kamēr iznāk jaunā versija: Argo Flux.

Vai jums ir pieredze ar Argo Rollouts vai Argo CI?

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

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster