Öğ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

Ö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.
  • ./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.
  • ./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. 'a sampleapp gönderilen istek akışı, üç dağıtımın (kararlı, temel ve kanarya) altındaki podlara yönlendirilir.

Dekont

Bu kılavuzda kod izleme ve izleme için Prometheus kullanacaksınız. Azure Uygulaması Analizler 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

  1. Azure DevOps menüsünde Proje ayarları>İşlem Hatları>Hizmeti bağlantıları'na gidin.
  2. 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.
  3. 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.

Sürekli tümleştirmeyi ayarlama

  1. İşlem Hatları İşlem Hattı> Oluştur'a gidin ve deponuzu seçin.

  2. Yapılandır sekmesinde Başlatıcı işlem hattı'nı seçin.

  3. 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.ioilişkilendirilmişse, önceki yapılandırmaya example.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId)göre görüntü ile olur.

Bildirim dosyasını düzenle

manifests/deployment.yml dosyasında 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-k8sgö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.

  1. İşlem Hatları Ortamları>>Ortam oluştur'a gidin.

  2. Yeni bir ortam oluşturun.

    • Ad: akscanary
    • Kaynak: Kubernetes'i seçin.
  3. İ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.
  4. Doğrula ve Oluştur'u seçin.

  5. Pipelines’a gidin. Oluşturduğunuz işlem hattını seçin ve Düzenle'yi seçin.

  6. 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
    
  7. 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/*
    
  8. 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.

  1. İşlem Hatları Ortamları>>Yeni ortam'a gidin.

  2. Yeni ortamı yapılandırın.

    • Ad: akspromote
    • Kaynak: Kubernetes'i seçin.
  3. İ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.
  4. Doğrula ve Oluştur'u seçin.

  5. Ortam listesinden yeni akspromote ortamınızı seçin.

  6. Onaylar ve denetimler> Onaylar'i seçin. Ardından üç nokta simgesini (üç nokta) seçin.

  7. 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.
  8. Oluştur’u seçin.

  9. İşlem hatları'na gidin ve oluşturduğunuz işlem hattını seçin. Ardından Düzenle’yi seçin.

  10. Değişiklikleri yükseltmek için YAML dosyanızın sonuna başka bir aşama PromoteRejectCanaryekleyin.

    - 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)'
    
  11. Değişiklikleri geri almak için YAML dosyanızın sonuna başka bir aşama RejectCanaryekleyin.

    - 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/*'
    
  12. 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:

  1. app/app.py dosyasında olarak değiştirin.success_rate = 10success_rate = 5 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ı tetikler DeployCanary .
  2. Ortamda bir onay yapılandırdığınızdan akspromote , sürüm bu aşamayı çalıştırmadan önce bekler.
  3. Çalıştırmanın özetinde Gözden Geçir>Onayla'yı seçin. Bu, iş yüklerinin kararlı sürümünü (sampleappmanifests/deployment.yml içindeki 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:

app/app.py dosyasında olarak değiştirin.success_rate = 20success_rate = 10

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

  1. 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
    
  2. Tarayıcıda aşağıdaki URL'yi açın.

    http://localhost:3000/login
    
  3. Helm grafiği yüklemesi sırasında prometheus-operator değer geçersiz kılınmadığı sürece adminPassword kimlik bilgileriniz istendiğinde aşağıdaki değerleri kullanabilirsiniz:

    • kullanıcı adı: yönetici
    • parola: prom-operator
  4. Soldaki menüden Pano Grafı'nı> seçin.+>

  5. Yeni eklenen panelde herhangi bir yeri seçin ve paneli düzenlemek için yazın e .

  6. Ölçümler sekmesinde aşağıdaki sorguyu girin:

    rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
    
  7. Genel sekmesinde, bu panelin adını Tüm örnek uygulama podları olarak değiştirin.

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

  9. Bu paneli kaydetmek için genel bakış çubuğundaki kaydet simgesini seçin.

  10. Yukarıdaki panel, tüm varyantlardan başarı oranı ölçümlerini görselleştirir. Bunlar kararlı (dağıtımdan sampleapp ), temel (dağıtımdan sampleapp-baseline ) ve kanarya (dağıtımdan sampleapp-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])
    

    Dekont

    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.

    Bahşiş

    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ı

  1. Bu noktada, Kanarya dağıtma aşaması başarıyla tamamlanmıştır (yerine olan değişikliğine success_rate1020bağ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ği custom_status=goodgibi) karşılaştırabilirsiniz. Şunun gibi görünmelidir:

    Screenshot that shows a comparison of baseline and canary metrics.

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