Kubernetes # 2-də Kanar Yerləşdirmə: Argo Rollouts

Kubernetes-də Canary yerləşdirmələrini işə salmaq üçün k8s-in yerli Argo Rollouts yerləşdirmə nəzarətçisi və GitlabCI-dən istifadə edəcəyik.

Kubernetes # 2-də Kanar Yerləşdirmə: Argo Rollouts

https://unsplash.com/photos/V41PulGL1z0

Bu seriyadakı məqalələr

Canary Deployment

Oxumağınıza ümid edirik birinci hissə, burada Canary Deployments nə olduğunu qısaca izah etdik. Standart Kubernetes resurslarından istifadə edərək bunu necə həyata keçirəcəyimizi də göstərdik.

Argo Rollouts

Argo Rollouts Kubernetes yerli yerləşdirmə nəzarətçisidir. Kubernetes üçün CRD (Xüsusi Resurs Tərifi) təmin edir. Bunun sayəsində yeni bir varlıqdan istifadə edə bilərik: Rollout, müxtəlif konfiqurasiya seçimləri ilə mavi-yaşıl və kanareyka yerləşdirmələrini idarə edir.

Xüsusi resurs tərəfindən istifadə edilən Argo Rollouts nəzarətçisi Rollout, Kubernetes üçün mavi-yaşıl və kanareyka kimi əlavə yerləşdirmə strategiyalarına imkan verir. Resurs Rollout funksionallıq ekvivalentini təmin edir Deployment, yalnız əlavə yerləşdirmə strategiyaları ilə.
vəsait Deployments yerləşdirmə üçün iki strategiyaya malikdir: RollingUpdate и Recreate. Bu strategiyalar əksər hallarda uyğun olsa da, çox geniş miqyasda serverlərə yerləşdirmə üçün Yerləşdirmə nəzarətçisində mövcud olmayan mavi-yaşıl və ya kanarya kimi əlavə strategiyalardan istifadə olunur. Kubernetes-də bu strategiyalardan istifadə etmək üçün istifadəçilər Yerləşdirmələrinin üstünə skriptlər yazmalı idilər. Argo Rollouts Controller bu strategiyaları sadə, deklarativ, konfiqurasiya edilə bilən parametrlər kimi ifşa edir.
https://argoproj.github.io/argo-rollouts

Rollouts ilə istifadə üçün rahat veb-interfeysi təmin edən Argo CI də var, biz növbəti məqalədə buna nəzər salacağıq.

Argo Rollouts quraşdırılması

Server tərəfi

kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml

İnfrastruktur şalğamımızda (aşağıya bax) biz artıq install.yaml faylını i/k8s/argo-rollouts/install.yaml kimi əlavə etmişik. Bu yolla GitlabCI onu klasterə quraşdıracaq.

Müştəri tərəfi (kubectl plagini)

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

Tətbiq nümunəsi

Tətbiq kodu və infrastruktur üçün ayrıca depoların olması yaxşı təcrübədir.

Tətbiq üçün depo

Kim Wuestkamp/k8s-deployment-example-app

Bu, cavabı JSON kimi qaytaran çox sadə Python+Flask API-dir. GitlabCI istifadə edərək paketi quracağıq və nəticəni Gitlab Reyestrinə köçürəcəyik. Reyestrdə iki fərqli buraxılış versiyası var:

  • wuestkamp/k8s-deployment-example-app:v1
  • wuestkamp/k8s-deployment-example-app:v2

Aralarındakı yeganə fərq qaytarılan JSON faylıdır. Hansı versiya ilə əlaqə saxladığımızı mümkün qədər asanlıqla vizuallaşdırmaq üçün bu proqramdan istifadə edirik.

İnfrastruktur anbarı

Bu depoda biz Kubernetes-də yerləşdirmə üçün GitlabCI-dən istifadə edəcəyik, .gitlab-ci.yml belə görünür:

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

Onu özünüz idarə etmək üçün bir klasterə ehtiyacınız olacaq, Gcloud-dan istifadə edə bilərsiniz:

gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80

Siz çəngəl lazımdır https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure və dəyişən yaradın KUBECONFIG giriş üçün konfiqurasiyanı ehtiva edən GitlabCI-də kubectl klasterinizə.

Burada Klaster (Gcloud) üçün etimadnamələri necə əldə etmək barədə oxuya bilərsiniz.

İnfrastruktur Yaml

İnfrastruktur anbarının daxilində xidmətimiz var:

apiVersion: v1
kind: Service
metadata:
 labels:
   id: rollout-canary
 name: app
spec:
 ports:
 - port: 80
   protocol: TCP
   targetPort: 5000
 selector:
   id: app
 type: LoadBalancer

və 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 Yerləşdirmə ilə eyni işləyir. Yeniləmə strategiyası təyin etməsək (burada kanareyka kimi) o, defolt yayılan yeniləmə Yerləşdirməsi kimi davranacaq.

Kanareyka yerləşdirilməsi üçün yaml-da iki addım müəyyən edirik:

  1. Kanaryaya gedən trafikin 10%-i (əl ilə OK üçün gözləyin)
  2. Kanaryaya 50% trafik (2 dəqiqə gözləyin, sonra 100%-ə qədər davam edin)

İlkin yerləşdirmənin həyata keçirilməsi

İlkin yerləşdirmədən sonra resurslarımız belə görünəcək:

Kubernetes # 2-də Kanar Yerləşdirmə: Argo Rollouts

Və biz yalnız tətbiqin ilk versiyasından cavab alırıq:

Kubernetes # 2-də Kanar Yerləşdirmə: Argo Rollouts

Canary Deployment həyata keçirilir

Addım 1: 10% trafik

Kanareyka yerləşdirməyə başlamaq üçün adətən yerləşdirmələrdə etdiyimiz kimi sadəcə şəkil versiyasını dəyişdirməliyik:

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
...

Biz dəyişikliklərə təkan veririk, buna görə də Gitlab CI yerləşdirir və dəyişiklikləri görürük:

Kubernetes # 2-də Kanar Yerləşdirmə: Argo Rollouts

İndi xidmətə daxil olsaq:

Kubernetes # 2-də Kanar Yerləşdirmə: Argo Rollouts

Əla! Kanareyka yerləşdirməmizin ortasındayıq. Çalışmaqla tərəqqini görə bilərik:

kubectl argo rollouts get rollout rollout-canary

Kubernetes # 2-də Kanar Yerləşdirmə: Argo Rollouts

Addım 2: 50% trafik:

İndi növbəti addıma keçək: trafikin 50%-ni yönləndirmək. Bu addımı əl ilə icra etmək üçün konfiqurasiya etdik:

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

Kubernetes # 2-də Kanar Yerləşdirmə: Argo Rollouts

Tətbiqimiz yeni versiyalardan gələn cavabların 50%-ni qaytardı:

Kubernetes # 2-də Kanar Yerləşdirmə: Argo Rollouts

Və təqdimat baxışı:

Kubernetes # 2-də Kanar Yerləşdirmə: Argo Rollouts

Möhtəşəm.

Addım 3: 100% trafik:

Biz onu elə qurmuşuq ki, 2 dəqiqədən sonra 50% addım avtomatik bitsin və 100% addım başlasın:

Kubernetes # 2-də Kanar Yerləşdirmə: Argo Rollouts

Və tətbiq çıxışı:

Kubernetes # 2-də Kanar Yerləşdirmə: Argo Rollouts

Və təqdimat baxışı:

Kubernetes # 2-də Kanar Yerləşdirmə: Argo Rollouts

Canary yerləşdirilməsi tamamlandı.

Argo Rollouts ilə daha çox nümunə

Burada daha çox nümunə var, məsələn, ətraf mühitə baxışın necə qurulması və kanareyka əsasında müqayisələr:

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

Argo Rollouts və Argo CI haqqında video

Bu videonu həqiqətən tövsiyə edirəm, o, Argo Rollouts və Argo CI-nin birlikdə necə işlədiyini göstərir:

Ümumi

Əlavə yerləşdirmə növlərinin və ya replikasetlərin yaradılmasını, trafikin yönləndirilməsini və s.-ni idarə edən CRD-lərdən istifadə ideyasını çox bəyənirəm. Onlarla iş rəvan gedir. Sonra Argo CI ilə inteqrasiyanı sınamaq istərdim.

Bununla belə, Argo CI və Flux CI-nin böyük birləşməsi var, ona görə də yeni buraxılış çıxana qədər gözləyə bilərəm: Arqo axını.

Argo Rollouts və ya Argo CI ilə təcrübəniz varmı?

Bloqumuzdakı digər məqalələri də oxuyun:

Mənbə: www.habr.com

Добавить комментарий