Мо Gitlab CI ва GitOps-ро барои амалӣ ва истифодаи густариши Canary дар Kubernetes истифода хоҳем кард
Мақолаҳо аз ин силсила:
- (Ин мақола)
Ҷойгиркунии Canary бо истифода аз ArgoCI - Ҷойгиркунии Canary бо истифода аз Istio
- Ҷойгиркунии Canary бо истифода аз Jenkins-X Istio Flagger
Мо ҷойгиркунии Canary-ро тавассути GitOps дастӣ иҷро мекунем ва захираҳои асосии Kubernetes-ро эҷод/тағйир медиҳем. Ин мақола пеш аз ҳама барои муқаддима пешбинӣ шудааст бо чӣ гуна ҷойгиркунӣ дар Kubernetes Canary кор мекунад, зеро усулҳои самараноки автоматикунонӣ мавҷуданд, ки мо дар мақолаҳои зерин баррасӣ хоҳем кард.
Ҷойгиркунии Канария
Бо стратегияи Canary, навсозиҳо аввал танҳо ба як гурӯҳи корбарон татбиқ карда мешаванд. Тавассути мониторинг, маълумотҳои сабт, санҷиши дастӣ ё дигар каналҳои фикру мулоҳизаҳо, нашрия пеш аз он ки ба ҳама корбарон дастрас шавад, санҷида мешавад.
Ҷойгиркунии Kubernetes (навсозии даврӣ)
Стратегияи пешфарз барои Kubernetes Deployment навсозӣ мебошад, ки дар он шумораи муайяни подкҳо бо версияҳои нави тасвирҳо оғоз карда мешаванд. Агар онҳо бе мушкилот сохта шуда бошанд, паҳлӯҳои дорои версияҳои кӯҳнаи тасвирҳо қатъ карда мешаванд ва паҳлӯҳои нав дар баробари эҷод мешаванд.
GitOps
Мо дар ин мисол GitOps-ро истифода мебарем, зеро мо:
- истифодаи Git ҳамчун манбаи ягонаи ҳақиқат
- мо амалиёти Git-ро барои сохтан ва ҷойгиркунӣ истифода мебарем (ба ғайр аз git tag/merge ягон фармон лозим нест)
Мисол
Биёед як таҷрибаи хубро гирем - як репозиторий барои рамзи барнома ва дигаре барои инфрасохтор.
Анбори ариза
Ин як API хеле соддаи Python+Flask аст, ки посухро ҳамчун JSON бармегардонад. Мо бастаро тавассути 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
Дар хотир доред, ки app-deploy то ҳол ягон репликаи муайяншуда надорад.
Иҷрои ҷойгиркунии ибтидоӣ
Барои оғози ҷойгиркунии ибтидоӣ, шумо метавонед лӯлаи GitlabCI-ро дастӣ дар шохаи усто оғоз кунед. Баъд аз он kubectl
бояд инҳоро баровард:
Мо мебинем app
ҷойгиркунӣ бо 10 реплика ва app-canary бо 0. Ҳамчунин 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) ва дар натиҷа мебинем:
Хидмати мо ба ҳарду ҷойгиркунӣ ишора мекунад, зеро ҳардуи онҳо интихобкунандаи барнома доранд. Аз сабаби тасодуфии пешфарзии Кубернетес, мо бояд барои ~ 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 Authorization Kubernetes Ҳангоми истифодаи утилитаи Csync2 мо бо он чизе рӯ ба рӯ мешудем Боти Telegram барои Redmine. Чӣ тавр ҳаёти худро барои худ ва дигарон содда кардан мумкин аст
Манбаъ: will.com