Canaryn käyttöönotto Kubernetesissa #2: Argo Rollouts

Käytämme k8s-natiivia Argo Rollouts -käyttöönottoohjainta ja GitlabCI:tä Canaryn käyttöönottojen suorittamiseen Kubernetesiin

Canaryn käyttöönotto Kubernetesissa #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Tämän sarjan artikkelit

Kanarian käyttöönotto

Toivomme, että luet ensimmäinen osa, jossa selitimme lyhyesti, mitä Canary Deployments ovat. Näitimme myös, kuinka se toteutetaan käyttämällä Kubernetesin tavallisia resursseja.

Argo Rollouts

Argo Rollouts on Kubernetesin alkuperäinen käyttöönottoohjain. Se tarjoaa CRD:n (Custom Resource Definition) Kubernetesille. Sen ansiosta voimme käyttää uutta kokonaisuutta: Rollout, joka hallitsee sinivihreitä ja kanariankielisiä käyttöönottoja erilaisilla kokoonpanovaihtoehdoilla.

Mukautetun resurssin käyttämä Argo Rollouts -ohjain Rollout, Mahdollistaa lisäkäyttöönottostrategioiden, kuten sinivihreän ja kanariansaarten käytön Kubernetesille. Resurssi Rollout tarjoaa vastaavan toiminnallisuuden Deployment, vain lisäkäyttöstrategioilla.
resurssi Deployments sillä on kaksi käyttöönottostrategiaa: RollingUpdate и Recreate. Vaikka nämä strategiat soveltuvat useimpiin tapauksiin, erittäin suuren mittakaavan käyttöönotossa palvelimille, käytetään lisästrategioita, kuten sinivihreä tai kanarian, jotka eivät ole käytettävissä käyttöönottoohjaimessa. Käyttääkseen näitä strategioita Kubernetesissa käyttäjien oli kirjoitettava komentosarjat käyttöönottojensa päälle. Argo Rollouts Controller paljastaa nämä strategiat yksinkertaisina, deklaratiivisina, konfiguroitavina parametreina.
https://argoproj.github.io/argo-rollouts

Mukana on myös Argo CI, joka tarjoaa kätevän verkkokäyttöliittymän Rollouts-käyttöön. Tarkastelemme sitä seuraavassa artikkelissa.

Asenna Argo Rollouts

Palvelimen puolella

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

Infrastruktuurinauriimme (katso alla) olemme jo lisänneet install.yaml:n nimellä i/k8s/argo-rollouts/install.yaml. Näin GitlabCI asentaa sen klusteriin.

Asiakaspuoli (kubectl-laajennus)

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

Esimerkkisovellus

On hyvä käytäntö, että sovelluskoodille ja infrastruktuurille on erilliset arkistot.

Sovelluksen arkisto

Kim Wuestkamp/k8s-deployment-example-app

Tämä on hyvin yksinkertainen Python+Flask API, joka palauttaa vastauksen JSON-muodossa. Rakennamme paketin GitlabCI:lla ja välitämme tuloksen Gitlab-rekisteriin. Meillä on rekisterissä kaksi erilaista julkaisuversiota:

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

Ainoa ero niiden välillä on palautettu JSON-tiedosto. Käytämme tätä sovellusta visualisoidaksemme mahdollisimman helposti, minkä version kanssa kommunikoimme.

Infrastruktuurin arkisto

Tässä arkistossa käytämme GitlabCI:tä Kubernetesin käyttöönottoon, .gitlab-ci.yml näyttää tältä:

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

Jos haluat suorittaa sen itse, tarvitset klusterin, voit käyttää Gcloudia:

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

Sinun täytyy haarukka https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure ja luo muuttuja KUBECONFIG GitlabCI:ssä, joka sisältää pääsyn asetukset kubectl klusteriisi.

Täällä Voit lukea klusterin tunnistetietojen hankkimisesta (Gcloud).

Infrastruktuuri Yaml

Infrastruktuuriarkiston sisällä meillä on palvelu:

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

ja 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 toimii samalla tavalla kuin käyttöönotto. Jos emme määritä päivitysstrategiaa (kuten Canarya tässä), se käyttäytyy kuin oletusarvoinen jatkuvan päivityksen käyttöönotto.

Määrittelemme yamlissa kaksi vaihetta kanarialaisten käyttöönotolle:

  1. 10 % liikenteestä kanarialle (odota manuaalista OK)
  2. 50 % liikenteestä kanarialle (odota 2 minuuttia ja jatka sitten 100 %)

Alkukäyttöönotto suoritetaan

Ensimmäisen käyttöönoton jälkeen resurssimme näyttävät tältä:

Canaryn käyttöönotto Kubernetesissa #2: Argo Rollouts

Ja saamme vastauksen vain sovelluksen ensimmäisestä versiosta:

Canaryn käyttöönotto Kubernetesissa #2: Argo Rollouts

Suorittaa Canary Deployment

Vaihe 1: 10 % liikenteestä

Kanarian käyttöönoton aloittamiseksi meidän on vain vaihdettava kuvaversiota, kuten yleensä tehdään käyttöönottojen kanssa:

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

Ja me ajamme muutoksia, joten Gitlab CI ottaa käyttöön ja näemme muutokset:

Canaryn käyttöönotto Kubernetesissa #2: Argo Rollouts

Jos nyt käytämme palvelua:

Canaryn käyttöönotto Kubernetesissa #2: Argo Rollouts

Loistava! Olemme keskellä kanarialinjojen käyttöönottoa. Näemme edistymisen ajamalla:

kubectl argo rollouts get rollout rollout-canary

Canaryn käyttöönotto Kubernetesissa #2: Argo Rollouts

Vaihe 2: 50 % liikenteestä:

Siirrytään nyt seuraavaan vaiheeseen: 50 % liikenteestä ohjataan uudelleen. Määritimme tämän vaiheen suoritettavaksi manuaalisesti:

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

Canaryn käyttöönotto Kubernetesissa #2: Argo Rollouts

Ja sovelluksemme palautti 50 % uusien versioiden vastauksista:

Canaryn käyttöönotto Kubernetesissa #2: Argo Rollouts

Ja käyttöönottotarkistus:

Canaryn käyttöönotto Kubernetesissa #2: Argo Rollouts

Ihana.

Vaihe 3: 100 % liikenteestä:

Asetimme sen niin, että 2 minuutin kuluttua 50% askel päättyy automaattisesti ja 100% askel alkaa:

Canaryn käyttöönotto Kubernetesissa #2: Argo Rollouts

Ja sovelluksen tulos:

Canaryn käyttöönotto Kubernetesissa #2: Argo Rollouts

Ja käyttöönottotarkistus:

Canaryn käyttöönotto Kubernetesissa #2: Argo Rollouts

Canaryn käyttöönotto on valmis.

Lisää esimerkkejä Argo Rolloutsista

Täällä on lisää esimerkkejä, kuten ympäristön esikatselujen ja vertailujen määrittäminen kanarian perusteella:

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

Video Argo Rolloutsista ja Argo CI:stä

Suosittelen todella tätä videota, se näyttää kuinka Argo Rollouts ja Argo CI toimivat yhdessä:

Koko

Pidän todella ajatuksesta käyttää CRD:itä, jotka hallitsevat lisätyyppisten käyttöönottojen tai replikaattien luomista, liikenteen uudelleenohjausta jne. Työskentely heidän kanssaan sujuu mutkattomasti. Seuraavaksi haluaisin testata integraatiota Argo CI:n kanssa.

Argo CI:n ja Flux CI:n yhdistäminen näyttää kuitenkin olevan tulossa, joten saatan odottaa uuden julkaisun ilmestymistä: Argo Flux.

Onko sinulla kokemusta Argo Rolloutista tai Argo CI:stä?

Lue myös muut artikkelit blogistamme:

Lähde: will.com

Lisää kommentti