Kubernetesda kanareykalarni joylashtirish №2: Argo Rollouts

Kubernetes-ga Canary-ni joylashtirishni ishga tushirish uchun biz k8s-ning mahalliy Argo Rollouts joylashtirish boshqaruvchisi va GitlabCI-dan foydalanamiz.

Kubernetesda kanareykalarni joylashtirish №2: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Ushbu turkumdagi maqolalar

Kanareykalarni joylashtirish

O'qiysiz degan umiddamiz birinchi qism, bu erda biz Canary Deployments nima ekanligini qisqacha tushuntirdik. Biz buni standart Kubernetes resurslaridan foydalangan holda qanday amalga oshirishni ham ko'rsatdik.

Argo Rollouts

Argo Rollouts - bu Kubernetes mahalliy tarqatish boshqaruvchisi. U Kubernetes uchun CRD (Maxsus Resurs Ta'rifi) ni taqdim etadi. Buning yordamida biz yangi ob'ektdan foydalanishimiz mumkin: Rollout, turli xil konfiguratsiya variantlari bilan ko'k-yashil va kanareykalarni joylashtirishni boshqaradi.

Maxsus resurs tomonidan ishlatiladigan Argo Rollouts kontrolleri Rollout, Kubernetes uchun ko'k-yashil va kanareyka kabi qo'shimcha joylashtirish strategiyalariga ruxsat beradi. Manba Rollout funksionallik ekvivalentini ta'minlaydi Deployment, faqat qo'shimcha joylashtirish strategiyalari bilan.
resurs Deployments joylashtirish uchun ikkita strategiyaga ega: RollingUpdate и Recreate. Garchi bu strategiyalar ko'p hollarda mos bo'lsa-da, serverlarga juda keng miqyosda joylashtirish uchun qo'shimcha strategiyalar qo'llaniladi, masalan, ko'k-yashil yoki kanareyka, ular Deployment controller-da mavjud emas. Kubernetes-da ushbu strategiyalardan foydalanish uchun foydalanuvchilar o'zlarining joylashtirishlari ustiga skript yozishlari kerak edi. Argo Rollouts Controller bu strategiyalarni oddiy, deklarativ, sozlanishi parametrlar sifatida namoyon qiladi.
https://argoproj.github.io/argo-rollouts

Rollouts bilan foydalanish uchun qulay veb-interfeysni ta'minlovchi Argo CI ham mavjud, biz buni keyingi maqolada ko'rib chiqamiz.

Argo Rollouts o'rnatish

Server tomoni

kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml

Bizning infratuzilma sholg'omimizga (pastga qarang) biz allaqachon install.yaml ni i/k8s/argo-rollouts/install.yaml sifatida qo'shdik. Shu tarzda GitlabCI uni klasterga o'rnatadi.

Mijoz tomoni (kubectl plagini)

https://argoproj.github.io/argo-rollouts/features/kubectl-plugin

Misol ariza

Ilova kodi va infratuzilmasi uchun alohida omborlarga ega bo'lish yaxshi amaliyotdir.

Ilova uchun ombor

Kim Wuestkamp/k8s-deployment-misol-ilovasi

Bu JSON sifatida javob qaytaradigan juda oddiy Python+Flask API. Biz paketni GitlabCI yordamida quramiz va natijani Gitlab registriga yuboramiz. Ro'yxatga olish kitobida bizda ikkita turli xil versiyalar mavjud:

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

Ularning orasidagi yagona farq JSON fayli qaytarilgan. Biz ushbu ilovadan qaysi versiya bilan muloqot qilayotganimizni imkon qadar oson tasavvur qilish uchun foydalanamiz.

Infratuzilma ombori

Ushbu omborda biz Kubernetes-ga joylashtirish uchun GitlabCI-dan foydalanamiz, .gitlab-ci.yml quyidagicha ko'rinadi:

image: traherom/kustomize-dockerbefore_script:
   - printenv
   - kubectl versionstages:
 - deploydeploy test:
   stage: deploy
   before_script:
     - echo $KUBECONFIG
   script:
     - kubectl get all
     - kubectl apply -f i/k8s    only:
     - master

Uni o'zingiz ishga tushirish uchun sizga klaster kerak bo'ladi, siz Gcloud-dan foydalanishingiz mumkin:

gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80

Siz vilka qilishingiz kerak https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure va o'zgaruvchi yarating KUBECONFIG kirish uchun konfiguratsiyani o'z ichiga olgan GitlabCI da kubectl sizning klasteringizga.

u Klaster (Gcloud) uchun hisob ma'lumotlarini qanday olish haqida o'qishingiz mumkin.

Yaml infratuzilmasi

Infratuzilma ombori ichida bizda xizmat mavjud:

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

va rollout.yaml:

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
 name: rollout-canary
spec:
 replicas: 10
 revisionHistoryLimit: 2
 selector:
   matchLabels:
     id: rollout-canary
 template:
   metadata:
     labels:
       id: rollout-canary
   spec:
     containers:
     - name: rollouts-demo
       image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
       imagePullPolicy: Always
 strategy:
   canary:
     steps:
     - setWeight: 10
     # Rollouts can be manually resumed by running `kubectl argo rollouts promote ROLLOUT`
     - pause: {}
     - setWeight: 50
     - pause: { duration: 120 } # two minutes

Rollout Deployment bilan bir xil ishlaydi. Agar biz yangilash strategiyasini o'rnatmasak (bu yerda kanareyka kabi) u standart prokat yangilanishi Deployment kabi ishlaydi.

Biz kanareykalarni joylashtirish uchun yamlda ikki bosqichni belgilaymiz:

  1. Kanareyka trafigining 10% (qo'lda OK ni kuting)
  2. Kanareykaga 50% trafik (2 daqiqa kuting, keyin 100% gacha davom eting)

Dastlabki joylashtirishni amalga oshirish

Dastlabki joylashtirishdan so'ng bizning resurslarimiz quyidagicha ko'rinadi:

Kubernetesda kanareykalarni joylashtirish №2: Argo Rollouts

Va biz faqat ilovaning birinchi versiyasidan javob olamiz:

Kubernetesda kanareykalarni joylashtirish №2: Argo Rollouts

Kanareykalarni joylashtirishni amalga oshirish

1-qadam: 10% trafik

Kanareykalarni joylashtirishni boshlash uchun biz odatda joylashtirishda bo'lgani kabi rasm versiyasini o'zgartirishimiz kerak:

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
 name: rollout-canary
spec:
...
 template:
   metadata:
     labels:
       id: rollout-canary
   spec:
     containers:
     - name: rollouts-demo
       image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
...

Va biz o'zgarishlarni suramiz, shuning uchun Gitlab CI o'rnatiladi va biz o'zgarishlarni ko'ramiz:

Kubernetesda kanareykalarni joylashtirish №2: Argo Rollouts

Endi biz xizmatga kirsak:

Kubernetesda kanareykalarni joylashtirish №2: Argo Rollouts

Ajoyib! Biz kanareykalarni joylashtirishning o'rtasidamiz. Ishlash orqali biz taraqqiyotni ko'rishimiz mumkin:

kubectl argo rollouts get rollout rollout-canary

Kubernetesda kanareykalarni joylashtirish №2: Argo Rollouts

2-qadam: 50% trafik:

Endi keyingi bosqichga o'tamiz: trafikning 50 foizini qayta yo'naltirish. Biz ushbu qadamni qo'lda bajarish uchun sozladik:

kubectl argo rollouts promote rollout-canary # continue to step 2

Kubernetesda kanareykalarni joylashtirish №2: Argo Rollouts

Va bizning ilovamiz yangi versiyalardagi javoblarning 50 foizini qaytardi:

Kubernetesda kanareykalarni joylashtirish №2: Argo Rollouts

Va tarqatish tekshiruvi:

Kubernetesda kanareykalarni joylashtirish №2: Argo Rollouts

Ajoyib.

3-qadam: 100% trafik:

Biz uni shunday o'rnatdikki, 2 daqiqadan so'ng 50% qadam avtomatik ravishda tugaydi va 100% qadam boshlanadi:

Kubernetesda kanareykalarni joylashtirish №2: Argo Rollouts

Va dastur chiqishi:

Kubernetesda kanareykalarni joylashtirish №2: Argo Rollouts

Va tarqatish tekshiruvi:

Kubernetesda kanareykalarni joylashtirish №2: Argo Rollouts

Kanareykalarni joylashtirish tugallandi.

Argo Rollouts bilan ko'proq misollar

Bu erda ko'proq misollar mavjud, masalan, kanareykalar asosida atrof-muhitni oldindan ko'rish va taqqoslashni qanday o'rnatish mumkin:

https://github.com/argoproj/argo-rollouts/tree/master/examples

Argo Rollouts va Argo CI haqida video

Men ushbu videoni haqiqatan ham tavsiya qilaman, u Argo Rollouts va Argo CI qanday ishlashini ko'rsatadi:

Xulosa

Menga qo'shimcha joylashtirish turlarini yoki replikasetlarni yaratish, trafikni qayta yo'naltirish va hokazolarni boshqaradigan CRD-lardan foydalanish g'oyasi juda yoqadi. Ular bilan ishlash muammosiz ketadi. Keyin men Argo CI bilan integratsiyani sinab ko'rmoqchiman.

Biroq, Argo CI va Flux CI ning katta birlashishi kutilmoqda, shuning uchun men yangi versiya chiqquncha kutishim mumkin: Argo Flux.

Argo Rollouts yoki Argo CI bilan tajribangiz bormi?

Shuningdek, bizning blogimizdagi boshqa maqolalarni o'qing:

Manba: www.habr.com

a Izoh qo'shish