Kubernetesda kanareykalarni joylashtirish №1: Gitlab CI

Kubernetes-da Canary-ni joylashtirishni amalga oshirish va ishlatish uchun Gitlab CI va qo'lda GitOps-dan foydalanamiz.

Kubernetesda kanareykalarni joylashtirish №1: Gitlab CI

Ushbu turkumdagi maqolalar:

Biz Canary joylashtirishni GitOps orqali qo'lda bajaramiz va asosiy Kubernetes resurslarini yaratamiz/o'zgartiramiz. Ushbu maqola birinchi navbatda kirish uchun mo'ljallangan Kubernetes Canary-da joylashtirish qanday ishlashi bilan, chunki avtomatlashtirishning yanada samarali usullari mavjud, biz ularni keyingi maqolalarda ko'rib chiqamiz.


Kubernetesda kanareykalarni joylashtirish №1: Gitlab CI

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

Kanareykalarni joylashtirish

Canary strategiyasi bilan yangilanishlar birinchi navbatda foydalanuvchilarning faqat bir qismiga qo'llaniladi. Monitoring, jurnal ma'lumotlari, qo'lda test yoki boshqa fikr-mulohaza kanallari orqali reliz barcha foydalanuvchilarga chiqarilishidan oldin sinovdan o'tkaziladi.

Kubernetes Deployment (tezkor yangilanish)

Kubernetes Deployment uchun standart strategiya yangilanish bo'lib, unda tasvirlarning yangi versiyalari bilan ma'lum miqdordagi podlar ishga tushiriladi. Agar ular muammosiz yaratilgan bo'lsa, rasmlarning eski versiyalari bo'lgan podalar tugatiladi va parallel ravishda yangi podlar yaratiladi.

GitOps

Biz ushbu misolda GitOps-dan foydalanamiz, chunki biz:

  • Git-dan haqiqatning yagona manbai sifatida foydalanish
  • Biz Git Operations dan yaratish va joylashtirish uchun foydalanamiz (git tag/birlashtirishdan boshqa buyruqlar kerak emas)

misol

Keling, yaxshi amaliyotni ko'rib chiqaylik - bitta dastur kodi va infratuzilma uchun bitta omborga ega bo'lish.

Ilovalar ombori

Bu JSON sifatida javob qaytaradigan juda oddiy Python+Flask API. Biz paketni GitlabCI orqali yaratamiz 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 qaytarilgan JSON faylidagi o'zgarishdir. Biz ushbu ilovadan qaysi versiya bilan muloqot qilayotganimizni imkon qadar oson tasavvur qilish uchun foydalanamiz.

Infratuzilma ombori

Ushbu sholg'omda biz GitlabCI orqali Kubernetes-ga joylashtiramiz, .gitlab-ci.yml quyidagilar:

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

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.

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

Yaml infratuzilmasi

Infratuzilma omborida bizda quyidagi xizmat mavjud:

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

Va joylashtirish 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

Va yana bir joylashtirish 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

Ilova-deploy-da hali aniqlangan replika yo'qligini unutmang.

Dastlabki joylashtirishni amalga oshirish

Dastlabki joylashtirishni boshlash uchun siz GitlabCI quvur liniyasini asosiy filialda qo'lda boshlashingiz mumkin. Bundan keyin kubectl quyidagilarni chiqarishi kerak:

Kubernetesda kanareykalarni joylashtirish №1: Gitlab CI

Ko'ramiz app 10 ta replika va 0 bilan ilova-kanareykalarni joylashtirish. Shuningdek, LoadBalancer ham mavjud bo'lib, biz undan foydalanishimiz mumkin. curl Tashqi IP orqali:

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

Kubernetesda kanareykalarni joylashtirish №1: Gitlab CI

Bizning test dasturimiz faqat "v1" ni qaytarayotganini ko'ramiz.

Canary joylashtirishni amalga oshirish

1-qadam: ba'zi foydalanuvchilar uchun yangi versiyani chiqaring

Biz deploy-canary.yaml faylida va yangi versiya tasvirida replikalar sonini 1 ga o'rnatdik:

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

Fayl ichida deploy.yaml Biz replikalar sonini 9 taga o'zgartirdik:

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

Biz ushbu o'zgarishlarni joylashtirish boshlanadigan (GitlabCI orqali) omborga suramiz va natijada:

Kubernetesda kanareykalarni joylashtirish №1: Gitlab CI

Bizning xizmatimiz ikkala o'rnatishga ishora qiladi, chunki ikkalasida ham ilova selektori mavjud. Kubernetesning sukut bo'yicha tasodifiyligi tufayli biz so'rovlarning ~10% uchun turli javoblarni ko'rishimiz kerak:

Kubernetesda kanareykalarni joylashtirish №1: Gitlab CI

Ilovamizning hozirgi holati (GitOps, Git-dan haqiqatning yagona manbasi sifatida olingan) har bir versiya uchun bittadan faol replikalarga ega ikkita o'rnatishning mavjudligi.

~10% foydalanuvchi yangi versiya bilan tanishadi va uni beixtiyor sinab ko'radi. Endi muammolarni topish uchun jurnallar va monitoring ma'lumotlaridagi xatolarni tekshirish vaqti keldi.

2-qadam: Yangi versiyani barcha foydalanuvchilarga chiqaring

Biz hamma narsa yaxshi bo'ldi deb qaror qildik va endi yangi versiyani barcha foydalanuvchilarga tarqatishimiz kerak. Buning uchun biz shunchaki yangilaymiz deploy.yaml tasvirning yangi versiyasini o'rnatish va replikatsiyalar soni 10 ga teng. In deploy-canary.yaml replikalar sonini 0 ga qaytaramiz. Joylashtirishdan so'ng natija quyidagicha bo'ladi:

Kubernetesda kanareykalarni joylashtirish №1: Gitlab CI

sarhisob qilar ekanmiz

Men uchun tarqatishni qo'lda shu tarzda ishga tushirish k8s yordamida uni qanchalik oson sozlash mumkinligini tushunishga yordam beradi. Kubernetes sizga API orqali hamma narsani yangilash imkonini berganligi sababli, bu qadamlarni skriptlar orqali avtomatlashtirish mumkin.

Amalga oshirish kerak bo'lgan yana bir narsa bu testerning kirish nuqtasi (LoadBalancer yoki Ingress orqali), u orqali faqat yangi versiyaga kirish mumkin. U qo'lda ko'rish uchun ishlatilishi mumkin.

Kelgusi maqolalarda biz qilgan ishlarning aksariyatini amalga oshiradigan boshqa avtomatlashtirilgan echimlarni ko'rib chiqamiz.

Shuningdek, bizning blogimizdagi boshqa maqolalarni o'qing:

Manba: www.habr.com

a Izoh qo'shish