Бид Kubernetes-д Canary байршуулалтыг хэрэгжүүлэх, ашиглахын тулд Gitlab CI болон гарын авлагын GitOps ашиглах болно.
Энэ цувралын нийтлэлүүд:
- (Энэ нийтлэл)
ArgoCI ашиглан Canary Deployment - Istio ашиглан Canary Deployment
- Jenkins-X Istio Flagger ашиглан Canary Deployment
Бид Canary байршуулалтыг GitOps-ээр гараар хийж, Kubernetes-ийн үндсэн нөөцүүдийг үүсгэх/өөрчлөх болно. Энэ нийтлэл нь үндсэндээ танилцуулгад зориулагдсан болно Kubernetes Canary-д байршуулалт хэрхэн ажилладаг талаар, учир нь автоматжуулалтын илүү үр дүнтэй аргууд байдаг тул бид дараагийн нийтлэлүүдэд авч үзэх болно.
Канарын байршуулалт
Канарын стратегийн тусламжтайгаар шинэчлэлтийг эхлээд зөвхөн хэрэглэгчдэд л ашигладаг. Хяналт, бүртгэлийн өгөгдөл, гарын авлагын туршилт эсвэл бусад санал хүсэлтийн сувгуудаар дамжуулан хувилбарыг бүх хэрэглэгчдэд хүргэхээс өмнө туршиж үздэг.
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
Та салаалах хэрэгтэй 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
дараахыг гаргах ёстой:
Бид харж байна app
10 хуулбар болон 0-тэй app-canary-тай байршуулалт. Мөн LoadBalancer байдаг бөгөөд бид үүнд хандах боломжтой. curl
Гадаад IP-ээр дамжуулан:
while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done
Бидний туршилтын програм зөвхөн "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-ийн өгөгдмөл санамсаргүй байдлын улмаас бид хүсэлтийн ~10% нь өөр өөр хариултуудыг харах ёстой:
Манай програмын одоогийн төлөв (GitOps, Git-ээс авсан үнэний ганц эх сурвалж) нь хувилбар тус бүрт нэг идэвхтэй хуулбар бүхий хоёр байршуулалт байгаа явдал юм.
Хэрэглэгчдийн ~10% нь шинэ хувилбартай танилцаж, санамсаргүйгээр туршиж үздэг. Асуудлыг олохын тулд бүртгэл, мониторингийн өгөгдөлд алдаа байгаа эсэхийг шалгах цаг болжээ.
Алхам 2: Бүх хэрэглэгчдэд шинэ хувилбарыг гарга
Бид бүх зүйл сайн болсон гэж шийдсэн бөгөөд одоо шинэ хувилбарыг бүх хэрэглэгчдэд хүргэх хэрэгтэй байна. Үүнийг хийхийн тулд бид зүгээр л шинэчилнэ deploy.yaml
зургийн шинэ хувилбарыг суулгаж, хуулбарын тоо 10. онд deploy-canary.yaml
Бид хуулбарын тоог 0 болгож тохируулсан. Байршуулсаны дараа үр дүн нь дараах байдалтай байна:
Дүгнэж хэлэх
Миний хувьд байршуулалтыг ийм байдлаар гараар ажиллуулах нь k8s ашиглан үүнийг хэрхэн амархан тохируулахыг ойлгоход тусалдаг. Kubernetes нь API-ээр дамжуулан бүх зүйлийг шинэчлэх боломжийг олгодог тул эдгээр алхмуудыг скриптээр дамжуулан автоматжуулж болно.
Хэрэгжүүлэх шаардлагатай өөр нэг зүйл бол зөвхөн шинэ хувилбарт хандах боломжтой тестерийн нэвтрэх цэг (LoadBalancer эсвэл Ingress) юм. Үүнийг гараар үзэхэд ашиглаж болно.
Ирээдүйн нийтлэлүүдэд бидний хийсэн ихэнх зүйлийг хэрэгжүүлдэг бусад автомат шийдлүүдийг судлах болно.
Мөн манай блог дээрх бусад нийтлэлүүдийг уншина уу:
ClickHouse-аас зөвшөөрөлгүй ClickHouse руу шилжих нь юунд хүргэсэн бэ? Nginx-д зориулсан динамик модулиудыг бий болгох Nxs-build-tools-ийг шинэчлэх - deb болон rpm багцуудыг бүтээхэд туслах Hashicorp Консулын Кубернетес зөвшөөрлийн танилцуулга Csync2 хэрэгслийг ашиглахад бидэнд тулгарч байсан зүйл Redmine-д зориулсан Telegram бот. Өөрийнхөө болон бусдын амьдралыг хэрхэн хялбарчлах вэ
Эх сурвалж: www.habr.com