Ҷойгиркунии Канария дар Кубернетес №1: Gitlab CI

Мо Gitlab CI ва GitOps-ро барои амалӣ ва истифодаи густариши Canary дар Kubernetes истифода хоҳем кард

Ҷойгиркунии Канария дар Кубернетес №1: Gitlab CI

Мақолаҳо аз ин силсила:

Мо ҷойгиркунии Canary-ро тавассути GitOps дастӣ иҷро мекунем ва захираҳои асосии Kubernetes-ро эҷод/тағйир медиҳем. Ин мақола пеш аз ҳама барои муқаддима пешбинӣ шудааст бо чӣ гуна ҷойгиркунӣ дар Kubernetes Canary кор мекунад, зеро усулҳои самараноки автоматикунонӣ мавҷуданд, ки мо дар мақолаҳои зерин баррасӣ хоҳем кард.


Ҷойгиркунии Канария дар Кубернетес №1: Gitlab CI

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

Ҷойгиркунии Канария

Бо стратегияи Canary, навсозиҳо аввал танҳо ба як гурӯҳи корбарон татбиқ карда мешаванд. Тавассути мониторинг, маълумотҳои сабт, санҷиши дастӣ ё дигар каналҳои фикру мулоҳизаҳо, нашрия пеш аз он ки ба ҳама корбарон дастрас шавад, санҷида мешавад.

Ҷойгиркунии Kubernetes (навсозии даврӣ)

Стратегияи пешфарз барои Kubernetes Deployment навсозӣ мебошад, ки дар он шумораи муайяни подкҳо бо версияҳои нави тасвирҳо оғоз карда мешаванд. Агар онҳо бе мушкилот сохта шуда бошанд, паҳлӯҳои дорои версияҳои кӯҳнаи тасвирҳо қатъ карда мешаванд ва паҳлӯҳои нав дар баробари эҷод мешаванд.

GitOps

Мо дар ин мисол GitOps-ро истифода мебарем, зеро мо:

  • истифодаи Git ҳамчун манбаи ягонаи ҳақиқат
  • мо амалиёти Git-ро барои сохтан ва ҷойгиркунӣ истифода мебарем (ба ғайр аз git tag/merge ягон фармон лозим нест)

Мисол

Биёед як таҷрибаи хубро гирем - як репозиторий барои рамзи барнома ва дигаре барои инфрасохтор.

Анбори ариза

Ин як API хеле соддаи Python+Flask аст, ки посухро ҳамчун JSON бармегардонад. Мо бастаро тавассути GitlabCI месозем ва натиҷаро ба Реестри Gitlab интиқол медиҳем. Дар феҳрист мо ду версияи гуногуни нашр дорем:

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

Ягона фарқияти байни онҳо тағирот дар файли баргардонидашудаи JSON мебошад. Мо ин барномаро истифода мебарем, то ба осонӣ тасаввур кунем, ки кадом версияи мо бо кадом версия муошират карда истодаем.

Анбори инфрасохтор

Дар ин шалғам мо тавассути GitlabCI ба Kubernetes ҷойгир мекунем, .gitlab-ci.yml чунин мешуморам:

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

Барои худатон идора кардани он ба шумо кластер лозим аст, шумо метавонед Gcloud-ро истифода баред:

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

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

Ба шумо лозим аст, ки чанг кунед https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure ва тағирёбанда эҷод кунед KUBECONFIG дар GitlabCI, ки конфигуратсияро барои дастрасӣ дар бар мегирад kubectl ба кластери шумо.

Шумо метавонед дар бораи чӣ гуна гирифтани эътимоднома барои кластер хонед (Gcloud) дар ин ҷо.

Инфрасохтори Yaml

Дар анбори инфрасохтор мо хидмат дорем:

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

Ва ҷойгиркунӣ дар 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

Ва ҷойгиркунии дигар дар 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

Дар хотир доред, ки app-deploy то ҳол ягон репликаи муайяншуда надорад.

Иҷрои ҷойгиркунии ибтидоӣ

Барои оғози ҷойгиркунии ибтидоӣ, шумо метавонед лӯлаи GitlabCI-ро дастӣ дар шохаи усто оғоз кунед. Баъд аз он kubectl бояд инҳоро баровард:

Ҷойгиркунии Канария дар Кубернетес №1: Gitlab CI

Мо мебинем app ҷойгиркунӣ бо 10 реплика ва app-canary бо 0. Ҳамчунин LoadBalancer мавҷуд аст, ки мо метавонем аз он дастрасӣ пайдо кунем curl тавассути IP берунӣ:

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

Ҷойгиркунии Канария дар Кубернетес №1: Gitlab CI

Мо мебинем, ки барномаи санҷишии мо танҳо "v1" -ро бармегардонад.

Иҷрои ҷойгиркунии Canary

Қадами 1: версияи навро барои баъзе корбарон нашр кунед

Мо шумораи нусхаҳоро дар файли deploy-canary.yaml ва тасвири версияи нав ба 1 муқаррар кардем:

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

Дар файл deploy.yaml мо шумораи нусхаҳоро ба 9 иваз кардем:

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

Мо ин тағиротҳоро ба анбори он тела медиҳем, ки аз он ҷобаҷогузорӣ оғоз мешавад (тавассути GitlabCI) ва дар натиҷа мебинем:

Ҷойгиркунии Канария дар Кубернетес №1: Gitlab CI

Хидмати мо ба ҳарду ҷойгиркунӣ ишора мекунад, зеро ҳардуи онҳо интихобкунандаи барнома доранд. Аз сабаби тасодуфии пешфарзии Кубернетес, мо бояд барои ~ 10% дархостҳо ҷавобҳои гуногунро бубинем:

Ҷойгиркунии Канария дар Кубернетес №1: Gitlab CI

Ҳолати кунунии замимаи мо (GitOps, ки аз Git ҳамчун манбаи ягонаи ҳақиқат гирифта шудааст) мавҷудияти ду ҷойгиркунӣ бо репликаҳои фаъол аст, ки барои ҳар як версия якто.

~10% корбарон бо версияи нав шинос мешаванд ва нохост онро месанҷанд. Ҳоло вақти тафтиш кардани хатогиҳо дар гузоришҳо ва маълумоти мониторинг барои дарёфти мушкилот аст.

Қадами 2: Варианти навро ба ҳама корбарон пешкаш кунед

Мо тасмим гирифтем, ки ҳама чиз хуб шуд ва ҳоло мо бояд версияи навро барои ҳама корбарон паҳн кунем. Барои ин мо танҳо навсозӣ мекунем deploy.yaml насби версияи нави тасвир ва шумораи такрори баробар ба 10. Дар deploy-canary.yaml мо шумораи репликаҳоро ба 0 бармегардонем. Пас аз ҷойгиркунӣ, натиҷа чунин хоҳад буд:

Ҷойгиркунии Канария дар Кубернетес №1: Gitlab CI

Барои ҷамъбаст кардан

Барои ман, ба таври дастӣ иҷро кардани ҷойгиркунӣ барои фаҳмидани он, ки то чӣ андоза онро бо истифода аз k8s танзим кардан мумкин аст, кӯмак мекунад. Азбаски Kubernetes ба шумо имкон медиҳад, ки ҳама чизро тавассути API навсозӣ кунед, ин қадамҳоро тавассути скриптҳо автоматӣ кардан мумкин аст.

Чизи дигаре, ки бояд амалӣ карда шавад, нуқтаи вуруди озмоишгар аст (LoadBalancer ё тавассути Ingress), ки тавассути он танҳо ба версияи нав дастрас шудан мумкин аст. Онро барои дидани дастӣ истифода бурдан мумкин аст.

Дар мақолаҳои оянда мо дигар қарорҳои автоматиро, ки аксари корҳои анҷомдодаамонро амалӣ мекунанд, тафтиш хоҳем кард.

Инчунин мақолаҳои дигарро дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ