Me kasutame Gitlab CI ja kÀsitsi GitOps'i, et rakendada ja kasutada Canary-deployd Kubernetesis.

Selle tsĂŒkli artiklid:
- (see artikkel)
- Canary Deployment Istio abil
- Canary Deployment Jenkins-X Istio Flagger abil
Canary-deployd teeme kÀsitsi lÀbi GitOps'i ja Kubernetes'i pÔhivormide loomise/muutmise. See artikkel on mÔeldud esmalt tutvumiseks sellega, kuidas Kubernetesis Canary-deploy toimib, kuna on olemas tÔhusamaid automatiseerimise viise, millega tutvume jÀrgmistes Artiklites.

Canary deploy
Canary-strateegia uuendamisel rakendatakse esmalt muudatused vaid osale kasutajatest. JÀlgimise, logide andmete, kÀsitsi testimise vÔi muude tagasisidekanalite kaudu testitakse vabanemist enne selle rakendamist kÔigile kasutajatele.
Kubernetes Deployment (rolling update)
Kubernetes Deployment'i vaikestrateegia on rolling-update, kus kÀivitatakse kindel arv pod'e uute versioonide piltidega. Kui need luuakse ilma probleemideta, lÔpetatakse vanade versioonide pod'id ning uued pod'id luuakse paralleelselt.
GitOps
Kasutame selles nÀites GitOps'i, kuna:
- kasutame Git'i ainusena tÔena
- kasutame Git Operations'i koostamiseks ja deploy'imiseks (muid kÀske, vÀlja arvatud git tag/merge, ei ole vaja)
NĂ€ide
VĂ”tame hea praktikana ĂŒhe repozitooriumi rakenduste koodi ja ĂŒhe infrastruktuuri jaoks.
Rakenduste repozitoorium
See on vĂ€ga lihtne API Python+Flaski peal, mis tagastab vastuse JSON-vormingus. Me koostame paketi lĂ€bi GitlabCI ja lĂŒkkame tulemuse Gitlab Registry'sse. Meie registris on kaks erinevat versiooni:
wuestkamp/k8s-deployment-example-app:v1wuestkamp/k8s-deployment-example-app:v2
Ainuke erinevus nende vahel on muutus tagastatavas JSON-failis. Kasutame seda rakendust vÔimalikult lihtsa visualiseerimise jaoks, millise versiooniga me suhtleme.
Infrastruktuuri hoidla
Selles repozitooriumis deploy'ime lÀbi GitlabCI Kubernetesisse, .gitlab-ci.yml on jÀrgmisel kujul:
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
Selle iseseisvaks kÀitamiseks vajate klastri, saate kasutada Gcloudi:
gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80Peate tegema forki ja looma muutujat KUBECONFIG GitlabCI-s, mis sisaldab konfi ligipÀÀsuks kubectl teie klastrile.
Kuidas saada Gcloud'i jaoks mingeid andmeid klastrile, saab lugeda .
Infrastruktuuri Yaml
Infrastruktuuri repozitooriumis on meil teenus:
apiVersion: v1
kind: Service
metadata:
labels:
id: app
name: app
spec:
ports:
- port: 80
protocol: TCP
targetPort: 5000
selector:
id: app
type: LoadBalancerJa deployment failis 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: 100MiJa teine deployment 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: 100MiPange tÀhele, et app-deploy'il ei ole veel mÀÀratletud replikate.
Esialgse deployimise teostamine
Esialgse deploymentâi kĂ€ivitamiseks vĂ”ite kĂ€sitleda GitlabCI toru manuaalselt master haru. PĂ€rast seda kubectl peab see ĐČŃĐČoda jĂ€rgmist:

Me nÀeme app deployment 10 replikaga ja app-canary 0-ga. Samuti on LoadBalancer, mille kaudu saame pöörduda curl External IP kaudu:
while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done

Me nÀeme, et meie testrakendus tagastab ainult "v1".
Canary deploy'i teostamine
Samm 1: vabastada uus versioon osa kasutajatele
Oleme seadnud replikate arvu 1 failis deploy-canary.yaml ja uue versiooni kujundi:
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: 100MiFailis deploy.yaml me muutsime replikate arvu 9-ni:
kind: Deployment
metadata:
name: app
spec:
replicas: 9
selector:
matchLabels:
id: app
...Me pushime need muudatused reposse, millest kÀivitub deploy (lÀbi GitlabCI) ja nÀeme tulemuseks:

Meie teenus osutab mÔlemale deployment'ile, kuna kummalgi on selektor app. Juhusliku jaotuse tÔttu Kubernetes'is peaksime nÀgema erinevaid vastuseid umbes 10% pÀringutest:

Praegune seis meie rakendusest (GitOps, mis on vĂ”etud Gitâist kui Ainsast TĂ”esusallikast) on kahe deployment'i olemasolu aktiivsete replikatega, ĂŒks iga versiooni jaoks.
~10% kasutajatest tutvuvad uue versiooniga ja testivad seda tahtmatult. NĂŒĂŒd on aeg kontrollida vigade olemasolu logides ja jĂ€lgimisandmetes probleemide leidmiseks.
Samm 2: vabastada uus versioon kÔigile kasutajatele
Oleme otsustanud, et kĂ”ik lĂ€ks hĂ€sti ja nĂŒĂŒd peame uue versiooni kĂ”ikidele kasutajatele vĂ€lja laskma. Selleks uuendame lihtsalt deploy.yaml uust versiooni kujundi ja replikate arvu, mis on 10. JĂ€rgmine deploy-canary.yaml me seadistame koopia arvu 0-le. PĂ€rast juurutamist on tulemus jĂ€rgmine:

KokkuvÔtteks
Minu jaoks aitab kÀsitsi juurutuse kÀivitamine selliselt mÔista, kui lihtsalt saab seda k8s-i kaudu seadistada. Kuna Kubernetes vÔimaldab kÔike API kaudu uuendada, saab neid samme automatiseerida skriptide kaudu.
Veel ĂŒks asi, mida on vaja ellu viia â testija sisenemispunkt (LoadBalancer vĂ”i Ingress kaudu), mille kaudu pÀÀseb juurde ainult uuele versioonile. Seda saab kasutada kĂ€sitsi vaatamiseks.
JĂ€rgmistes artiklites vaatame ĂŒle teised automatiseeritud lahendused, mis rakendavad enamiku sellest, mida me tegime.
Vaata ka teisi artikleid meie blogis:
Allikas: habr.com
