Hoʻokomo ʻia ʻo Canary ma Kubernetes #1: Gitlab CI

E hoʻohana mākou iā Gitlab CI a me GitOps manual e hoʻokō a hoʻohana i ka hoʻolaha ʻana o Canary ma Kubernetes

Hoʻokomo ʻia ʻo Canary ma Kubernetes #1: Gitlab CI

Nā ʻatikala mai kēia pūʻulu:

E hana mākou i ka hoʻoili lima ʻana o Canary ma o GitOps a me ka hoʻokumu ʻana/hoʻololi ʻana i nā kumuwaiwai Kubernetes nui. Kuhi ʻia kēia ʻatikala no ka hoʻomaka ʻana me ke ʻano o ka hana ʻana ma Kubernetes Canary, no ka mea, aia nā ala ʻoi aku ka maikaʻi o ka automation, a mākou e noʻonoʻo ai i nā ʻatikala aʻe.


Hoʻokomo ʻia ʻo Canary ma Kubernetes #1: Gitlab CI

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

Hoʻokomo Canary

Me ka hoʻolālā Canary, hoʻohana mua ʻia nā mea hou i kahi ʻāpana o nā mea hoʻohana. Ma o ka nānā ʻana, ka ʻikepili log, ka hoʻāʻo lima, a i ʻole nā ​​ala pane ʻē aʻe, hoʻāʻo ʻia ka hoʻokuʻu ʻana ma mua o ka hoʻokuʻu ʻia ʻana i nā mea hoʻohana āpau.

Kubernetes Deployment (hōʻano hou ʻia)

ʻO ka hoʻolālā paʻamau no ka Kubernetes Deployment he rolling-update, kahi i hoʻokuʻu ʻia ai kekahi helu o nā pods me nā mana hou o nā kiʻi. Inā hana ʻia lākou me ka pilikia ʻole, hoʻopau ʻia nā pods me nā kiʻi kahiko, a hana ʻia nā pods hou i ka like.

GitOps

Hoʻohana mākou iā GitOps i kēia hiʻohiʻona no ka mea:

  • e hoʻohana ana iā Git i kumu hoʻokahi o ka ʻoiaʻiʻo
  • hoʻohana mākou i nā hana Git no ke kūkulu ʻana a me ka hoʻolaha ʻana (ʻaʻohe kauoha ʻē aʻe ma mua o ka git tag / merge pono)

Pākuhi:

E hoʻomaʻamaʻa maikaʻi kāua - e loaʻa i hoʻokahi waihona no ke code noi a hoʻokahi no ka ʻoihana.

Waihona palapala noi

He Python + Flask API maʻalahi kēia e hoʻihoʻi i kahi pane e like me JSON. E kūkulu mākou i ka pōʻai ma o GitlabCI a pana i ka hopena i ka Registry Gitlab. I loko o ke kākau inoa ʻelua mau mana hoʻokuʻu ʻokoʻa:

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

ʻO ka ʻokoʻa wale nō ma waena o lākou ʻo ka hoʻololi ʻana i ka faila JSON i hoʻihoʻi ʻia. Hoʻohana mākou i kēia noi e ʻike maʻalahi i ka mana a mākou e kamaʻilio nei.

Hale waihona waiwai

Ma kēia turnip e hoʻokau mākou ma o GitlabCI i Kubernetes, .gitlab-ci.yml penei:

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

No ka holo ʻana iā ʻoe iho, pono ʻoe i kahi puʻupuʻu, hiki iā ʻoe ke hoʻohana iā Gcloud:

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

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

Pono ʻoe e ʻoki https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure a hana i ka hoololi KUBECONFIG i GitlabCI, kahi e loaʻa ai ka config no ke komo kubectl i kāu hui.

Hiki iā ʻoe ke heluhelu e pili ana i ka loaʻa ʻana o nā hōʻoia no kahi pūʻulu (Gcloud) Aia maanei.

ʻOihana Yaml

I loko o ka waihona waiwai i loaʻa iā mākou ka lawelawe:

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

A hoʻokomo ʻia i loko 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

A ʻo kahi hoʻolaha ʻē aʻe i loko 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

E hoʻomanaʻo ʻaʻole i wehewehe ʻia ka app-deploy.

Ke hana nei i ka hoʻolaha mua ʻana

No ka hoʻomaka ʻana i ka hana mua, hiki iā ʻoe ke hoʻomaka i ka pipeline GitlabCI me ka lima ma ka lālā kumu. Ma hope o kēlā kubectl pono e hoʻopuka i kēia mau mea:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #1: Gitlab CI

ʻIke mākou app deployment me 10 replicas a me app-canary me 0. Aia kekahi LoadBalancer kahi e hiki ai iā mākou ke komo ma o curl ma o waho IP:

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

Hoʻokomo ʻia ʻo Canary ma Kubernetes #1: Gitlab CI

ʻIke mākou ua hoʻihoʻi wale kā mākou noi hōʻike "v1".

Ke hoʻokō nei i ka hoʻolaha Canary

KaʻAnuʻu Hana 1: hoʻokuʻu i kahi mana hou no kekahi mau mea hoʻohana

Hoʻonoho mākou i ka helu o nā replicas i 1 ma ka faila deploy-canary.yaml a me ke kiʻi mana hou:

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

Ma ka waihona deploy.yaml Ua hoʻololi mākou i ka helu o nā replicas i 9:

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

Paipai mākou i kēia mau hoʻololi i ka waihona kahi e hoʻomaka ai ka hoʻoili ʻana (ma GitlabCI) a ʻike i ka hopena:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #1: Gitlab CI

E kuhikuhi kā mākou lawelawe i nā hoʻolālā ʻelua, no ka mea, aia nā mea ʻelua i ka mea koho app. Ma muli o ka hoʻololi ʻana o Kubernetes, pono mākou e ʻike i nā pane like ʻole no ~10% o nā noi:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #1: Gitlab CI

ʻO ke kūlana o kēia manawa o kā mākou noi (GitOps, i lawe ʻia mai Git ma ke ʻano he kumu hoʻokahi o ka ʻoiaʻiʻo) ʻo ia ka loaʻa ʻana o ʻelua hoʻolālā me nā replicas ikaika, hoʻokahi no kēlā me kēia mana.

~ 10% o nā mea hoʻohana e kamaʻāina me kahi mana hou a hoʻāʻo ʻole ʻia. ʻO ka manawa kēia e nānā ai i nā hewa i nā lāʻau a me ka nānā ʻana i ka ʻikepili e ʻike i nā pilikia.

KaʻAnuʻu Hana 2: E hoʻokuʻu i ka mana hou i nā mea hoʻohana a pau

Ua hoʻoholo mākou ua holo maikaʻi nā mea āpau a i kēia manawa pono mākou e ʻōwili i ka mana hou i nā mea hoʻohana āpau. No ka hana ʻana i kēia, hoʻonui wale mākou deploy.yaml hoʻokomo i kahi mana hou o ke kiʻi a me ka helu o nā replicas like me 10. In deploy-canary.yaml hoʻonoho mākou i ka helu o nā replicas i 0. Ma hope o ka hoʻolaha ʻana, penei ka hopena:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #1: Gitlab CI

E hōʻuluʻulu

Noʻu, ʻo ka holo ʻana i ka hoʻoili lima me kēia ala e kōkua i ka hoʻomaopopo ʻana i ka maʻalahi hiki ke hoʻonohonoho ʻia me ka hoʻohana ʻana i k8s. Ma muli o ka ʻae ʻana o Kubernetes iā ʻoe e hoʻololi i nā mea āpau ma o ka API, hiki ke hoʻohana ʻia kēia mau ʻanuʻu ma o nā palapala.

ʻO kahi mea ʻē aʻe e pono e hoʻokō ʻia he wahi hōʻike hōʻike (LoadBalancer a i ʻole ma o Ingress) kahi e hiki ai ke komo i ka mana hou. Hiki ke hoʻohana ʻia no ka mākaʻikaʻi lima.

Ma nā ʻatikala e hiki mai ana, e nānā mākou i nā hoʻonā ʻokoʻa ʻē aʻe e hoʻokō i ka hapa nui o nā mea a mākou i hana ai.

E heluhelu pū i nā ʻatikala ʻē aʻe ma kā mākou blog:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka