Canary Deployment i Kubernetes #1: Gitlab CI

Vi kommer att anvÀnda Gitlab CI och manuell GitOps för att implementera och anvÀnda Canary-deployment i Kubernetes

Canary Deployment i Kubernetes #1: Gitlab CI

Artiklar frÄn denna cykel:

Vi kommer att genomföra Canary-deployment manuellt genom GitOps och skapande/Àndring av grundresurser i Kubernetes. Denna artikel Àr frÀmst avsedd för att introducera hur Canary deployment fungerar i Kubernetes, eftersom det finns mer effektiva sÀtt att automatisera, som vi kommer att diskutera i kommande artiklar.


Canary Deployment i Kubernetes #1: Gitlab CI

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

Canary-deployment

Vid en Canary-uppdateringsstrategi tillÀmpas uppdateringar först för en del av anvÀndarna. Genom övervakning, loggdata, manuell testning eller andra kanaler för feedback testas releasen innan den tillÀmpas för alla anvÀndare.

Kubernetes Deployment (rolling update)

Standardstrategin för Kubernetes Deployment Àr rolling-update, dÀr ett visst antal pods med nya versioner av bilder startas. Om de skapas utan problem avslutas pods med Àldre versioner av bilder och nya pods skapas parallellt.

GitOps

Vi anvÀnder GitOps i detta exempel eftersom vi:

  • anvĂ€nder Git som en enda sanningens kĂ€lla
  • anvĂ€nder Git Operations för byggande och deployment (inga kommandon, utom git tag/merge behövs)

Exempel

LĂ„t oss ta en bra praxis — ha ett enda repository för applikationskoden och ett för infrastrukturen.

Repository för applikationer

Detta Àr en mycket enkel API pÄ Python+Flask som returnerar svar i JSON-format. Vi kommer att bygga paketet via GitlabCI och pusha resultatet till Gitlab Registry. I registret har vi tvÄ olika versioner av releaser:

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

Den enda skillnaden mellan dem Àr Àndringen av den returnerade JSON-filen. Vi anvÀnder denna applikation för att maximalt enkelt visualisera vilken version vi kommunicerar med.

Infrastrukturens repository

I detta repo kommer vi att deploya via GitlabCI i Kubernetes, .gitlab-ci.yml ser ut som följer:

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

För att köra det pÄ egen hand behöver du en kluster, du kan anvÀnda Gcloud:

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

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

Du behöver göra en fork https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure och skapa en variabel KUBECONFIG i GitlabCI som kommer att innehÄlla konfigurationen för Ätkomst kubectl till din kluster.

Hur man fÄr autentiseringsuppgifter för klustret (Gcloud) kan man lÀsa om hÀr.

Infrastrukturens Yaml

I infrastrukturrepositoryt har vi service:

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

Och deployment i 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

Och en annan deployment i 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

Observera att app-deploy för tillfÀllet inte har nÄgra specificerade repliker.

Utför den initiala deploymenten

För att köra den initiala deployment kan du manuellt köra GitlabCI-pipelinen i master-grenen. Efter detta kubectl ska visa följande:

Canary Deployment i Kubernetes #1: Gitlab CI

Vi ser app deployment med 10 repliker och app-canary med 0. Det finns ocksÄ en LoadBalancer som vi kan komma Ät genom curl via External IP:

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

Canary Deployment i Kubernetes #1: Gitlab CI

Vi ser att vĂ„r testapplikation endast returnerar “v1”.

Utförande av Canary deployment

Steg 1: slÀpp en ny version för en del anvÀndare

Vi har stÀllt in antalet repliker till 1 i filen deploy-canary.yaml och bilden av den nya versionen:

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

I filen deploy.yaml vi har Àndrat antalet repliker till 9:

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

Vi pushar dessa Àndringar till arkivet, som kommer att starta deployment (via GitlabCI) och ser till slut:

Canary Deployment i Kubernetes #1: Gitlab CI

VÄr Service kommer att peka pÄ bÄda deployments, eftersom bÄda har selektorn app. PÄ grund av den slumpmÀssiga fördelningen som standard i Kubernetes bör vi se olika svar pÄ ~ 10% av förfrÄgningarna:

Canary Deployment i Kubernetes #1: Gitlab CI

Det aktuella lÀget för vÄr applikation (GitOps, taget frÄn Git som en Single Source Of Truth) Àr att ha tvÄ deployments med aktiva repliker, en för varje version.

~10% av anvÀndarna fÄr tillgÄng till den nya versionen och testar den oavsiktligt. Nu Àr det dags att kontrollera loggar och övervakningsdata för att identifiera problem.

Steg 2: slÀpp en ny version för alla anvÀndare

Vi har beslutat att allt har gÄtt bra, och nu behöver vi rulla ut den nya versionen till alla anvÀndare. För detta helt enkelt uppdatera deploy.yaml genom att installera den nya versionen av bilden och antalet repliker lika med 10. I deploy-canary.yaml Vi stÀller antalet repliker till att vara 0. Efter distributionen blir resultatet följande:

Canary Deployment i Kubernetes #1: Gitlab CI

Sammanfattningsvis

För mig hjÀlper det att köra distributionen manuellt pÄ detta sÀtt för att förstÄ hur enkelt det kan konfigureras med hjÀlp av k8s. Eftersom Kubernetes tillÄter att man uppdaterar allt via API kan dessa steg automatiseras med skript.

En annan sak som behöver implementeras Àr ingÄngspunkten för testaren (LoadBalancer eller via Ingress), som bara kan anvÀndas för att fÄ tillgÄng till den nya versionen. Den kan anvÀndas för manuell visning.

I kommande artiklar kommer vi att undersöka andra automatiserade lösningar som implementerar det mesta av det vi har gjort.

LÀs Àven andra artiklar i vÄr blogg:

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster