Kubernetes'te Canary Dağıtımı #2: Argo Sunumları

Canary dağıtımlarını Kubernetes'e çalıştırmak için k8s'de yerel Argo Rollouts dağıtım denetleyicisini ve GitlabCI'yı kullanacağız

Kubernetes'te Canary Dağıtımı #2: Argo Sunumları

https://unsplash.com/photos/V41PulGL1z0

Bu serideki makaleler

Kanarya Dağıtımı

Umarız okursunuz ilk bölümKanarya Dağıtımlarının ne olduğunu kısaca açıklamıştık. Ayrıca standart Kubernetes kaynakları kullanılarak nasıl uygulanacağını da gösterdik.

Argo Sunumları

Argo Rollouts, bir Kubernetes yerel dağıtım denetleyicisidir. Kubernetes için bir CRD (Özel Kaynak Tanımı) sağlar. Onun sayesinde yeni bir varlık kullanabiliriz: Rollout, çeşitli yapılandırma seçenekleriyle mavi-yeşil ve kanarya dağıtımlarını yöneten.

Özel bir kaynak tarafından kullanılan Argo Rollouts denetleyicisi Rollout, Kubernetes için mavi-yeşil ve kanarya gibi ek dağıtım stratejilerine olanak tanır. Kaynak Rollout işlevsellik eşdeğeri sağlar Deployment, yalnızca ek dağıtım stratejileriyle.
Kaynak Deployments dağıtım için iki strateji vardır: RollingUpdate и Recreate. Bu stratejiler çoğu durum için uygun olsa da, çok büyük ölçekteki sunuculara dağıtım için, Dağıtım denetleyicisinde bulunmayan mavi-yeşil veya kanarya gibi ek stratejiler kullanılır. Bu stratejileri Kubernetes'te kullanmak için kullanıcıların Dağıtımlarının üzerine komut dosyaları yazmaları gerekiyordu. Argo Rollouts Controller, bu stratejileri basit, bildirimsel, yapılandırılabilir parametreler olarak sunar.
https://argoproj.github.io/argo-rollouts

Ayrıca Rollouts ile kullanım için kullanışlı bir web arayüzü sağlayan Argo CI da var, bir sonraki makalede buna göz atacağız.

Argo Rollouts'u yükleme

Sunucu Tarafı

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

Altyapı şalgamımızda (aşağıya bakın) install.yaml'ı zaten i/k8s/argo-rollouts/install.yaml olarak ekledik. Bu şekilde GitlabCI onu kümeye yükleyecektir.

İstemci tarafı (kubectl eklentisi)

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

Örnek Uygulama

Uygulama kodu ve altyapı için ayrı havuzlara sahip olmak iyi bir uygulamadır.

Uygulama için depo

Kim Wuestkamp/k8s-dağıtım-örnek-uygulama

Bu, JSON olarak yanıt döndüren çok basit bir Python+Flask API'sidir. Paketi GitlabCI kullanarak 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-dağıtım-örnek-uygulama:v1
  • wuestkamp/k8s-dağıtım-örnek-uygulama:v2

Aralarındaki tek fark döndürülen JSON dosyasıdır. 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 depoda Kubernetes'e dağıtım için GitlabCI'yı kullanacağız, .gitlab-ci.yml şuna benzer:

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

Kendiniz çalıştırmak için bir kümeye ihtiyacınız olacak, Gcloud'u kullanabilirsiniz:

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

Çatallaman gerekiyor https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure ve bir değişken oluştur KUBECONFIG erişim için yapılandırmayı içerecek olan GitlabCI'da kubectl kümenize.

öyle Bir küme (Gcloud) için kimlik bilgilerinin nasıl alınacağını okuyabilirsiniz.

Altyapı Yaml

Altyapı deposunun içinde hizmetimiz 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

ve 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 Dağıtım ile aynı şekilde çalışır. Bir güncelleme stratejisi belirlemezsek (buradaki kanarya gibi), varsayılan kapsamlı güncelleme Dağıtımı gibi davranacaktır.

Canary konuşlandırması için yaml'de iki adım tanımlıyoruz:

  1. Kanaryaya giden trafiğin %10'u (manuel OK'i bekleyin)
  2. Kanaryaya giden trafiğin %50'si (2 dakika bekledikten sonra %100'e devam edin)

İlk dağıtımın gerçekleştirilmesi

İlk dağıtımdan sonra kaynaklarımız şöyle görünecek:

Kubernetes'te Canary Dağıtımı #2: Argo Sunumları

Ve uygulamanın yalnızca ilk sürümünden yanıt alıyoruz:

Kubernetes'te Canary Dağıtımı #2: Argo Sunumları

Kanarya Dağıtımının Gerçekleştirilmesi

1. Adım: %10 trafik

Canary dağıtımını başlatmak için genellikle dağıtımlarda yaptığımız gibi görüntü sürümünü değiştirmemiz yeterlidir:

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

Ve biz değişiklikleri zorlarız, böylece Gitlab CI devreye girer ve değişiklikleri görürüz:

Kubernetes'te Canary Dağıtımı #2: Argo Sunumları

Şimdi servise erişirsek:

Kubernetes'te Canary Dağıtımı #2: Argo Sunumları

Harika! Kanarya dağıtımımızın ortasındayız. İlerlemeyi aşağıdakileri çalıştırarak görebiliriz:

kubectl argo rollouts get rollout rollout-canary

Kubernetes'te Canary Dağıtımı #2: Argo Sunumları

2. Adım: Trafiğin %50'si:

Şimdi bir sonraki adıma geçelim: trafiğin %50'sini yeniden yönlendirmek. Bu adımı manuel olarak çalıştırılacak şekilde yapılandırdık:

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

Kubernetes'te Canary Dağıtımı #2: Argo Sunumları

Uygulamamız yeni sürümlerden gelen yanıtların %50'sini döndürdü:

Kubernetes'te Canary Dağıtımı #2: Argo Sunumları

Ve kullanıma sunma incelemesi:

Kubernetes'te Canary Dağıtımı #2: Argo Sunumları

Güzel.

3. Adım: Trafiğin %100'si:

Bunu, 2 dakika sonra %50 adımı otomatik olarak bitecek ve %100 adımı başlayacak şekilde ayarladık:

Kubernetes'te Canary Dağıtımı #2: Argo Sunumları

Ve uygulama çıktısı:

Kubernetes'te Canary Dağıtımı #2: Argo Sunumları

Ve kullanıma sunma incelemesi:

Kubernetes'te Canary Dağıtımı #2: Argo Sunumları

Canary dağıtımı tamamlandı.

Argo Rollouts ile daha fazla örnek

Ortam önizlemelerinin nasıl ayarlanacağı ve kanaryaya dayalı karşılaştırmalar gibi daha fazla örneği burada bulabilirsiniz:

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

Argo Rollouts ve Argo CI hakkında video

Bu videoyu gerçekten öneriyorum; Argo Rollouts ve Argo CI'nin birlikte nasıl çalıştığını gösteriyor:

sonuç

Ek dağıtım veya kopya kümesi türlerinin oluşturulmasını yöneten, trafiği yeniden yönlendiren vb. CRD'leri kullanma fikrini gerçekten seviyorum. Onlarla çalışmak sorunsuz gidiyor. Daha sonra Argo CI ile entegrasyonu test etmek istiyorum.

Ancak Argo CI ile Flux CI arasında büyük bir birleşme olacak gibi görünüyor, bu yüzden yeni sürüm çıkana kadar bekleyebilirim: Argo Akısı.

Argo Rollouts veya Argo CI ile herhangi bir deneyiminiz oldu mu?

Ayrıca blogumuzdaki diğer makaleleri de okuyun:

Kaynak: habr.com

Yorum ekle