Canary Deployment Kubernetes'is #1: Gitlab CI

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

Canary Deployment Kubernetes'is #1: Gitlab CI

Selle tsĂŒkli artiklid:

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 Deployment Kubernetes'is #1: Gitlab CI

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

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:v1
  • wuestkamp/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:80

Peate tegema forki https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure ja looma muutujat KUBECONFIG GitlabCI-s, mis sisaldab konfi ligipÀÀsuks kubectl teie klastrile.

Kuidas saada Gcloud'i jaoks mingeid andmeid klastrile, saab lugeda siit.

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: LoadBalancer

Ja 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: 100Mi

Ja 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: 100Mi

Pange 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:

Canary Deployment Kubernetes'is #1: Gitlab CI

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

Canary Deployment Kubernetes'is #1: Gitlab CI

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

Failis 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:

Canary Deployment Kubernetes'is #1: Gitlab CI

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:

Canary Deployment Kubernetes'is #1: Gitlab CI

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:

Canary Deployment Kubernetes'is #1: Gitlab CI

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

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster