Canary Deployment v Kubernetes #1: Gitlab CI

Budeme používat Gitlab CI a manuální GitOps k zavedení a používání Canary nasazení v Kubernetes.

Canary Deployment v Kubernetes #1: Gitlab CI

Články v této sérii:

Canary nasazení provedeme ručně prostřednictvím GitOps a vytvořením/změnou základních zdrojů Kubernetes. Tento článek je určen především k seznámení s tím, jak funguje Canary nasazení v Kubernetes, protože existují efektivnější způsoby automatizace, které probereme v následujících článcích.


Canary Deployment v Kubernetes #1: Gitlab CI

https://www.norberteder.com/canary-deployment/

Canary Deployment

Při strategii Canary aktualizace jsou nejprve aplikovány změny pouze pro část uživatelů. Monitorováním, údaji z logů, manuálním testováním nebo jinými způsoby zpětné vazby se verze testuje před jejím nasazením pro všechny uživatele.

Kubernetes nasazení (rolling update)

Výchozí strategií pro Kubernetes nasazení je rolling-update, při kterém běží určité množství podů s novými verzemi obrazů. Pokud se vytvořily bez problémů, staré pody se ukončují a nové pody se vytvářejí paralelně.

GitOps

V tomto příkladu používáme GitOps, protože:

  • používáme Git jako jediný zdroj pravdy
  • používáme Git operace pro sestavení a nasazení (není třeba žádných příkazů kromě git tag/merge)

Příklad

Zavedeme dobrou praxi — mít jeden repozitář pro kód aplikací a jeden pro infrastrukturu.

Repozitář pro aplikace

Toto je velmi jednoduché API v Pythonu + Flask, které vrací odpověď ve formátu JSON. Sestavíme balíček prostřednictvím GitlabCI a nahrajeme výsledek do Gitlab Registry. V registru máme dvě různé verze vydání:

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

Jediný rozdíl mezi nimi je změna vraceného JSON souboru. Používáme tuto aplikaci k maximálně jednoduché vizualizaci toho, s jakou verzí komunikujeme.

Infrastrukturní repozitář

V tomto repozitáři budeme nasazovat prostřednictvím GitlabCI do Kubernetes, .gitlab-ci.yml vypadat následovně:

image: traherom/kustomize-docker

before_script:
   - printenv
   - kubectl version

stages:
 - deploy

deploy test:
   stage: deploy
   before_script:
     - echo $KUBECONFIG
   script:
     - kubectl get all
     - kubectl apply -f i/k8s

   only:
     - master

Pro jeho spuštění samostatně budete potřebovat cluster, můžete použít Gcloud:

gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b

gcloud compute firewall-rules create incoming-80 --allow tcp:80

Musíte si udělat fork https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure a vytvořit proměnnou KUBECONFIG v GitlabCI, která bude obsahovat konfiguraci pro přístup kubectl k vašemu clusteru.

O tom, jak získat pověření pro cluster (Gcloud), si můžete přečíst tady.

Infrastrukturní Yaml

V infrastrukturním repozitáři máme službu:

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

A nasazení v deploy.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: app
spec:
 replicas: 10
 selector:
   matchLabels:
     id: app
     type: main
 template:
   metadata:
     labels:
       id: app
       type: main
   spec:
     containers:
     - image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
       name: app
       resources:
         limits:
           cpu: 100m
           memory: 100Mi

A další nasazení v deploy-canary.yaml:

kind: Deployment
metadata:
 name: app-canary
spec:
 replicas: 0
 selector:
   matchLabels:
     id: app
     type: canary
 template:
   metadata:
     labels:
       id: app
       type: canary
   spec:
     containers:
     - image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
       name: app
       resources:
         limits:
           cpu: 100m
           memory: 100Mi

Všimněte si, že app-deploy zatím nemá definované repliky.

Provádění počátečního nasazení

Pro spuštění počátečního nasazení můžete ručně spustit GitlabCI pipeline v hlavní větvi. Poté kubectl by měl vydat následující:

Canary Deployment v Kubernetes #1: Gitlab CI

Vidíme app nasazení s 10 replikami a app-canary s 0. Také je zde LoadBalancer, na který se můžeme obracet přes curl přes External IP:

while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done

Canary Deployment v Kubernetes #1: Gitlab CI

Vidíme, že naše testovací aplikace vrací pouze “v1”.

Provádění Canary nasazení

Krok 1: uvolnit novou verzi pro část uživatelů

Nastavili jsme počet replik na 1 v souboru deploy-canary.yaml a obraz nové verze:

kind: Deployment
metadata:
 name: app-canary
spec:
 replicas: 1
 selector:
   matchLabels:
     id: app
     type: canary
 template:
   metadata:
     labels:
       id: app
       type: canary
   spec:
     containers:
     - image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
       name: app
       resources:
         limits:
           cpu: 100m
           memory: 100Mi

V souboru deploy.yaml změnili jsme počet replik na 9:

kind: Deployment
metadata:
 name: app
spec:
 replicas: 9
 selector:
   matchLabels:
     id: app
...

Tyto změny posíláme do repozitáře, ze kterého se spustí nasazení (přes GitlabCI) a vidíme nakonec:

Canary Deployment v Kubernetes #1: Gitlab CI

Naše služba bude ukazovat na obě nasazení, protože obě mají selektor app. Vzhledem k náhodnému rozdělení ve výchozím nastavení v Kubernetes bychom měli vidět různé odpovědi na přibližně 10 % dotazů:

Canary Deployment v Kubernetes #1: Gitlab CI

Aktuální stav naší aplikace (GitOps, brané z Git jako z jediné pravdy) je přítomnost dvou nasazení s aktivními replikami, po jedné pro každou verzi.

~10 % uživatelů se seznamují s novou verzí a nenáhodně ji testují. Nyní je čas zkontrolovat přítomnost chyb v logech a monitoringových datech, abychom našli problémy.

Krok 2: uvolnit novou verzi pro všechny uživatele

Rozhodli jsme se, že vše dopadlo dobře a nyní potřebujeme nasadit novou verzi pro všechny uživatele. K tomu jednoduše aktualizujeme deploy.yaml nainstalováním nové verze obrazu a počtem replik rovný 10. V deploy-canary.yaml Nastavujeme počet replik na zpětnou hodnotu 0. Po nasazení bude výsledek následující:

Canary Deployment v Kubernetes #1: Gitlab CI

Shrnutí

Pro mě je spuštění nasazení tímto způsobem užitečné, protože ukazuje, jak snadno lze provést konfiguraci pomocí k8s. Kubernetes umožňuje aktualizace prostřednictvím API, a tyto kroky mohou být automatizovány skripty.

Další věcí, kterou je třeba implementovat, je vstupní bod testera (LoadBalancer nebo přes Ingress), skrze který je možné přistupovat pouze k nové verzi. Ten může být použit k manuálnímu sledování.

V následujících článcích prozkoumáme další automatizovaná řešení, která realizují většinu toho, co jsme udělali.

Také si přečtěte další články na našem blogu:

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster