Jenkins-X Istio Flagger istifadə edərək Canary Deployment
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.
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:
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:
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
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:
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:
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:
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:
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.