Canary Deployment sa Kubernetes #1: Gitlab CI

Gamiton namo ang Gitlab CI ug manwal nga GitOps sa pagpatuman ug paggamit sa Canary deployment sa Kubernetes

Canary Deployment sa Kubernetes #1: Gitlab CI

Mga artikulo gikan niini nga serye:

Atong ipahigayon ang Canary deployment sa mano-mano pinaagi sa GitOps ug paghimo/pag-usab sa nag-unang Kubernetes resources. Kini nga artikulo gituyo alang sa pasiuna kung giunsa ang pag-deploy sa Kubernetes Canary, tungod kay adunay mas epektibo nga mga pamaagi sa automation, nga atong hisgotan sa mosunod nga mga artikulo.


Canary Deployment sa Kubernetes #1: Gitlab CI

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

Pag-deploy sa Canary

Uban sa estratehiya sa Canary, ang mga pag-update una nga gigamit sa usa lamang ka subset sa mga tiggamit. Pinaagi sa pagmonitor, log data, manual testing, o uban pang feedback channels, ang pagpagawas gisulayan sa dili pa kini ipagawas sa tanang tiggamit.

Kubernetes Deployment (rolling update)

Ang default nga estratehiya alang sa Kubernetes Deployment mao ang rolling-update, diin ang usa ka piho nga gidaghanon sa mga pod gilusad uban ang bag-ong mga bersyon sa mga hulagway. Kung gibuhat kini nga wala’y mga problema, ang mga pod nga adunay daan nga bersyon sa mga imahe gitapos, ug ang mga bag-ong pod gihimo nga managsama.

GitOps

Gigamit namo ang GitOps niini nga pananglitan tungod kay kami:

  • naggamit sa Git isip usa ka tinubdan sa kamatuoran
  • gigamit namo ang Git Operations alang sa pagtukod ug pag-deploy (walay mga sugo gawas sa git tag/merge ang gikinahanglan)

Pananglitan:

Atong buhaton ang usa ka maayong praktis - nga adunay usa ka repository alang sa code sa aplikasyon ug usa alang sa imprastraktura.

Repository sa aplikasyon

Kini usa ka yano nga Python + Flask API nga nagbalik usa ka tubag ingon JSON. Atong tukuron ang package pinaagi sa GitlabCI ug iduso ang resulta ngadto sa Gitlab Registry. Sa rehistro kami adunay duha ka lainlaing bersyon sa pagpagawas:

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

Ang bugtong kalainan tali kanila mao ang pagbag-o sa gibalik nga JSON file. Gigamit namon kini nga aplikasyon aron mahanduraw nga dali kutob sa mahimo kung unsang bersyon ang among gipakigsulti.

Repositori sa imprastraktura

Niini nga singkamas atong i-deploy pinaagi sa GitlabCI ngadto sa Kubernetes, .gitlab-ci.yml ingon niini:

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

Aron makadagan kini sa imong kaugalingon kinahanglan nimo ang usa ka cluster, mahimo nimong gamiton ang Gcloud:

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

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

Kinahanglan nimo nga tinidor https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure ug paghimo usa ka variable KUBECONFIG sa GitlabCI, nga maglangkob sa config alang sa pag-access kubectl sa imong cluster.

Mahimo nimong mabasa kung giunsa pagkuha ang mga kredensyal alang sa usa ka cluster (Gcloud) dinhi mismo.

Imprastraktura Yaml

Sa repository sa imprastraktura kami adunay serbisyo:

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

Ug deployment sa 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

Ug laing deployment sa 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

Timan-i nga ang app-deploy wala pa'y mga replika nga gihubit.

Pagbuhat sa inisyal nga pag-deploy

Aron masugdan ang inisyal nga pag-deploy, mahimo nimong sugdan ang GitlabCI pipeline nga mano-mano sa master branch. Human niadto kubectl kinahanglan nga output sa mosunod:

Canary Deployment sa Kubernetes #1: Gitlab CI

Atong makita app deployment nga adunay 10 ka replika ug app-canary nga adunay 0. Adunay usab LoadBalancer diin kita maka-access pinaagi sa curl pinaagi sa External IP:

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

Canary Deployment sa Kubernetes #1: Gitlab CI

Nakita namon nga ang among aplikasyon sa pagsulay nagbalik lamang sa "v1".

Pagpatuman sa Canary deployment

Lakang 1: buhian ang usa ka bag-ong bersyon alang sa pipila nga mga tiggamit

Gibutang namon ang gidaghanon sa mga replika sa 1 sa deploy-canary.yaml file ug ang bag-ong bersyon nga imahe:

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

Sa file deploy.yaml giusab namo ang gidaghanon sa mga replika sa 9:

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

Giduso namo kini nga mga pagbag-o sa repository diin magsugod ang pag-deploy (pinaagi sa GitlabCI) ug tan-awa ang resulta:

Canary Deployment sa Kubernetes #1: Gitlab CI

Ang among Serbisyo magpunting sa duha nga pag-deploy, tungod kay ang duha adunay tigpili sa app. Tungod sa default nga randomization sa Kubernetes, kinahanglan namong makita ang lainlaing mga tubag alang sa ~10% sa mga hangyo:

Canary Deployment sa Kubernetes #1: Gitlab CI

Ang kasamtangan nga kahimtang sa among aplikasyon (GitOps, gikuha gikan sa Git isip Usa ka Tinubdan sa Kamatuoran) mao ang presensya sa duha ka deployment nga adunay aktibong mga replika, usa alang sa matag bersyon.

~ 10% sa mga tiggamit nahimong pamilyar sa usa ka bag-ong bersyon ug wala tuyoa pagsulay niini. Karon na ang panahon sa pagsusi sa mga kasaypanan sa mga log ug pag-monitor sa datos aron makit-an ang mga problema.

Lakang 2: Ipagawas ang bag-ong bersyon sa tanang tiggamit

Nakahukom kami nga maayo ang tanan ug karon kinahanglan namon nga i-roll out ang bag-ong bersyon sa tanan nga tiggamit. Aron mahimo kini, nag-update lang kami deploy.yaml pagbutang og bag-ong bersyon sa hulagway ug ang gidaghanon sa mga replika nga katumbas sa 10. Sa deploy-canary.yaml atong gibutang ang gidaghanon sa mga replika balik sa 0. Human sa deployment, ang resulta mao ang mosunod:

Canary Deployment sa Kubernetes #1: Gitlab CI

Sa pag-summarize

Alang kanako, ang pagpadagan sa pag-deploy nga mano-mano niining paagiha makatabang aron masabtan kung unsa kadali kini ma-configure gamit ang k8s. Tungod kay gitugotan ka sa Kubernetes nga i-update ang tanan pinaagi sa usa ka API, kini nga mga lakang mahimong awtomatiko pinaagi sa mga script.

Ang laing butang nga kinahanglan ipatuman mao ang usa ka tester entry point (LoadBalancer o pinaagi sa Ingress) diin ang bag-ong bersyon lamang ang ma-access. Mahimo kini gamiton alang sa manual nga pag-browse.

Sa umaabot nga mga artikulo, among susihon ang ubang mga awtomatiko nga solusyon nga nagpatuman sa kadaghanan sa among nahimo.

Basaha usab ang ubang mga artikulo sa among blog:

Source: www.habr.com

Idugang sa usa ka comment