Kubernetes №1-də Canary Yerləşdirmə: Gitlab CI

Kubernetes-də Canary yerləşdirməsini həyata keçirmək və istifadə etmək üçün Gitlab CI və manual GitOps-dan istifadə edəcəyik.

Kubernetes №1-də Canary Yerləşdirmə: Gitlab CI

Bu seriyadan məqalələr:

Canary yerləşdirməni GitOps vasitəsilə əl ilə yerinə yetirəcəyik və əsas Kubernetes resurslarını yaradacağıq/dəyişdirəcəyik. Bu məqalə ilk növbədə giriş üçün nəzərdə tutulub Kubernetes Canary-də yerləşdirmənin necə işlədiyi ilə, çünki sonrakı məqalələrdə nəzərdən keçirəcəyimiz daha təsirli avtomatlaşdırma üsulları var.


Kubernetes №1-də Canary Yerləşdirmə: Gitlab CI

https://www.norberteder.com/canary-deployment/

Canary Deployment

Canary strategiyası ilə yeniləmələr əvvəlcə yalnız istifadəçilərin bir hissəsinə tətbiq edilir. Monitorinq, log məlumatları, əllə sınaq və ya digər əks əlaqə kanalları vasitəsilə buraxılış bütün istifadəçilərə buraxılmazdan əvvəl sınaqdan keçirilir.

Kubernetes Deployment (yayılan yeniləmə)

Kubernetes Deployment üçün standart strategiya, şəkillərin yeni versiyaları ilə müəyyən sayda podların işə salındığı yuvarlanan yeniləmədir. Əgər onlar problemsiz yaradılıbsa, şəkillərin köhnə versiyaları olan podlar dayandırılır və paralel olaraq yeni podlar yaradılır.

GitOps

Bu nümunədə GitOps-dan istifadə edirik, çünki biz:

  • Git-dən tək həqiqət mənbəyi kimi istifadə
  • biz qurmaq və yerləşdirmək üçün Git Əməliyyatlarından istifadə edirik (git tag/birləşmədən başqa heç bir əmrə ehtiyac yoxdur)

Misal

Gəlin yaxşı bir təcrübə götürək - proqram kodu üçün bir depoya və infrastruktur üçün bir depoya sahib olmaq.

Tətbiq deposu

Bu, cavabı JSON kimi qaytaran çox sadə Python+Flask API-dir. Paketi GitlabCI vasitəsilə 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ılmış JSON faylındakı dəyişiklikdir. 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 şalğamda biz GitlabCI vasitəsilə Kubernetes-ə yerləşdirəcəyik, .gitlab-ci.yml belə görünür:

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

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

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

İnfrastruktur Yaml

İnfrastruktur anbarında xidmətimiz var:

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

Və yerləşdirmə 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

Və başqa bir yerləşdirmə 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

Qeyd edək ki, app-deploy-un hələ müəyyən edilmiş replikaları yoxdur.

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

İlkin yerləşdirməyə başlamaq üçün siz master filialında GitlabCI boru kəmərini əl ilə başlaya bilərsiniz. Ondan sonra kubectl aşağıdakıları çıxarmalıdır:

Kubernetes №1-də Canary Yerləşdirmə: Gitlab CI

Biz görürük app 10 replika ilə yerləşdirmə və 0 ilə app-canary. Həmçinin LoadBalancer də var ki, biz ondan daxil ola bilərik. curl Xarici IP vasitəsilə:

while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done

Kubernetes №1-də Canary Yerləşdirmə: Gitlab CI

Test tətbiqimizin yalnız “v1” qaytardığını görürük.

Canary yerləşdirilməsi həyata keçirilir

Addım 1: Bəzi istifadəçilər üçün yeni versiya buraxın

Biz deploy-canary.yaml faylında və yeni versiya təsvirində replikaların sayını 1-ə təyin etdik:

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

Faylda deploy.yaml replikaların sayını 9-a dəyişdik:

kind: Deployment
metadata:
 name: app
spec:
 replicas: 9
 selector:
   matchLabels:
     id: app
...

Bu dəyişiklikləri yerləşdirmənin başlayacağı depoya (GitlabCI vasitəsilə) itələyirik və nəticədə görürük:

Kubernetes №1-də Canary Yerləşdirmə: Gitlab CI

Xidmətimiz hər iki yerləşdirməyə işarə edəcək, çünki hər ikisində proqram seçicisi var. Kubernetes-in defolt randomizasiyasına görə sorğuların ~10%-i üçün fərqli cavablar görməliyik:

Kubernetes №1-də Canary Yerləşdirmə: Gitlab CI

Tətbiqimizin hazırkı vəziyyəti (GitOps, Vahid Həqiqət Mənbəsi kimi Git-dən götürülmüşdür) hər versiya üçün bir aktiv replika ilə iki yerləşdirmənin olmasıdır.

İstifadəçilərin ~10%-i yeni versiya ilə tanış olur və istəmədən onu sınaqdan keçirir. İndi problemləri tapmaq üçün qeydlərdəki səhvləri və monitorinq məlumatlarını yoxlamağın vaxtıdır.

Addım 2: Yeni versiyanı bütün istifadəçilərə buraxın

Hər şeyin yaxşı getdiyinə qərar verdik və indi yeni versiyanı bütün istifadəçilər üçün yaymalıyıq. Bunu etmək üçün sadəcə yeniləyirik deploy.yaml təsvirin yeni versiyasının quraşdırılması və replikaların sayı 10-a bərabərdir. In deploy-canary.yaml replikaların sayını yenidən 0-a təyin etdik. Yerləşdirmədən sonra nəticə aşağıdakı kimi olacaq:

Kubernetes №1-də Canary Yerləşdirmə: Gitlab CI

Yekunlaşdırma

Mənim üçün yerləşdirməni bu şəkildə əl ilə idarə etmək onun k8s istifadə edərək necə asanlıqla konfiqurasiya oluna biləcəyini anlamağa kömək edir. Kubernetes sizə hər şeyi API vasitəsilə yeniləməyə imkan verdiyi üçün bu addımlar skriptlər vasitəsilə avtomatlaşdırıla bilər.

Tətbiq edilməli olan başqa bir şey test cihazının giriş nöqtəsidir (LoadBalancer və ya Giriş vasitəsilə) onun vasitəsilə yalnız yeni versiyaya daxil olmaq olar. Əl ilə gözdən keçirmək üçün istifadə edilə bilər.

Gələcək məqalələrdə biz gördüyümüz işlərin əksəriyyətini həyata keçirən digər avtomatlaşdırılmış həlləri nəzərdən keçirəcəyik.

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

Mənbə: www.habr.com

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