Canary juurutamine Kuberneteses #1: Gitlab CI

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

Canary juurutamine Kuberneteses #1: Gitlab CI

Selle artikli seeria:

Canary-deployd teeme kÀsitsi lÀbi GitOps'i ja Kubernetes'i peamiste ressursside loomise/muutmise. See artikkel on suunatud peamiselt selle tutvustamiseks, kuidas Kuberneteses Canary-deploy toimib, kuna on olemas tÔhusamad automaatimise viisid, mida kÀsitleme jÀrgmistes artiklites.


Canary juurutamine Kuberneteses #1: Gitlab CI

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

Canary juurutamine

Canary-strateegia puhul rakendatakse uuendused esmalt ainult osa kasutajatele. JÀlgimise, logiandmete, kÀsitsi testimise vÔi teiste tagasiside kanalite kaudu testitakse vÀljaanne 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 piltide versioonidega. Kui need loodi probleemideta, lÔpetatakse vanade piltide pod'id ja uued pod'id luuakse paralleelselt.

GitOps

Kasutame GitOps'i selles nÀites, kuna me:

  • kasutame Git'i kui ainsat tĂ”e allikat.
  • kasutame Git Operations'i ehitamiseks ja juurutamiseks (vĂ€lja arvatud git tag/merge, pole muid kĂ€ske vajalik)

NĂ€ide

LĂ€hme head praktikat — omame ĂŒhte hoidlat rakenduste koodi jaoks ja ĂŒhte infrastruktuuri jaoks.

Rakenduste hoidla

See on vÀga lihtne API Python+Flask'il, mis tagastab vastuse JSON-vormingus. Me ehitame paketi lÀbi GitlabCI ja viime tulemuse Gitlabi registrisse. Registris on meil kaks erinevat versiooni vÀljalaskest:

  • wuestkamp/k8s-deployment-example-app:v1
  • wuestkamp/k8s-deployment-example-app:v2

Ainus erinevus nende vahel on muutus tagastatud JSON-failis. Kasutame seda rakendust maksimaalselt lihtsa visualiseerimise jaoks, et nÀha, millega versiooniga me suhtleme.

Infrastruktuuri register

Selles hoidlas viime juurutamise lÀbi GitlabCI Kubernetesesse, .gitlab-ci.yml see 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:
     - master

Selle 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:80

Te peate tegema forki https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure ja looma muutuja KUBECONFIG GitlabCI-s, mis sisaldab konfiguraatiot juurdepÀÀsu jaoks kubectl teie klastrile.

Kuidas saada klastrile (Gcloud) autentimist saate lugeda siit.

Infrastruktuuri Yaml

Meie infrastruktuuri hoidlas 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 juurutamine 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 on 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 praegu mÀÀratud replikate arvu.

Algse deploy kÀitamine

Algse deployment'i kÀivitamiseks saate kÀsitsi kÀivitada GitlabCI toru peaharus. PÀrast seda kubectl see peaks vÀljundama jÀrgmist:

Canary juurutamine Kuberneteses #1: Gitlab CI

NÀeme app deployment't 10 replikaga ja app-canary't 0. Samuti on olemas 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 juurutamine Kuberneteses #1: Gitlab CI

NĂ€eme, et meie testrakendus tagastab ainult "v1".

Canary deployment'i teostamine

Samm 1: vabasta uus versioon osale kasutajatele

Oleme mÀÀranud replikate arvu 1 failis deploy-canary.yaml ja uus versioonipilt:

tĂŒĂŒp: Deployment
metainfo:
 nimi: app-canary
spetsifikatsioon:
 replikad: 1
 valija:
   vasteSildid:
     id: app
     tĂŒĂŒp: canary
 mall:
   metainfo:
     sildid:
       id: app
       tĂŒĂŒp: canary
   spetsifikatsioon:
     konteinerid:
     - pilt: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
       nimi: app
       ressursid:
         piirangud:
           cpu: 100m
           mÀlu: 100Mi

Failis deploy.yaml me oleme muutnud replikate arvu 9-ks:

tĂŒĂŒp: Deployment
metainfo:
 nimi: app
spetsifikatsioon:
 replikad: 9
 valija:
   vasteSildid:
     id: app
...

Me viime need muudatused hoidlasse, kust kÀivitatakse deploy (GitlabCI kaudu) ja nÀeme lÔpuks:

Canary juurutamine Kuberneteses #1: Gitlab CI

Meie teenus osutab mĂ”lemale deploy-le, kuna mĂ”lemal on id-aplikaator. Kuberneetilises sĂŒsteemis toimiva juhusliku jaotuse tĂ”ttu peaksime nĂ€gema erinevaid vastuseid umbes 10% pĂ€ringutest:

Canary juurutamine Kuberneteses #1: Gitlab CI

Meie rakenduse praegune olek (GitOps, mis on saadud Gitist kui ainus tĂ”eallikas) on kahe aktiivse replikaga deployment - iga versiooni jaoks ĂŒks.

~10% kasutajatest tutvuvad uue versiooniga ja testivad seda tahtmatult. On aeg kontrollida logides ja monitooringu andmetes vigu 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Ă”igile kasutajatele installima. Selleks uuendame lihtsalt deploy.yaml seadmise uus versioon ja replikate arv on 10. V deploy-canary.yaml seame replikate arvu tagasi 0. PĂ€rast juurutamist on tulemus jĂ€rgmine:

Canary juurutamine Kuberneteses #1: Gitlab CI

KokkuvÔtteks

Minu jaoks aitab kÀsitsi juurutamine mÔista, kui lihtsalt seda saab k8si abil seadistada. Kuna Kubernetes vÔimaldab kÔike uuendada API kaudu, saab neid samme automatiseerida skriptide abil.

Veel ĂŒks asi, mida tuleb ellu viia — on testija sisenemispunkt (LoadBalancer vĂ”i Ingressi kaudu), mille kaudu saab juurde pÀÀseda ainult uuele versioonile. Seda vĂ”ib kasutada kĂ€sitsi vaatamiseks.

JĂ€rgmistes artiklites uurime muid automatiseeritud lahendusi, mis rakendavad enamikku meie tehtust.

Vaata ka teisi artikleid meie blogis:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster