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

Artiklar frÄn denna cykel:
- (denna artikel)
- Canary Deployment med hjÀlp av Istio
- Canary Deployment med hjÀlp av Jenkins-X Istio Flagger
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
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:v1wuestkamp/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:80Du behöver göra en fork 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 .
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: LoadBalancerOch 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: 100MiOch 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: 100MiObservera 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:

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

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: 100MiI 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:

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:

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:

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
