Canary implementacija u Kubernetes #2: Argo Rollouts

Koristit ćemo k8s-native Argo Rollouts kontroler implementacije i GitlabCI za pokretanje Canary implementacije na Kubernetes

Canary implementacija u Kubernetes #2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Članci u ovoj seriji

Canary Deployment

Nadamo se da ste pročitali prvi dio, gdje smo ukratko objasnili šta su Canary Deployments. Takođe smo pokazali kako to implementirati koristeći standardne Kubernetes resurse.

Argo Rollouts

Argo Rollouts je Kubernetes izvorni kontroler implementacije. Pruža CRD (prilagođenu definiciju resursa) za Kubernetes. Zahvaljujući njemu, možemo koristiti novi entitet: Rollout, koji upravlja plavo-zelenim i kanarinskim implementacijama s različitim opcijama konfiguracije.

Argo Rollouts kontroler koji koristi prilagođeni resurs Rollout, Omogućava dodatne strategije implementacije kao što su plavo-zelena i kanarinac za Kubernetes. Resurs Rollout pruža ekvivalentnu funkcionalnost Deployment, samo uz dodatne strategije implementacije.
resurs Deployments ima dvije strategije za implementaciju: RollingUpdate и Recreate. Iako su ove strategije prikladne za većinu slučajeva, za implementaciju na servere u velikom obimu, koriste se dodatne strategije, poput plavo-zelenih ili kanarinca, koje nisu dostupne u kontroleru implementacije. Da bi koristili ove strategije u Kubernetesu, korisnici su morali da napišu skripte povrh svojih implementacija. Argo Rollouts Controller izlaže ove strategije kao jednostavne, deklarativne, konfigurabilne parametre.
https://argoproj.github.io/argo-rollouts

Tu je i Argo CI, koji pruža zgodan web interfejs za upotrebu sa Rollouts-ima, to ćemo pogledati u sledećem članku.

Instaliranje Argo Rollout-a

Server side

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

U našoj infrastrukturnoj repi (vidi dolje) već smo dodali install.yaml kao i/k8s/argo-rollouts/install.yaml. Na ovaj način će ga GitlabCI instalirati u klaster.

Klijentska strana (kubectl dodatak)

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

Primjer aplikacije

Dobra je praksa imati odvojena spremišta za kod aplikacije i infrastrukturu.

Repozitorijum za aplikaciju

Kim Wuestkamp/k8s-primjer-primjer-app

Ovo je vrlo jednostavan Python+Flask API koji vraća odgovor kao JSON. Napravit ćemo paket koristeći GitlabCI i gurnuti rezultat u Gitlab Registry. U registru imamo dvije različite verzije izdanja:

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

Jedina razlika između njih je vraćeni JSON fajl. Koristimo ovu aplikaciju kako bismo što lakše vizualizirali s kojom verzijom komuniciramo.

Infrastrukturno spremište

U ovom spremištu ćemo koristiti GitlabCI za implementaciju u Kubernetes, .gitlab-ci.yml izgleda ovako:

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

Da biste ga sami pokrenuli, trebat će vam klaster, možete koristiti Gcloud:

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

Morate da se račvate https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure i kreirajte varijablu KUBECONFIG u GitlabCI, koji će sadržavati konfiguraciju za pristup kubectl vašem klasteru.

to je Možete pročitati o tome kako dobiti vjerodajnice za klaster (Gcloud).

Infrastruktura Yaml

Unutar skladišta infrastrukture imamo servis:

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

i 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 radi isto kao i Deployment. Ako ne postavimo strategiju ažuriranja (kao što je kanarinac ovdje), ona će se ponašati kao zadana implementacija s ažuriranjem.

Definiramo dva koraka u yaml-u za implementaciju canary:

  1. 10% prometa ka kanarincu (pričekajte ručno OK)
  2. 50% prometa do kanarinca (sačekajte 2 minute pa nastavite do 100%)

Izvođenje početnog postavljanja

Nakon inicijalne implementacije, naši resursi će izgledati ovako:

Canary implementacija u Kubernetes #2: Argo Rollouts

A odgovor dobijamo samo od prve verzije aplikacije:

Canary implementacija u Kubernetes #2: Argo Rollouts

Izvođenje Canary implementacije

Korak 1: 10% prometa

Da bismo započeli implementaciju kanarinca, samo trebamo promijeniti verziju slike kao što to obično radimo s implementacijama:

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

I mi guramo promjene, tako da se Gitlab CI implementira i vidimo promjene:

Canary implementacija u Kubernetes #2: Argo Rollouts

Sada ako pristupimo servisu:

Canary implementacija u Kubernetes #2: Argo Rollouts

Odlično! Nalazimo se usred našeg rasporeda kanarinca. Napredak možemo vidjeti tako što ćemo pokrenuti:

kubectl argo rollouts get rollout rollout-canary

Canary implementacija u Kubernetes #2: Argo Rollouts

Korak 2: 50% prometa:

Sada idemo na sljedeći korak: preusmjeravanje 50% prometa. Konfigurirali smo ovaj korak da se pokreće ručno:

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

Canary implementacija u Kubernetes #2: Argo Rollouts

A naša aplikacija je vratila 50% odgovora iz novih verzija:

Canary implementacija u Kubernetes #2: Argo Rollouts

I pregled uvođenja:

Canary implementacija u Kubernetes #2: Argo Rollouts

Prekrasno.

Korak 3: 100% prometa:

Postavili smo ga tako da se nakon 2 minute korak od 50% automatski završava i korak od 100% počinje:

Canary implementacija u Kubernetes #2: Argo Rollouts

I izlaz aplikacije:

Canary implementacija u Kubernetes #2: Argo Rollouts

I pregled uvođenja:

Canary implementacija u Kubernetes #2: Argo Rollouts

Canary implementacija je završena.

Više primjera s Argo Rollouts

Ovdje ima još primjera, kao što je kako postaviti preglede okruženja i poređenja na osnovu kanarinca:

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

Video o Argo Rollouts i Argo CI

Zaista preporučujem ovaj video, on pokazuje kako Argo Rollouts i Argo CI rade zajedno:

Rezultat

Stvarno mi se sviđa ideja korištenja CRD-ova koji upravljaju kreiranjem dodatnih tipova implementacija ili skupova replika, preusmjeravaju promet itd. Rad sa njima ide glatko. Sledeće bih želeo da testiram integraciju sa Argo CI.

Međutim, čini se da dolazi do velikog spajanja Argo CI i Flux CI, tako da bih mogao pričekati dok novo izdanje ne izađe: Argo Flux.

Jeste li imali iskustva s Argo Rollouts ili Argo CI?

Pročitajte i druge članke na našem blogu:

izvor: www.habr.com

Dodajte komentar