Kubernetes дахь Канарын байршуулалт №1: Gitlab CI

Бид Kubernetes-д Canary байршуулалтыг хэрэгжүүлэх, ашиглахын тулд Gitlab CI болон гарын авлагын GitOps ашиглах болно.

Kubernetes дахь Канарын байршуулалт №1: Gitlab CI

Энэ цувралын нийтлэлүүд:

Бид Canary байршуулалтыг GitOps-ээр гараар хийж, Kubernetes-ийн үндсэн нөөцүүдийг үүсгэх/өөрчлөх болно. Энэ нийтлэл нь үндсэндээ танилцуулгад зориулагдсан болно Kubernetes Canary-д байршуулалт хэрхэн ажилладаг талаар, учир нь автоматжуулалтын илүү үр дүнтэй аргууд байдаг тул бид дараагийн нийтлэлүүдэд авч үзэх болно.


Kubernetes дахь Канарын байршуулалт №1: Gitlab CI

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

Канарын байршуулалт

Канарын стратегийн тусламжтайгаар шинэчлэлтийг эхлээд зөвхөн хэрэглэгчдэд л ашигладаг. Хяналт, бүртгэлийн өгөгдөл, гарын авлагын туршилт эсвэл бусад санал хүсэлтийн сувгуудаар дамжуулан хувилбарыг бүх хэрэглэгчдэд хүргэхээс өмнө туршиж үздэг.

Kubernetes Deployment (шилжсэн шинэчлэлт)

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

GitOps

Бид энэ жишээнд GitOps ашигладаг, учир нь бид:

  • Git-ийг үнэний ганц эх сурвалж болгон ашиглах
  • Бид Git үйлдлүүдийг бүтээх, байрлуулахдаа ашигладаг (git tag/merge-ээс өөр команд шаардлагагүй)

Жишээ нь:

Нэг сайн туршлагыг авч үзье - програмын кодыг хадгалах нэг, дэд бүтцийн нэг хадгалах газартай байх.

Програмын агуулах

Энэ бол хариултыг 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

Апп-deploy-д одоогоор тодорхойлогдсон хуулбар байхгүй гэдгийг анхаарна уу.

Эхний байршуулалтыг хийж байна

Анхны байршуулалтыг эхлүүлэхийн тулд та GitlabCI дамжуулах хоолойг мастер салбар дээр гараар эхлүүлж болно. Үүний дараа kubectl дараахыг гаргах ёстой:

Kubernetes дахь Канарын байршуулалт №1: Gitlab CI

Бид харж байна app 10 хуулбар болон 0-тэй app-canary-тай байршуулалт. Мөн 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) юм. Үүнийг гараар үзэхэд ашиглаж болно.

Ирээдүйн нийтлэлүүдэд бидний хийсэн ихэнх зүйлийг хэрэгжүүлдэг бусад автомат шийдлүүдийг судлах болно.

Мөн манай блог дээрх бусад нийтлэлүүдийг уншина уу:

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх