Kubernetes №1деги Канарияны жайылтуу: Gitlab CI

Kubernetes'те Canary жайгаштырууну ишке ашыруу жана колдонуу үчүн Gitlab CI жана кол менен GitOps колдонобуз

Kubernetes №1деги Канарияны жайылтуу: Gitlab CI

Бул сериядагы макалалар:

Канарияны жайгаштырууну GitOps аркылуу кол менен аткарабыз жана негизги Kubernetes ресурстарын түзөбүз/өзгөрөбүз. Бул макала биринчи кезекте киришүү үчүн арналган Кубернетес Канарияда жайылтуу кантип иштейт, анткени автоматташтыруунун натыйжалуу ыкмалары бар, аларды биз кийинки макалаларда карап чыгабыз.


Kubernetes №1деги Канарияны жайылтуу: Gitlab CI

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

Canary Deployment

Канария стратегиясы менен жаңыртуулар адегенде колдонуучулардын бир бөлүгүнө гана колдонулат. Мониторинг, журнал маалыматтары, кол менен тестирлөө же башка пикир каналдары аркылуу релиз бардык колдонуучуларга чыгарылганга чейин текшерилет.

Kubernetes Deployment (толук жаңыртуу)

Kubernetes Deployment үчүн демейки стратегия - жаңыртуу, мында сүрөттөрдүн жаңы версиялары менен белгилүү бир сандагы поддондор ишке киргизилет. Эгер алар көйгөйсүз түзүлсө, сүрөттөрдүн эски версиялары бар подколор токтотулуп, жаңы подкектер параллелдүү түзүлөт.

GitOps

Бул мисалда биз GitOps колдонобуз, анткени биз:

  • чындыктын бир булагы катары Git колдонуу
  • куруу жана жайылтуу үчүн биз Git операцияларын колдонобуз (git теги/бириктирүүдөн башка эч кандай буйрук талап кылынбайт)

мисал

Келгиле, жакшы тажрыйбаны карап көрөлү - колдонмо коду үчүн бир репозиторийге жана инфраструктурага бир репозиторийге ээ болуу.

Колдонмо репозиторий

Бул JSON катары жооп кайтарган абдан жөнөкөй Python+Flask API. Биз 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 төмөнкүлөрдү чыгаруу керек:

Kubernetes №1деги Канарияны жайылтуу: Gitlab CI

Көрөбүз app 10 репликасы жана 0 менен колдонмо-канариясы менен жайгаштыруу. Ошондой эле LoadBalancer бар, ал аркылуу биз кире алабыз. curl тышкы IP аркылуу:

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

Kubernetes №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 аркылуу) жана натыйжада:

Kubernetes №1деги Канарияны жайылтуу: Gitlab CI

Биздин Кызмат эки жайгаштырууну көрсөтөт, анткени экөө тең колдонмону тандагычка ээ. Kubernetes'тин демейки рандомизациясынан улам, биз сурамдардын ~10% үчүн ар кандай жоопторду көрүшүбүз керек:

Kubernetes №1деги Канарияны жайылтуу: Gitlab CI

Биздин тиркеменин учурдагы абалы (GitOps, Gitтен чындыктын бирдиктүү булагы катары алынган) - бул ар бир версия үчүн бирден, активдүү репликалары бар эки жайгаштыруунун болушу.

~10% колдонуучулар жаңы версия менен таанышып, аны байкабай сынап көрүшөт. Азыр көйгөйлөрдү табуу үчүн журналдардагы жана мониторинг маалыматтарындагы каталарды текшерүүгө убакыт келди.

2-кадам: Жаңы версияны бардык колдонуучуларга чыгарыңыз

Биз баары ойдогудай болду деп чечтик жана эми жаңы версияны бардык колдонуучуларга жайылтышыбыз керек. Бул үчүн биз жөн гана жаңыртабыз deploy.yaml сүрөттүн жаңы версиясын орнотуу жана репликалардын саны 10. В deploy-canary.yaml биз репликалардын санын 0гө кайра койдук. Жайгаштыргандан кийин, натыйжа төмөнкүдөй болот:

Kubernetes №1деги Канарияны жайылтуу: Gitlab CI

жыйынтыктап жатып

Мен үчүн, жайгаштырууну ушундай жол менен иштетүү k8s аркылуу канчалык оңой конфигурацияланарын түшүнүүгө жардам берет. Kubernetes бардыгын API аркылуу жаңыртууга мүмкүндүк бергендиктен, бул кадамдарды скрипттер аркылуу автоматташтырууга болот.

Ишке ашырылышы керек болгон дагы бир нерсе - жаңы версияга гана кире турган сыноочу кирүү чекити (LoadBalancer же Ingress аркылуу). Аны кол менен серептөө үчүн колдонсо болот.

Келечектеги макалаларда биз жасаган иштердин көбүн ишке ашырган башка автоматташтырылган чечимдерди карап чыгабыз.

Биздин блогдогу башка макалаларды да окуңуз:

Source: www.habr.com

Комментарий кошуу