Kasutame k8s-põhist Argo Rolloutsi ja GitlabCI, et käivitada Canary juurutamine Kuberneteses.

Selle tsükli artiklid
- (See artikkel)
- Canary juurutamine Istio abil
- Canary juurutamine Jenkins-X Istio Flaggeriga
Canary juurutamine
Loodame, et olete lugenud , kus selgitasime lühidalt, mis on Canary juurutamised. Näitasime ka, kuidas seda rakendada Kubernetesese standardseteressursside abil.
Argo Rollouts
Argo Rollouts on Kubernetes-põhine juurutuskontroller. See pakub CRD (Custom Resource Definition) Kubernetesese jaoks. Tänu sellele saame kasutada uut üksust: Rollout, mis haldab blue-green ja canary juurutamisi erinevate seadistuste variantidega.
Argo Rolloutsi kontroller, mida kasutatakse kohandatud ressursi
Rollout,lubab kasutada täiendavaid juurutamisstrateegiaid, nagu blue-green ja canary Kuberneteses. RessurssRolloutpakub funktsiooni, mis on võrdneDeployment, kuid koos täiendavate juurutamisstrateegiatega.
RessurssDeploymentson kaks juurutamisstrateegiat:RollingUpdatejaRecreate. Kuigi need strateegiad sobivad enamiku juhtumite jaoks, kasutatakse väga suures ulatuses serverite juurutamiseks täiendavaid strateegiaid, nagu blue-green või canary, mida Deploymenti kontrolleris ei ole. Kuberneteses nende strateegiate kasutamiseks pidid kasutajad kirjutama skripte oma Deployments'i peale. Argo Rollouts kontroller pakub neid strateegiaid lihtsate deklareerimisvõimaluste kaudu.
On olemas ka Argo CI, mis pakub mugavat veebiliidest Rollouts'i koos kasutamiseks, sellele heidame järgmises artiklis pilgu.
Argo Rollouts'i installimine
Serveri küljes
kubectl create namespace argo-rollouts kubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml
Meie infrastruktuuri reposes (vt allpool) oleme juba lisanud install.yaml failina i/k8s/argo-rollouts/install.yaml. Seega installib GitlabCI selle klastrisse.
Kliendi küljes (kubectl plugin)
Näidisrakendus
Hea tava on omada eraldi repositooriume rakenduskoodile ja infrastruktuurile.
Rakenduse repositoorium
See on väga lihtne API Python+Flaski peal, mis tagastab vastuse JSON-vormingus. Me koostame paketi, kasutades GitlabCI ja avaldame tulemuse Gitlabi registrisse. Registris on meil kaks erinevat versiooni väljalasketest:
- wuestkamp/k8s-deployment-example-app:v1
- wuestkamp/k8s-deployment-example-app:v2
Ainuke erinevus nende vahel on tagastatav JSON-fail. Me kasutame seda rakendust, et maksimaalselt lihtsalt visualiseerida, millise versiooniga me suhtleme.
Infrastruktuuri register
Selles registris kasutame GitlabCI-d Kubernetesesse juurutamiseks, .gitlab-ci.yml näeb välja järgmine:
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:
- masterSelle käivitamiseks iseseisvalt vajate klastrit, võite kasutada Gcloudi:
gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80Te peate tegema forki ja looma muutuja KUBECONFIG GitlabCI-s, mis sisaldab konfiguraatiot juurdepääsu jaoks kubectl teie klastrile.
saate lugeda sellest, kuidas saada klassriigi (Gcloud) mandaate.
Infrastruktuuri Yaml
Infrastruktuuri registris on meil service:
apiVersion: v1
kind: Service
metadata:
labels:
id: rollout-canary
name: app
spec:
ports:
- port: 80
protocol: TCP
targetPort: 5000
selector:
id: app
type: LoadBalancerja 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 minutesRollout käitub sama moodi nagu Deployment. Kui me ei defineeri värskenduse strateegiat (nagu canary siin), siis käitub see kui vaikimisi rolling-update Deployment.
Määratleme kaks sammu yaml-is canary deployment'i jaoks:
- 10% liiklusest canary jaoks (ootame manualset heakskiitu)
- 50% liiklusest canary jaoks (ootame 2 minutit ja siis jätkame 100% peale)
Algse deploy käitamine
Pärast algset deploy'd näevad meie ressursid välja nii:

Ja saame vastuse ainult rakenduse esimeselt versioonilt:

Teeme Canary Deployment'i
Samm 1: 10% liiklusest
Canary deploy’d käivitamiseks peame lihtsalt muutma pildi versiooni, nagu me tavaliselt deploy’de puhul teeme:
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
...Ja me teeme muudatusi, seega GitLab CI teeb rakenduse juurutamise ja me näeme muudatusi:

Praegu, kui me pöördume teenuse poole:

Suurepärane! Oleme meie canary juurutamise keskel. Saame näha, kuidas see edeneb, käivitades:
kubectl argo rollouts get rollout rollout-canary

Samm 2: 50% liiklus:
Nüüd liigume järgmise sammu juurde: suunamine 50% liiklusest. Oleme seadistanud nii, et see samm käivitub käsitsi:
kubectl argo rollouts promote rollout-canary # jätka sammu 2

Ja meie rakendus tagastas 50% vastustest uutelt versioonidelt:

Ja ülevaade juurutamisest:

Suurepärane.
Samm 3: 100% liiklus:
Oleme seadistanud nii, et kahe minuti pärast lõpetatakse 50% samm automaatselt ja käivitatakse 100% samm:

Ja rakenduse väljund:

Ja ülevaade juurutamisest:

Canary juurutamine on lõpetatud.
Veel näiteid Argo Rollouts'ist
Siin on veel näiteid, näiteks kuidas seadistada keskkonna eelvaateid ja võrdlusi, mis põhinevad canary:
Video Argo Rollouts'ist ja Argo CI-st
Soovitan seda videot, kus näidatakse, kuidas Argo Rollouts ja Argo CI töötavad koos:

Kokkuvõte
Mulle meeldib väga idee kasutada CRDe, mis haldavad uute tüüpi väljalaskmise või replikaatide loomist, suunavad liiklust jne. Töö nende kallal sujub hästi. Jätkuks sooviksin testida integreerimist Argo CI-ga.
Siiski tundub, et toimub suur ühinemine Argo CI ja Flux CI vahel, seega võiksin oodata, kuni uus versioon välja tuleb: .
Kas teil on kogemusi Argo Rollouts või Argo CI-ga?
Vaata ka teisi artikleid meie blogis:
Allikas: habr.com
