Мо контролери ҷойгиркунии k8s Argo Rollouts ва GitlabCI-ро барои иҷро кардани ҷойгиркунии Canary ба Kubernetes истифода хоҳем кард.
Мақолаҳо дар ин силсила
Ҷойгиркунии Канария дар Кубернетес №1: Gitlab CI - (Ин мақола)
- Ҷойгиркунии Canary бо истифода аз Istio
- Ҷойгиркунии Canary бо истифода аз Jenkins-X Istio Flagger
Ҷойгиркунии Канария
Умедворем, ки шумо хонед
Argo Rollouts
Argo Rollouts як контролери ҷойгиркунии аслии Kubernetes аст. Он барои Kubernetes як CRD (Таърифи захираҳои фармоишӣ) пешниҳод мекунад. Ба шарофати он, мо метавонем як объекти навро истифода барем: Rollout
, ки ҷойгиркунии кабуд-сабз ва канариро бо имконоти гуногуни конфигуратсия идора мекунад.
Назоратчии Argo Rollouts, ки аз ҷониби манбаи фармоишӣ истифода мешавад
Rollout,
Ба стратегияҳои иловагии ҷойгиркунӣ, ба монанди кабуд-сабз ва канария барои Kubernetes имкон медиҳад. СарчашмаRollout
муодили функсионалии таъмин менамоядDeployment
, танҳо бо стратегияҳои густариши иловагӣ.
захираҳоDeployments
ду стратегияи ҷойгиркунӣ дорад:RollingUpdate
иRecreate
. Гарчанде ки ин стратегияҳо барои аксари ҳолатҳо мувофиқанд, барои ҷойгиркунӣ ба серверҳо дар миқёси хеле калон, стратегияҳои иловагӣ истифода мешаванд, ба монанди кабуд-сабз ё канар, ки дар контролери ҷойгиркунӣ мавҷуд нестанд. Барои истифодаи ин стратегияҳо дар Kubernetes, корбарон бояд дар болои Ҷойгиркунии худ скриптҳо менависанд. Назоратчии Argo Rollouts ин стратегияҳоро ҳамчун параметрҳои оддӣ, декларативӣ ва танзимшаванда фош мекунад.
https://argoproj.github.io/argo-rollouts
Инчунин Argo CI мавҷуд аст, ки интерфейси веби қулайро барои истифода бо Rollouts таъмин мекунад, мо онро дар мақолаи навбатӣ дида мебароем.
Насб кардани Rollouts Argo
Ҷониби сервер
kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml
Дар шалғам инфрасохтори мо (ба поён нигаред) мо аллакай install.yaml -ро ҳамчун i/k8s/argo-rollouts/install.yaml илова кардем. Ҳамин тавр GitlabCI онро ба кластер насб мекунад.
Ҷониби муштарӣ (плагини kubectl)
Намунаи ариза
Барои коди барномаҳо ва инфрасохтор анборҳои алоҳида доштан таҷрибаи хуб аст.
Репозиторий барои барнома
Kim Wuestkamp/k8s-deployment-example-app
Ин як 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-dockerbefore_script:
- printenv
- kubectl versionstages:
- deploydeploy 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
ба кластери шумо.
Инфрасохтори Yaml
Дар дохили анбори инфрасохтор мо хидмат дорем:
apiVersion: v1
kind: Service
metadata:
labels:
id: rollout-canary
name: app
spec:
ports:
- port: 80
protocol: TCP
targetPort: 5000
selector:
id: app
type: LoadBalancer
ва 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 кор мекунад. Агар мо стратегияи навсозиро муқаррар накунем (ба монанди канария дар ин ҷо), он ба монанди Ҷойгиркунии пешфарзии навсозӣ рафтор хоҳад кард.
Мо ду қадамро дар yaml барои ҷойгиркунии канария муайян мекунем:
- 10% трафик ба Канария (интизори OK дастӣ)
- 50% трафик ба Канария (2 дақиқа интизор шавед ва то 100% идома диҳед)
Иҷрои ҷойгиркунии ибтидоӣ
Пас аз ҷойгиркунии аввал, захираҳои мо чунин хоҳанд буд:
Ва мо танҳо аз версияи якуми барнома посух мегирем:
Иҷрои ҷойгиркунии Canary
Қадами 1: 10% трафик
Барои оғоз кардани ҷойгиркунии канария, мо танҳо бояд версияи тасвирро тағир диҳем, тавре ки мо одатан бо ҷойгиркунӣ мекунем:
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
...
Ва мо тағиротро тела медиҳем, аз ин рӯ Gitlab CI ҷойгир мекунад ва мо тағиротро мебинем:
Акнун, агар мо ба хидмат дастрасӣ пайдо кунем:
Аҷоиб! Мо дар мобайни ҷойгиркунии канарӣ қарор дорем. Мо метавонем пешрафтро тавассути иҷро бубинем:
kubectl argo rollouts get rollout rollout-canary
Қадами 2: 50% трафик:
Акнун биёед ба қадами навбатӣ мегузарем: равона кардани 50% трафик. Мо ин қадамро барои дастӣ иҷро кардан танзим кардем:
kubectl argo rollouts promote rollout-canary # continue to step 2
Ва аризаи мо 50% посухҳоро аз версияҳои нав баргардонд:
Ва баррасии паҳнкунӣ:
Аҷоиб.
Қадами 3: 100% трафик:
Мо онро тавре насб кардем, ки пас аз 2 дақиқа қадами 50% ба таври худкор ба итмом мерасад ва қадами 100% оғоз меёбад:
Ва баромади барнома:
Ва баррасии паҳнкунӣ:
Ҷойгиркунии канарӣ анҷом ёфт.
Намунаҳои бештар бо Argo Rollouts
Дар ин ҷо мисолҳои бештар мавҷуданд, ба монанди чӣ гуна танзим кардани пешнамоишҳои муҳити зист ва муқоисаҳо дар асоси канар:
Видео дар бораи Argo Rollouts ва Argo CI
Ман воқеан ин видеоро тавсия медиҳам, он нишон медиҳад, ки чӣ тавр Argo Rollouts ва Argo CI якҷоя кор мекунанд:
Натиҷа
Ба ман идеяи истифодаи CRD-ҳо, ки эҷоди намудҳои иловагии ҷойгиркунӣ ё репликаетҳо, масири интиқоли трафик ва ғайраро идора мекунанд, хеле маъқул аст. Кор бо онхо муътадил мегузарад. Минбаъд ман мехоҳам ҳамгироиро бо Argo CI санҷам.
Аммо, ба назар чунин мерасад, ки якҷояшавии бузурги Argo CI ва Flux CI меояд, бинобар ин ман метавонам то нашри нав интизор шавам:
Оё шумо бо Argo Rollouts ё Argo CI таҷриба доштед?
Инчунин мақолаҳои дигарро дар блоги мо хонед:
Ҷойгиркунии Blue-Green замимаҳои баҳор бо веб-сервери Nginx Кубернетес: чаро ташкили идоракунии захираҳои система ин қадар муҳим аст? Муқаддима ба Консули Hashicorp Authorization Kubernetes Tekton Pipeline - қубурҳои модарии Кубернетес Сохтани модулҳои динамикӣ барои Nginx Боти Telegram барои Redmine. Чӣ тавр ҳаёти худро барои худ ва дигарон содда кардан мумкин аст
Манбаъ: will.com