Öğretici: Kubernetes dağıtımları için kanarya dağıtım stratejisi kullanma
Azure DevOps Services | Azure DevOps Server 2022
Kanarya dağıtım stratejisi, kararlı üretim sürümlerinin yanında uygulamanın yeni sürümlerini dağıtma anlamına gelir. Daha sonra, dağıtımı yükseltmeden veya reddetmeden önce kanarya sürümünün taban çizgisiyle karşılaştırmasını görebilirsiniz.
Bu adım adım kılavuz, Kubernetes bildirim görevinin kanarya stratejisinin nasıl kullanılacağını kapsar. Özellikle Kubernetes için kanarya dağıtımlarını ayarlamayı ve kodu değerlendirmek için ilişkili iş akışını öğreneceksiniz. Daha sonra temel ve kanarya uygulaması dağıtımlarını karşılaştırmak için bu kodu kullanırsınız, böylece kanarya dağıtımını yükseltmeye veya reddetmeye karar vekleyebilirsiniz.
Azure Kubernetes Service kullanıyorsanız, özel bir kümeye veya yerel hesapları devre dışı bırakılmış bir kümeye bağlanmanın en iyi yolu Azure Resource Manager hizmet bağlantı türüdür.
Önkoşullar
- Etkin aboneliği olan bir Azure hesabı. Ücretsiz hesap oluşturun.
- Bir GitHub hesabı. Henüz yoksa ücretsiz bir GitHub hesabı oluşturun.
- Anında iletme ayrıcalıklarına sahip bir Azure Container Registry. Henüz bir Azure Container Registry'niz yoksa bir Azure Container Registry oluşturun.
- Kubernetes kümesi. Azure Kubernetes Service (AKS) kümesi dağıtma.
Örnek kod
GitHub'da aşağıdaki deponun çatalını oluşturun.
https://github.com/MicrosoftDocs/azure-pipelines-canary-k8s
Bu kılavuz sırasında kullanılan depodaki dosyalara kısa bir genel bakış aşağıdadır:
- ./app:
- app.py - Python uygulamaları için Prometheus izleme kitaplığı kullanılarak izlenen basit, Flask tabanlı bir web sunucusu. Değişkenin değerine
success_rate
göre verilen iyi ve kötü yanıtların sayısı için özel bir sayaç ayarlanır. - Dockerfile - app.py yapılan her değişiklikle görüntüyü oluşturmak için kullanılır. Her değişiklikte derleme işlem hattı tetiklenir ve görüntü derlenir ve kapsayıcı kayıt defterine gönderilir.
- app.py - Python uygulamaları için Prometheus izleme kitaplığı kullanılarak izlenen basit, Flask tabanlı bir web sunucusu. Değişkenin değerine
- ./manifests:
- deployment.yml - Daha önce yayımlanan görüntüye karşılık gelen dağıtım iş yükünün belirtimini
sampleapp
içerir. Bu bildirim dosyasını yalnızca dağıtım nesnesinin kararlı sürümü için değil, aynı zamanda iş yüklerinin temel ve kanarya çeşitlemelerini türetmek için de kullanırsınız. - service.yml - Hizmeti oluşturur
sampleapp
. Bu hizmet, istekleri daha önce bahsedilen dağıtımlara (kararlı, temel ve kanarya) göre spun up olan podlara yönlendirir.
- deployment.yml - Daha önce yayımlanan görüntüye karşılık gelen dağıtım iş yükünün belirtimini
- ./Misc
- service-monitor.yml - ServiceMonitor nesnesi ayarlamak için kullanılır. Bu nesne Prometheus ölçüm kazıma işlemini ayarlar.
- fortio-deploy.yml - Fortio dağıtımı ayarlamak için kullanılır. Bu dağıtım daha sonra, daha önce dağıtılan hizmete istek akışı göndermek için
sampleapp
bir yük testi aracı olarak kullanılır. 'asampleapp
gönderilen istek akışı, üç dağıtımın (kararlı, temel ve kanarya) altındaki podlara yönlendirilir.
Not
Bu kılavuzda kod izleme ve izleme için Prometheus kullanacaksınız. Azure Uygulaması lication Insights gibi herhangi bir eşdeğer çözüm alternatif olarak kullanılabilir.
prometheus-operator yükleme
Prometheus'u kümenize yüklemek için geliştirme makinenizden aşağıdaki komutu kullanın. Kubectl ve Helm yüklü olmalıdır ve bağlamı dağıtmak istediğiniz kümeye ayarlamanız gerekir. Daha sonra panolardaki temel ve kanarya ölçümlerini görselleştirmek için kullandığınız Grafana, bu Helm grafiğinin bir parçası olarak yüklenir.
Önce Helm yüklemenize Prometheus Community Kubernetes Helm Charts deposunu ekleyeceksiniz. Ardından kube-prometheus yığınını, kubernetes bildirimlerinden oluşan bir koleksiyonu, Grafana panolarını ve Prometheus kurallarını yükleyeceksiniz.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update # update local cache
helm install --name sampleapp prometheus-community/kube-prometheus-stack
Hizmet bağlantıları oluşturma
- Azure DevOps menüsünde Proje ayarları>İşlem Hatları>Hizmeti bağlantıları'na gidin.
- Kapsayıcı kayıt defterinizle ilişkili bir Docker kayıt defteri hizmeti bağlantısı oluşturun. Bunu azure-pipelines-canary-k8s olarak adlandırabilirsiniz.
- Dağıtmak istediğiniz Kubernetes kümesi ve ad alanı için bir Kubernetes hizmet bağlantısı oluşturun. Bunu azure-pipelines-canary-k8s olarak adlandırabilirsiniz.
Not
Azure Kubernetes Service kullanıyorsanız, özel bir kümeye veya yerel hesapları devre dışı bırakılmış bir kümeye bağlanmanın en iyi yolu Azure Resource Manager hizmet bağlantı türüdür .
Sürekli tümleştirmeyi ayarlama
İşlem Hatları İşlem Hattı> Oluştur'a gidin ve deponuzu seçin.
Yapılandır sekmesinde Başlatıcı işlem hattı'nı seçin.
Gözden Geçir sekmesinde işlem hattı YAML'sini bu kodla değiştirin.
trigger: - main pool: vmImage: ubuntu-latest variables: imageName: azure-pipelines-canary-k8s steps: - task: Docker@2 displayName: Build and push image inputs: containerRegistry: azure-pipelines-canary-k8s #replace with name of your Docker registry service connection repository: $(imageName) command: buildAndPush Dockerfile: app/Dockerfile tags: | $(Build.BuildId)
Oluşturduğunuz Docker kayıt defteri hizmeti bağlantısı ile
example.azurecr.io
ilişkilendirilmişse, önceki yapılandırmayaexample.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId)
göre görüntü ile olur.
Bildirim dosyasını düzenle
Bildirimlerde/deployment.yml değerini kapsayıcı kayıt defterinizin URL'si ile değiştirin<example>
. Örneğin, değiştirildikten sonra görüntü alanı gibi contosodemo.azurecr.io/azure-pipelines-canary-k8s
görünmelidir.
Sürekli dağıtımı ayarlama
Aşağıdaki bölümlerde, kanarya aşamasının nasıl dağıtılacağı ve el ile müdahale yoluyla kanaryanın yükseltilmesi veya reddedilmesi dahil olmak üzere sürekli dağıtımı ayarlama adımları sağlanır.
Kanarya aşamasını dağıtma
YAML veya Klasik ile dağıtım yapabilirsiniz.
İşlem Hatları Ortamları>>Ortam oluştur'a gidin.
Yeni bir ortam oluşturun.
- Ad: akscanary
- Kaynak: Kubernetes'i seçin.
İleri'yi seçin ve Kubernetes kaynağınızı aşağıdaki gibi yapılandırın:
- Sağlayıcı: Azure Kubernetes Service
- Azure aboneliği: Kubernetes kümenizi barındıran aboneliği seçin.
- Küme: Kümenizi seçin.
- Ad Alanı: Canarydemo adıyla yeni bir ad alanı oluşturun.
Doğrula ve Oluştur'u seçin.
Pipelines’a gidin. Oluşturduğunuz işlem hattını seçin ve Düzenle'yi seçin.
Daha önce oluşturduğunuz adımı artık bir aşama kullanacak şekilde değiştirin. Bildirimleri ve sair dizinleri ardışık aşamalar tarafından kullanılmak üzere yapıt olarak kopyalamak için iki adım daha ekleyin. Ayrıca, işlem hattınızda daha sonra daha kolay kullanım için birkaç değeri değişkenlere taşımak isteyebilirsiniz. Tüm YAML'niz şimdi şöyle görünmelidir.
trigger: - main pool: vmImage: ubuntu-latest variables: imageName: azure-pipelines-canary-k8s dockerRegistryServiceConnection: dockerRegistryServiceConnectionName #replace with name of your Docker registry service connection imageRepository: 'azure-pipelines-canary-k8s' containerRegistry: example.azurecr.io #replace with the name of your container registry, Should be in the format example.azurecr.io tag: '$(Build.BuildId)' stages: - stage: Build displayName: Build stage jobs: - job: Build displayName: Build pool: vmImage: ubuntu-latest steps: - task: Docker@2 displayName: Build and push image inputs: containerRegistry: $(dockerRegistryServiceConnection) repository: $(imageName) command: buildAndPush Dockerfile: app/Dockerfile tags: | $(tag) - publish: manifests artifact: manifests - publish: misc artifact: misc
Kanarya sürümünü dağıtmak için YAML dosyanızın sonuna bir aşama ekleyin.
- stage: DeployCanary displayName: Deploy canary dependsOn: Build condition: succeeded() jobs: - deployment: Deploycanary displayName: Deploy canary pool: vmImage: ubuntu-latest environment: 'akscanary.canarydemo' strategy: runOnce: deploy: steps: - task: KubernetesManifest@0 displayName: Create imagePullSecret inputs: action: createSecret secretName: azure-pipelines-canary-k8s dockerRegistryEndpoint: azure-pipelines-canary-k8s - task: KubernetesManifest@0 displayName: Deploy to Kubernetes cluster inputs: action: 'deploy' strategy: 'canary' percentage: '25' manifests: | $(Pipeline.Workspace)/manifests/deployment.yml $(Pipeline.Workspace)/manifests/service.yml containers: '$(containerRegistry)/$(imageRepository):$(tag)' imagePullSecrets: azure-pipelines-canary-k8s - task: KubernetesManifest@0 displayName: Deploy Forbio and ServiceMonitor inputs: action: 'deploy' manifests: | $(Pipeline.Workspace)/misc/*
Doğrudan ana dala işleyerek işlem hattınızı kaydedin. Bu işleme işlem hattınızı zaten başarıyla çalıştırmalıdır.
Kanaryanın tanıtılması veya reddedilmesi için el ile müdahale
YAML veya Klasik ile el ile müdahale edebilirsiniz.
İşlem Hatları Ortamları>>Yeni ortam'a gidin.
Yeni ortamı yapılandırın.
- Ad: akspromote
- Kaynak: Kubernetes'i seçin.
İleri'yi seçin ve Kubernetes kaynağınızı aşağıdaki gibi yapılandırın:
- Sağlayıcı: Azure Kubernetes Service
- Azure aboneliği: Kubernetes kümenizi barındıran aboneliği seçin.
- Küme: Kümenizi seçin.
- Ad Alanı: Daha önce oluşturduğunuz canarydemo ad alanını seçin.
Doğrula ve Oluştur'u seçin.
Ortam listesinden yeni
akspromote
ortamınızı seçin.Onaylar'ı seçin ve Onayları denetler>. Ardından üç nokta simgesini (üç nokta) seçin.
Onayınızı aşağıdaki gibi yapılandırın:
- Onaylayanlar: Kendi kullanıcı hesabınızı ekleyin.
- Gelişmiş: Onaylayanların kendi çalıştırmalarını onaylamasına izin ver kutusunun seçili olduğundan emin olun.
Oluştur'u belirleyin.
İşlem hatları'na gidin ve oluşturduğunuz işlem hattını seçin. Ardından Düzenle’yi seçin.
Değişiklikleri yükseltmek için YAML dosyanızın sonuna başka bir aşama
PromoteRejectCanary
ekleyin.- stage: PromoteRejectCanary displayName: Promote or Reject canary dependsOn: DeployCanary condition: succeeded() jobs: - deployment: PromoteCanary displayName: Promote Canary pool: vmImage: ubuntu-latest environment: 'akspromote.canarydemo' strategy: runOnce: deploy: steps: - task: KubernetesManifest@0 displayName: promote canary inputs: action: 'promote' strategy: 'canary' manifests: '$(Pipeline.Workspace)/manifests/*' containers: '$(containerRegistry)/$(imageRepository):$(tag)' imagePullSecrets: '$(imagePullSecret)'
Değişiklikleri geri almak için YAML dosyanızın sonuna başka bir aşama
RejectCanary
ekleyin.- stage: RejectCanary displayName: Reject canary dependsOn: PromoteRejectCanary condition: failed() jobs: - deployment: RejectCanary displayName: Reject Canary pool: vmImage: ubuntu-latest environment: 'akscanary.canarydemo' strategy: runOnce: deploy: steps: - task: KubernetesManifest@0 displayName: reject canary inputs: action: 'reject' strategy: 'canary' manifests: '$(Pipeline.Workspace)/manifests/*'
Kaydet'i seçerek YAML işlem hattınızı kaydedin ve doğrudan ana dala işleyin.
Kararlı bir sürüm dağıtma
YAML veya Klasik ile kararlı bir sürüm dağıtabilirsiniz.
İşlem hattının ilk çalıştırması için iş yüklerinin kararlı sürümü ve bunların temel veya kanarya sürümleri kümede mevcut değildir. Kararlı sürümü dağıtmak için:
- uygulama/app.py olarak değiştirin
success_rate = 5
success_rate = 10
. Bu değişiklik işlem hattını tetikler ve görüntünün derlemesine ve kapsayıcı kayıt defterine gönderilmesine yol açar. Ayrıca aşamayı tetiklerDeployCanary
. - Ortamda bir onay yapılandırdığınızdan
akspromote
, sürüm bu aşamayı çalıştırmadan önce bekler. - Çalıştırmanın özetinde Gözden Geçir>Onayla'yı seçin. Bu, iş yüklerinin kararlı sürümünü (
sampleapp
bildirimler/ deployment.yml dağıtımı) ad alanına dağıtır.
Kanarya iş akışını başlatma
İş yükünün sampleapp
kararlı sürümü artık kümede var. Ardından simülasyon uygulamasında aşağıdaki değişikliği yapın:
uygulama/app.py olarak değiştirin success_rate = 10
success_rate = 20
.
Bu değişiklik derleme işlem hattını tetikleyerek görüntünün derlenmesine ve kapsayıcı kayıt defterine gönderilmesine neden olur. Bu işlem de yayın işlem hattını tetikler ve Dağıtım kanarya aşamasına başlar.
İstek simülasyonu
Geliştirme makinenizde aşağıdaki komutları çalıştırın ve hizmette sampleapp
sabit bir istek akışı göndermek için çalışır durumda tutun. sampleapp
istekleri kararlı sampleapp
dağıtım tarafından spun pod'lara ve ve sampleapp-canary
dağıtımları tarafından sampleapp-baseline
spun up up pod'lara yönlendirir. için sampleapp
belirtilen seçici bu podların tümü için geçerlidir.
FORTIO_POD=$(kubectl get pod | grep fortio | awk '{ print $1 }')
kubectl exec -it $FORTIO_POD -c fortio /usr/bin/fortio -- load -allow-initial-errors -t 0 http://sampleapp:8080/
Grafana panosunu ayarlama
Grafana'ya erişebilmek için yerel geliştirme makinenizde aşağıdaki bağlantı noktası iletme komutunu çalıştırın.
kubectl port-forward svc/sampleapp-grafana 3000:80
Tarayıcıda aşağıdaki URL'yi açın.
http://localhost:3000/login
Helm grafiği yüklemesi sırasında
prometheus-operator
değer geçersiz kılınmadığı süreceadminPassword
kimlik bilgileriniz istendiğinde aşağıdaki değerleri kullanabilirsiniz:- kullanıcı adı: yönetici
- parola: prom-operator
Soldaki menüden Pano Grafı'nı> seçin.+>
Yeni eklenen panelde herhangi bir yeri seçin ve paneli düzenlemek için yazın
e
.Ölçümler sekmesinde aşağıdaki sorguyu girin:
rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
Genel sekmesinde, bu panelin adını Tüm örnek uygulama podları olarak değiştirin.
Sayfanın üst kısmındaki genel bakış çubuğunda, süre aralığını Son 5 dakika veya Son 15 dakika olarak değiştirin.
Bu paneli kaydetmek için genel bakış çubuğundaki kaydet simgesini seçin.
Yukarıdaki panel, tüm varyantlardan başarı oranı ölçümlerini görselleştirir. Bunlar kararlı (dağıtımdan
sampleapp
), temel (dağıtımdansampleapp-baseline
) ve kanarya (dağıtımdansampleapp-canary
) içerir. Aşağıdaki yapılandırmayla başka bir panel ekleyerek yalnızca temel ve kanarya ölçümlerini görselleştirebilirsiniz:- Genel sekmesinde, Başlık için örnek uygulama temeli ve kanarya'yı seçin.
- Ölçümler sekmesinde aşağıdaki sorguyu kullanın:
rate(requests_total{pod=~"sampleapp-baseline-.*|sampleapp-canary-.*", custom_status="good"}[1m])
Not
Temel ve kanarya ölçümleri panelinde yalnızca belirli koşullar altında karşılaştırma için kullanılabilir ölçümler bulunur. Bu koşullar, Kanarya dağıtma aşamasının başarıyla tamamlandığı ve Kanarya yükseltme/reddetme aşamasının el ile müdahaleyi beklediği durumlardır.
İpucu
Kanarya dağıtma ve Kanaryayı yükseltme/reddetme aşamalarını görsel olarak gösteren Grafana panoları için ek açıklamalar ayarlayın. Bu, temeli kanaryayla karşılaştırmaya ne zaman başlayacağınızı ve sırasıyla kanaryanın yükseltilmesi veya reddedilmesinin ne zaman tamamlandığını bilmeniz için yararlıdır.
Temel ve kanarya karşılaştırması
Bu noktada, Kanarya dağıtma aşaması başarıyla tamamlanmıştır (yerine olan değişikliğine
success_rate
10
20
bağlı olarak). Yükseltme/reddetme kanarya aşaması el ile müdahale bekliyor. Artık Grafana panosundaki temel ve kanarya varyantlarının başarı oranını (tarafından belirlendiğicustom_status=good
gibi) karşılaştırabilirsiniz. Şunun gibi görünmelidir:Kanarya için başarı oranının daha yüksek olduğu gözlemini temel alarak, kanaryayı teşvik edin. El ile müdahale görevinde Sürdür'ü seçin.