Ҷойгиркунии Канария дар Кубернетес # 2: Арго Роллотҳо

Мо контролери ҷойгиркунии k8s Argo Rollouts ва GitlabCI-ро барои иҷро кардани ҷойгиркунии Canary ба Kubernetes истифода хоҳем кард.

Ҷойгиркунии Канария дар Кубернетес # 2: Арго Роллотҳо

https://unsplash.com/photos/V41PulGL1z0

Мақолаҳо дар ин силсила

Ҷойгиркунии Канария

Умедворем, ки шумо хонед қисми аввал, ки мо ба таври мухтасар фаҳмонидем, ки Canary Deployments чист. Мо инчунин нишон додем, ки чӣ гуна онро бо истифода аз захираҳои стандартии Kubernetes татбиқ кунем.

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)

https://argoproj.github.io/argo-rollouts/features/kubectl-plugin

Намунаи ариза

Барои коди барномаҳо ва инфрасохтор анборҳои алоҳида доштан таҷрибаи хуб аст.

Репозиторий барои барнома

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

Ба шумо лозим аст, ки чанг кунед https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure ва тағирёбанда эҷод кунед KUBECONFIG дар GitlabCI, ки конфигуратсияро барои дастрасӣ дар бар мегирад kubectl ба кластери шумо.

Ин аст, Шумо метавонед дар бораи чӣ гуна гирифтани эътимоднома барои кластер (Gcloud) хонед.

Инфрасохтори 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 барои ҷойгиркунии канария муайян мекунем:

  1. 10% трафик ба Канария (интизори OK дастӣ)
  2. 50% трафик ба Канария (2 дақиқа интизор шавед ва то 100% идома диҳед)

Иҷрои ҷойгиркунии ибтидоӣ

Пас аз ҷойгиркунии аввал, захираҳои мо чунин хоҳанд буд:

Ҷойгиркунии Канария дар Кубернетес # 2: Арго Роллотҳо

Ва мо танҳо аз версияи якуми барнома посух мегирем:

Ҷойгиркунии Канария дар Кубернетес # 2: Арго Роллотҳо

Иҷрои ҷойгиркунии 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 ҷойгир мекунад ва мо тағиротро мебинем:

Ҷойгиркунии Канария дар Кубернетес # 2: Арго Роллотҳо

Акнун, агар мо ба хидмат дастрасӣ пайдо кунем:

Ҷойгиркунии Канария дар Кубернетес # 2: Арго Роллотҳо

Аҷоиб! Мо дар мобайни ҷойгиркунии канарӣ қарор дорем. Мо метавонем пешрафтро тавассути иҷро бубинем:

kubectl argo rollouts get rollout rollout-canary

Ҷойгиркунии Канария дар Кубернетес # 2: Арго Роллотҳо

Қадами 2: 50% трафик:

Акнун биёед ба қадами навбатӣ мегузарем: равона кардани 50% трафик. Мо ин қадамро барои дастӣ иҷро кардан танзим кардем:

kubectl argo rollouts promote rollout-canary # continue to step 2

Ҷойгиркунии Канария дар Кубернетес # 2: Арго Роллотҳо

Ва аризаи мо 50% посухҳоро аз версияҳои нав баргардонд:

Ҷойгиркунии Канария дар Кубернетес # 2: Арго Роллотҳо

Ва баррасии паҳнкунӣ:

Ҷойгиркунии Канария дар Кубернетес # 2: Арго Роллотҳо

Аҷоиб.

Қадами 3: 100% трафик:

Мо онро тавре насб кардем, ки пас аз 2 дақиқа қадами 50% ба таври худкор ба итмом мерасад ва қадами 100% оғоз меёбад:

Ҷойгиркунии Канария дар Кубернетес # 2: Арго Роллотҳо

Ва баромади барнома:

Ҷойгиркунии Канария дар Кубернетес # 2: Арго Роллотҳо

Ва баррасии паҳнкунӣ:

Ҷойгиркунии Канария дар Кубернетес # 2: Арго Роллотҳо

Ҷойгиркунии канарӣ анҷом ёфт.

Намунаҳои бештар бо Argo Rollouts

Дар ин ҷо мисолҳои бештар мавҷуданд, ба монанди чӣ гуна танзим кардани пешнамоишҳои муҳити зист ва муқоисаҳо дар асоси канар:

https://github.com/argoproj/argo-rollouts/tree/master/examples

Видео дар бораи Argo Rollouts ва Argo CI

Ман воқеан ин видеоро тавсия медиҳам, он нишон медиҳад, ки чӣ тавр Argo Rollouts ва Argo CI якҷоя кор мекунанд:

Натиҷа

Ба ман идеяи истифодаи CRD-ҳо, ки эҷоди намудҳои иловагии ҷойгиркунӣ ё репликаетҳо, масири интиқоли трафик ва ғайраро идора мекунанд, хеле маъқул аст. Кор бо онхо муътадил мегузарад. Минбаъд ман мехоҳам ҳамгироиро бо Argo CI санҷам.

Аммо, ба назар чунин мерасад, ки якҷояшавии бузурги Argo CI ва Flux CI меояд, бинобар ин ман метавонам то нашри нав интизор шавам: Argo Flux.

Оё шумо бо Argo Rollouts ё Argo CI таҷриба доштед?

Инчунин мақолаҳои дигарро дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ