Canary Deployment hauv Kubernetes #1: Gitlab CI

Peb yuav siv Gitlab CI thiab phau ntawv GitOps los siv thiab siv Canary xa tawm hauv Kubernetes

Canary Deployment hauv Kubernetes #1: Gitlab CI

Cov ntsiab lus ntawm no series:

Peb yuav ua Canary xa tawm manually ntawm GitOps thiab tsim / hloov kho cov peev txheej Kubernetes tseem ceeb. Kab lus no yog npaj rau kev taw qhia nrog kev xa mus ua haujlwm li cas hauv Kubernetes Canary, vim tias muaj ntau txoj hauv kev zoo ntawm automation, uas peb yuav xav txog hauv cov lus hauv qab no.


Canary Deployment hauv Kubernetes #1: Gitlab CI

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

Canary Deployment

Nrog Canary lub tswv yim, kev hloov tshiab yog thawj zaug siv rau tsuas yog ib pawg ntawm cov neeg siv. Los ntawm kev saib xyuas, cov ntaub ntawv teev tseg, kev ntsuas phau ntawv, lossis lwm cov lus tawm tswv yim, kev tso tawm raug sim ua ntej nws tso tawm rau txhua tus neeg siv.

Kubernetes Deployment (dov hloov tshiab)

Lub tswv yim zoo rau Kubernetes Deployment yog dov-hloov tshiab, qhov twg qee tus naj npawb ntawm cov pods tau pib nrog cov qauv tshiab ntawm cov duab. Yog tias lawv tau tsim yam tsis muaj teeb meem, cov pods nrog cov qauv qub ntawm cov duab raug txiav tawm, thiab cov pods tshiab yog tsim nyob rau tib lub sijhawm.

GitOps

Peb siv GitOps hauv qhov piv txwv no vim peb:

  • siv Git raws li ib qho ntawm qhov tseeb
  • peb siv Git Kev Ua Haujlwm rau kev tsim thiab xa tawm (tsis muaj cov lus txib uas tsis yog git tag / sib koom ua ke)

Piv Txwv:

Cia peb ua qhov kev coj ua zoo - kom muaj ib qho chaw cia rau daim ntawv thov code thiab ib qho rau kev tsim kho vaj tse.

Daim ntawv thov repository

Qhov no yog qhov yooj yim heev Python + Flask API uas rov qab teb raws li JSON. Peb yuav tsim lub pob ntawm GitlabCI thiab thawb cov txiaj ntsig mus rau Gitlab Registry. Hauv kev sau npe peb muaj ob qhov kev tso tawm sib txawv:

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

Qhov sib txawv ntawm lawv tsuas yog qhov hloov pauv hauv JSON cov ntaub ntawv rov qab. Peb siv daim ntawv thov no kom pom tau yooj yim li sai tau uas peb tab tom tham nrog.

Infrastructure repository

Hauv no turnip peb yuav xa tawm ntawm GitlabCI rau Kubernetes, .gitlab-ci.yml zoo li no:

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

Txhawm rau khiav koj tus kheej koj yuav xav tau pawg, koj tuaj yeem siv Gcloud:

gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b

gcloud compute firewall-rules create incoming-80 --allow tcp:80

Koj yuav tsum fork https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure thiab tsim qhov sib txawv KUBECONFIG hauv GitlabCI, uas yuav muaj cov config rau kev nkag kubectl rau koj pawg.

Koj tuaj yeem nyeem txog yuav ua li cas kom tau txais daim ntawv pov thawj rau pawg (Gcloud) nyob ntawm no.

Infrastructure Yaml

Nyob rau hauv lub infrastructure repository peb muaj kev pab:

apiVersion: v1
kind: Service
metadata:
 labels:
   id: app
 name: app
spec:
 ports:
 - port: 80
   protocol: TCP
   targetPort: 5000
 selector:
   id: app
 type: LoadBalancer

Thiab kev xa mus rau hauv 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

Thiab lwm qhov kev xa tawm hauv 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

Nco ntsoov tias app-deploy tsis muaj ib qho replicas txhais tsis tau.

Ua qhov pib xa tawm

Txhawm rau pib qhov kev xa tawm thawj zaug, koj tuaj yeem pib GitlabCI pipeline manually ntawm tus tswv ceg. Tom qab ntawd kubectl yuav tsum tso cov hauv qab no:

Canary Deployment hauv Kubernetes #1: Gitlab CI

Peb pom app xa mus nrog 10 replicas thiab app-canary nrog 0. Kuj tseem muaj LoadBalancer uas peb tuaj yeem nkag tau los ntawm curl ntawm tus IP sab nraud:

while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done

Canary Deployment hauv Kubernetes #1: Gitlab CI

Peb pom tias peb daim ntawv thov xeem tsuas yog rov qab "v1".

Ua haujlwm Canary xa tawm

Kauj ruam 1: tso tawm ib tug tshiab version rau qee cov neeg siv

Peb teeb tus naj npawb ntawm replicas rau 1 hauv deploy-canary.yaml cov ntaub ntawv thiab cov duab tshiab:

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

Hauv cov ntaub ntawv deploy.yaml Peb hloov tus naj npawb ntawm replicas rau 9:

kind: Deployment
metadata:
 name: app
spec:
 replicas: 9
 selector:
   matchLabels:
     id: app
...

Peb thawb cov kev hloov pauv no mus rau qhov chaw cia khoom los ntawm qhov kev xa tawm yuav pib (ntawm GitlabCI) thiab pom qhov tshwm sim:

Canary Deployment hauv Kubernetes #1: Gitlab CI

Peb Cov Kev Pabcuam yuav taw qhia rau ob qho kev xa tawm, txij li ob qho tib si muaj tus xaiv app. Vim Kubernetes 'default randomization, peb yuav tsum pom cov lus teb sib txawv rau ~ 10% ntawm kev thov:

Canary Deployment hauv Kubernetes #1: Gitlab CI

Lub xeev tam sim no ntawm peb daim ntawv thov (GitOps, coj los ntawm Git raws li Ib Qhov Tseeb Ntawm Qhov Tseeb) yog qhov muaj ob qhov kev xa tawm nrog cov khoom siv ua haujlwm, ib qho rau txhua qhov version.

~ 10% ntawm cov neeg siv paub txog qhov tshiab thiab tsis txhob txwm sim nws. Tam sim no yog lub sijhawm los kuaj xyuas qhov tsis raug hauv cov cav thiab saib xyuas cov ntaub ntawv kom pom cov teeb meem.

Kauj ruam 2: Tso tawm tus tshiab version rau txhua tus neeg siv

Peb txiav txim siab tias txhua yam mus zoo thiab tam sim no peb yuav tsum tau dov tawm cov tshiab version rau txhua tus neeg siv. Ua li no peb tsuas hloov kho deploy.yaml txhim kho ib tug tshiab version ntawm daim duab thiab tus naj npawb ntawm replicas sib npaug rau 10. Nyob rau hauv deploy-canary.yaml peb teem tus naj npawb ntawm replicas rov qab rau 0. Tom qab xa mus, cov txiaj ntsig yuav ua raws li hauv qab no:

Canary Deployment hauv Kubernetes #1: Gitlab CI

Summing txog

Rau kuv, khiav kev xa tawm manually txoj kev no yuav pab kom nkag siab yooj yim npaum li cas nws tuaj yeem teeb tsa siv k8s. Txij li thaum Kubernetes tso cai rau koj hloov kho txhua yam ntawm API, cov kauj ruam no tuaj yeem ua haujlwm los ntawm cov ntawv sau.

Lwm yam uas yuav tsum tau muab coj los siv yog qhov ntsuas nkag nkag (LoadBalancer lossis ntawm Ingress) los ntawm qhov uas tsuas yog cov ntawv tshiab tuaj yeem nkag mus. Nws tuaj yeem siv rau phau ntawv browsing.

Hauv cov ntawv yav tom ntej, peb yuav txheeb xyuas lwm cov kev daws teeb meem uas siv feem ntau ntawm peb tau ua.

Kuj nyeem lwm cov ntawv hauv peb blog:

Tau qhov twg los: www.hab.com

Ntxiv ib saib