Jenkins-X Istio Flagger'ı kullanarak Canary Dağıtımı
Canary dağıtımını GitOps aracılığıyla manuel olarak gerçekleştireceğiz ve ana Kubernetes kaynaklarını oluşturacağız/değiştireceğiz. Bu makale öncelikle tanıtım amaçlıdır Aşağıdaki makalelerde ele alacağımız daha etkili otomasyon yöntemleri olduğundan Kubernetes Canary'de dağıtımın nasıl çalıştığı hakkında bilgi edinin.
Canary stratejisinde güncellemeler öncelikle kullanıcıların yalnızca bir alt kümesine uygulanır. Sürüm, tüm kullanıcılara yayınlanmadan önce izleme, günlük verileri, manuel test veya diğer geri bildirim kanalları aracılığıyla test edilir.
Kubernetes Dağıtımı (sürekli güncelleme)
Kubernetes Dağıtımı için varsayılan strateji, belirli sayıda bölmenin görüntülerin yeni sürümleriyle başlatıldığı sürekli güncellemedir. Sorunsuz bir şekilde oluşturulduysa, görüntülerin eski versiyonlarını içeren bölmeler sonlandırılır ve paralel olarak yeni bölmeler oluşturulur.
GitOps
Bu örnekte GitOps'u kullanıyoruz çünkü:
Git'i tek bir gerçek kaynağı olarak kullanma
derleme ve dağıtım için Git Operasyonlarını kullanıyoruz (git tag/merge dışında hiçbir komuta gerek yok)
Örnek
Uygulama kodu için bir havuza ve altyapı için bir havuza sahip olmak gibi iyi bir uygulamayı ele alalım.
Uygulama deposu
Bu, JSON olarak yanıt döndüren çok basit bir Python+Flask API'sidir. Paketi GitlabCI aracılığıyla oluşturacağız ve sonucu Gitlab Registry'ye aktaracağız. Kayıt defterinde iki farklı yayın sürümümüz var:
wuestkamp/k8s-deployment-example-app:v1
wuestkamp/k8s-deployment-example-app:v2
Aralarındaki tek fark, döndürülen JSON dosyasındaki değişikliktir. Hangi sürümle iletişim kurduğumuzu mümkün olduğunca kolay görselleştirmek için bu uygulamayı kullanıyoruz.
Altyapı deposu
Bu şalgamda GitlabCI aracılığıyla Kubernetes'e dağıtacağız, .gitlab-ci.yml выглядит следующим образом:
App-deploy'un henüz tanımlanmış herhangi bir kopyaya sahip olmadığını unutmayın.
İlk dağıtımın gerçekleştirilmesi
İlk dağıtımı başlatmak için GitlabCI işlem hattını ana dalda manuel olarak başlatabilirsiniz. daha sonrasında kubectl aşağıdaki çıktıyı vermelidir:
Görüyoruz app 10 kopya ile dağıtım ve 0 ile uygulama kanaryası. Ayrıca, üzerinden erişebileceğimiz bir LoadBalancer da var. curl Harici IP aracılığıyla:
while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done
Test uygulamamızın sadece “v1” döndürdüğünü görüyoruz.
Canary dağıtımını yürütme
1. Adım: Bazı kullanıcılar için yeni bir sürüm yayınlayın
Deploy-canary.yaml dosyasında ve yeni sürüm görüntüsünde replika sayısını 1 olarak ayarladık:
Bu değişiklikleri dağıtımın başlayacağı depoya (GitlabCI aracılığıyla) gönderiyoruz ve sonucu görüyoruz:
Her ikisinde de uygulama seçici bulunduğundan Hizmetimiz her iki dağıtıma da işaret edecektir. Kubernetes'in varsayılan rastgele seçimi nedeniyle isteklerin yaklaşık %10'u için farklı yanıtlar görmeliyiz:
Uygulamamızın mevcut durumu (GitOps, Tek Kaynak Gerçeği olarak Git'ten alınmıştır), her sürüm için bir tane olmak üzere aktif replikalara sahip iki dağıtımın varlığıdır.
Kullanıcıların ~%10'u yeni bir sürüme aşina oluyor ve istemeden onu test ediyor. Artık günlüklerdeki hataları kontrol etmenin ve sorunları bulmak için verileri izlemenin zamanı geldi.
2. Adım: Yeni sürümü tüm kullanıcılara yayınlayın
Her şeyin yolunda gittiğine karar verdik ve şimdi yeni sürümü tüm kullanıcılara sunmamız gerekiyor. Bunu yapmak için basitçe güncelliyoruz deploy.yaml görüntünün yeni bir sürümünün yüklenmesi ve kopya sayısı 10'a eşittir. deploy-canary.yaml replika sayısını tekrar 0'a ayarladık. Dağıtımdan sonra sonuç aşağıdaki gibi olacaktır:
Özetleme
Bana göre dağıtımı bu şekilde manuel olarak çalıştırmak, k8s kullanılarak ne kadar kolay yapılandırılabileceğini anlamaya yardımcı oluyor. Kubernetes her şeyi bir API aracılığıyla güncellemenize izin verdiği için bu adımlar komut dosyaları aracılığıyla otomatikleştirilebilir.
Uygulanması gereken diğer bir şey de, yalnızca yeni sürüme erişilebilen bir test cihazı giriş noktasıdır (LoadBalancer veya Ingress aracılığıyla). Manuel tarama için kullanılabilir.
Gelecek makalelerde, yaptıklarımızın çoğunu uygulayan diğer otomatik çözümlere göz atacağız.