Vi kommer att anvÀnda k8s-nativa distributionskontrollern Argo Rollouts och GitlabCI för att starta Canary-distribution i Kubernetes

Artiklar i denna cykel
- (Denna artikel)
- Canary-distribution med Istio
- Canary-distribution med Jenkins-X Istio Flagger
Canary-deployment
Vi hoppas att du har lÀst , dÀr vi kort förklarade vad Canary-distributioner Àr. Vi visade ocksÄ hur man implementerar det med standardresurser i Kubernetes.
Argo Rollouts
Argo Rollouts Àr en Kubernetes-nativ distributionskontroller. Den tillhandahÄller CRD (Custom Resource Definition) för Kubernetes. Med den kan vi anvÀnda en ny enhet: Rollout, som hanterar blue-green och canary-distributioner med olika konfigurationsalternativ.
Kontrollern Argo Rollouts, som anvÀnds av den anpassade resursen
Rollout,möjliggör ytterligare distributionsstrategier, sÄsom blue-green och canary för Kubernetes. ResursenRollouterbjuder funktionalitet jÀmförbar medDeployment, men med de extra distributionsstrategierna.
ResursDeploymentshar tvĂ„ strategier för distribution:RollingUpdateochRecreate. Ăven om dessa strategier passar för de flesta scenarier, anvĂ€nds extra strategier, sĂ„som blue-green eller canary, för distribution till servrar i mycket stor skala, vilket inte finns i Deployment-kontrollern. För att anvĂ€nda dessa strategier i Kubernetes var anvĂ€ndarna tvungna att skriva skript ovanpĂ„ sina Distributioner. Kontrollern Argo Rollouts tillhandahĂ„ller dessa strategier som enkla deklarativa anpassningsparametrar.
Det finns ocksÄ Argo CI, som erbjuder ett anvÀndarvÀnligt webbgrÀnssnitt för att anvÀndas tillsammans med Rollouts, vi kommer att titta pÄ det i nÀsta artikel.
Installation av Argo Rollouts
PĂ„ serversidan
kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml
I vÄrt infrastrukturrepo (se nedan) har vi redan lagt till install.yaml som i/k8s/argo-rollouts/install.yaml. SÄ GitlabCI kommer att installera det i klustret.
PĂ„ klientsidan (kubectl plugin)
Exempelapplikation
En god praxis Àr att ha separata arkiv för applikationskoden och för infrastrukturen.
Arkivet för applikationen
Detta Àr en mycket enkel API i Python+Flask som returnerar ett svar i JSON-format. Vi kommer att bygga paketet med GitlabCI och skicka resultatet till Gitlab Registry. I registret har vi tvÄ olika versionsslÀpp:
- wuestkamp/k8s-deployment-example-app:v1
- wuestkamp/k8s-deployment-example-app:v2
Den enda skillnaden mellan dem Àr den JSON-fil som returneras. Vi anvÀnder den hÀr applikationen för att pÄ ett sÄ enkelt sÀtt som möjligt visualisera vilken version vi kommunicerar med.
Infrastrukturens repository
I detta repository kommer vi att anvÀnda GitlabCI för deployment till Kubernetes, .gitlab-ci.yml ser ut som följer:
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:
- masterFö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.
du kan lÀsa om hur man fÄr autentisering för klustret (Gcloud).
Infrastrukturens Yaml
Inuti det infrastrukturella repositoryt har vi service:
apiVersion: v1
kind: Service
metadata:
labels:
id: rollout-canary
name: app
spec:
ports:
- port: 80
protocol: TCP
targetPort: 5000
selector:
id: app
type: LoadBalanceroch 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 kan manuellt Äterupptas genom att köra `kubectl argo rollouts promote ROLLOUT`
- pause: {}
- setWeight: 50
- pause: { duration: 120 } # tvÄ minuterRollout fungerar pÄ samma sÀtt som ett Deployment. Om vi inte anger en uppdateringsstrategi (som canary hÀr) kommer den att bete sig som en standard rolling-update Deployment.
Vi definierar tvÄ steg i yaml för canary deployment:
- 10% trafik till canary (vÀnta pÄ manuell OK)
- 50% trafik till canary (vÀnta 2 minuter och fortsÀtt till 100%)
Utför den initiala deploymenten
Efter den initiala deploymenten kommer vÄra resurser att se ut sÄ hÀr:

Och vi fÄr svar endast frÄn den första versionen av applikationen:

Utför Canary Deployment
Steg 1: 10% trafik
För att inleda canary-utplaceringen behöver vi bara Àndra versionen av bilden, precis som vi vanligtvis gör med deployment:
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
...Och vi pushar Àndringarna sÄ att Gitlab CI gör deployment och vi ser Àndringarna:

Just nu, om vi tillgÄr tjÀnsten:

Fantastiskt! Vi Àr mitt i vÄr canary deployment. Vi kan se framstegen genom att köra:
kubectl argo rollouts get rollout rollout-canary

Steg 2: 50% av trafiken:
Nu gÄr vi vidare till nÀsta steg: omdirigera 50% av trafiken. Vi har stÀllt in sÄ att detta steg startas manuellt:
kubectl argo rollouts promote rollout-canary # fortsÀtt till steg 2

Och vÄr applikation har returnerat 50% svar frÄn de nya versionerna:

Och översikten av rollout:

UtmÀrkt.
Steg 3: 100% av trafiken:
Vi har stÀllt in sÄ att steget med 50% automatiskt avslutas efter 2 minuter och steget med 100% startas:

Och applikationsutdata:

Och översikten av rollout:

Canary-deploymentet Àr komplett.
Fler exempel med Argo Rollouts
HÀr finns fler exempel, till exempel hur man konfigurerar förhandsgranskning av miljö och jÀmförelser baserade pÄ canary:
Video om Argo Rollouts och Argo CI
Jag rekommenderar verkligen denna video, som visar hur Argo Rollouts och Argo CI fungerar tillsammans:

Resultat
Jag gillar verkligen idén med att anvÀnda CRD:er som hanterar skapandet av ytterligare typer av deployments eller replicasets, omdirigerar trafik osv. Att arbeta med dem gÄr smidigt. Jag skulle vilja testa integrationen med Argo CI.
Men tydligen stÄr ett stort samgÄende mellan Argo CI och Flux CI för dörren, sÄ jag skulle kunna vÀnta pÄ att den nya versionen slÀpps: .
Har ni haft erfarenhet av Argo Rollouts eller Argo CI?
LÀs Àven andra artiklar i vÄr blogg:
KĂ€lla: habr.com
