Kurz: Použití kanárové strategie nasazení pro nasazení Kubernetes

Azure DevOps Services | Azure DevOps Server 2022

Kanárná strategie nasazení znamená nasazení nových verzí aplikace vedle stabilních produkčních verzí. Před povýšením nebo odmítnutím nasazení se pak můžete podívat, jak kanárová verze porovnává se směrným plánem.

Tento podrobný průvodce popisuje, jak používat kanárskou strategii úlohy manifestu Kubernetes. Konkrétně se dozvíte, jak nastavit kanárná nasazení pro Kubernetes a související pracovní postup pro vyhodnocení kódu. Tento kód pak použijete k porovnání standardních a kanárských nasazení aplikací, abyste se mohli rozhodnout, jestli chcete zvýšit úroveň nebo odmítnout kanárské nasazení.

Pokud používáte Službu Azure Kubernetes Service, je nejlepším způsobem připojení služby Azure Resource Manager k privátnímu clusteru nebo clusteru, který má zakázané místní účty.

Požadavky

Ukázkový kód

Fork následující úložiště na GitHubu

https://github.com/MicrosoftDocs/azure-pipelines-canary-k8s

Tady je stručný přehled souborů v úložišti, které se používají v tomto průvodci:

  • ./app:
    • app.py – jednoduchý webový server založený na Flasku, který je instrumentovaný pomocí knihovny instrumentace Prometheus pro aplikace Pythonu. Vlastní čítač je nastaven pro počet dobrých a špatných odpovědí zadaných na základě hodnoty success_rate proměnné.
    • Dockerfile – používá se k sestavení image s každou změnou provedenou v app.py. Při každé změně se kanál buildu aktivuje a image se sestaví a odešle do registru kontejneru.
  • ./manifests:
    • deployment.yml – obsahuje specifikaci sampleapp úlohy nasazení odpovídající dříve publikované imagi. Tento soubor manifestu použijete nejen pro stabilní verzi objektu nasazení, ale také pro odvození směrného plánu a kanárských variant úloh.
    • service.yml – vytvoří sampleapp službu. Tato služba směruje požadavky na pody aktivované nasazeními (stabilní, směrný plán a kanár) zmíněnými dříve.
  • ./Vedlejší
    • service-monitor.yml – slouží k nastavení objektu ServiceMonitor . Tento objekt nastaví výstřižky metrik Prometheus.
    • fortio-deploy.yml – používá se k nastavení nasazení fortio. Toto nasazení se později použije jako nástroj pro zátěžové testování k odeslání datového proudu požadavků do sampleapp služby nasazené dříve. Stream požadavků odeslaných do sampleapp podů se směruje ve všech třech nasazeních (stabilní, směrný plán a kanár).

Poznámka:

V této příručce použijete Prometheus pro instrumentaci a monitorování kódu. Jakékoli ekvivalentní řešení, jako je Aplikace Azure Přehledy, lze použít jako alternativu.

Instalace operátoru prometheus-operator

Pokud chcete do clusteru nainstalovat Prometheus, použijte následující příkaz z vývojového počítače. Musíte mít nainstalovaný kubectl a Helm a musíte nastavit kontext na cluster, pro který chcete nasadit. Grafana, kterou později použijete k vizualizaci standardních hodnot a kanárských metrik na řídicích panelech, se nainstaluje jako součást tohoto chartu Helm.

Nejprve do instalace Helmu přidáte úložiště Prometheus Community Kubernetes Helm Charts. Pak nainstalujete sadu kube-prometheus, kolekci manifestů Kubernetes, řídicích panelů Grafana a pravidel Prometheus.

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

Vytvoření připojení služeb

  1. V nabídce Azure DevOps přejděte na připojení služby Pipelines>Service v nastavení>projectu.
  2. Vytvořte připojení služby registru Dockeru přidružené k vašemu registru kontejneru. Pojmenujte ho azure-pipelines-canary-k8s.
  3. Vytvořte připojení služby Kubernetes pro cluster Kubernetes a obor názvů, do kterého chcete nasadit. Pojmenujte ho azure-pipelines-canary-k8s.

Poznámka:

Pokud používáte Službu Azure Kubernetes Service, je nejlepším způsobem připojení služby Azure Resource Manager k privátnímu clusteru nebo clusteru, který má zakázané místní účty.

Nastavení kontinuální integrace

  1. Přejděte do kanálu Create Pipelines> a vyberte úložiště.

  2. Na kartě Konfigurace zvolte Počáteční kanál.

  3. Na kartě Revize nahraďte YAML kanálu tímto kódem.

    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)
    

    Pokud je připojení služby registru Dockeru, ke které jste vytvořili, přidruženo example.azurecr.io, pak je image na example.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId)základě předchozí konfigurace.

Úprava souboru manifestu

V manifestech/deployment.yml nahraďte <example> adresou URL registru kontejneru. Například po nahrazení by pole obrázku mělo vypadat nějak takto contosodemo.azurecr.io/azure-pipelines-canary-k8s.

Nastavení průběžného nasazování

Následující části obsahují kroky pro nastavení průběžného nasazování, včetně postupu nasazení kanárské fáze a zvýšení úrovně kanáru nebo odmítnutí kanáru prostřednictvím ručního zásahu.

Fáze nasazení kanárů

Nasazení můžete provést pomocí YAML nebo Classic.

  1. Přejděte do prostředí>Pipelines>Create Environment.

  2. Vytvořte nové prostředí.

    • Název: akscanary
    • Prostředek: Zvolte Kubernetes.
  3. Vyberte Další a nakonfigurujte prostředek Kubernetes následujícím způsobem:

    • Poskytovatel: Azure Kubernetes Service
    • Předplatné Azure: Zvolte předplatné, které obsahuje váš cluster Kubernetes.
    • Cluster: Zvolte cluster.
    • Obor názvů: Vytvořte nový obor názvů s názvem canarydemo.
  4. Vyberte Ověřit a vytvořit.

  5. Přejděte na Pipelines (Kanály). Vyberte kanál, který jste vytvořili, a vyberte Upravit.

  6. Změňte krok, který jste vytvořili dříve, a teď použijte fázi. Přidejte dva další kroky pro zkopírování manifestů a chybných adresářů jako artefaktů pro použití v po sobě jdoucích fázích. Můžete také chtít přesunout několik hodnot do proměnných, abyste je mohli později v kanálu snadněji používat. Kompletní YAML by teď měl vypadat takto.

    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. Přidejte fázi na konec souboru YAML pro nasazení kanárové verze.

    - 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. Uložte kanál potvrzením přímo do hlavní větve. Toto potvrzení by již mělo úspěšně spustit váš kanál.

Ruční zásah pro podporu nebo odmítnutí kanárů

Pomocí YAML nebo Classic můžete intervenovat ručně.

  1. Přejděte do nového prostředí Pipelines>Environment.>

  2. Nakonfigurujte nové prostředí.

    • Název: akspromote
    • Prostředek: Zvolte Kubernetes.
  3. Vyberte Další a nakonfigurujte prostředek Kubernetes následujícím způsobem:

    • Poskytovatel: Azure Kubernetes Service
    • Předplatné Azure: Zvolte předplatné, které obsahuje váš cluster Kubernetes.
    • Cluster: Zvolte cluster.
    • Obor názvů: Zvolte obor názvů, canarydemo, který jste vytvořili dříve.
  4. Vyberte Ověřit a vytvořit.

  5. V seznamu prostředí vyberte nové akspromote prostředí.

  6. Vyberte Schválení a kontroly> Schválení. Pak vyberte ikonu tří teček (tři tečky).

  7. Schválení nakonfigurujte následujícím způsobem:

    • Schvalovatelé: Přidejte vlastní uživatelský účet.
    • Upřesnit: Ujistěte se, že je zaškrtnuté políčko Povolit schvalovatelům schvalovat vlastní spuštění .
  8. Vyberte Vytvořit.

  9. Přejděte na Kanály a vyberte kanál, který jste vytvořili. Pak vyberte Edit (Upravit).

  10. Přidejte další fázi, PromoteRejectCanaryna konci souboru YAML, aby se změny propagovaly.

    - 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. Přidejte další fázi, RejectCanaryna konci souboru YAML, aby se změny vrátily zpět.

    - 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. Kanál YAML uložte tak , že vyberete Uložit a pak ho potvrdíte přímo do hlavní větve.

Nasazení stabilní verze

Stabilní verzi můžete nasadit pomocí YAML nebo Classic.

Pro první spuštění kanálu stabilní verzi úloh a jejich směrné plány nebo kanárové verze v clusteru neexistují. Nasazení stabilní verze:

  1. V aplikaci/app.py přejděte success_rate = 5 na success_rate = 10. Tato změna aktivuje kanál, což vede k sestavení a nasdílení image do registru kontejneru. Aktivuje se také DeployCanary fáze.
  2. Vzhledem k tomu, že jste nakonfigurovali schválení v akspromote prostředí, bude verze čekat před spuštěním této fáze.
  3. V souhrnu spuštění vyberte Zkontrolovat>schválení. Tím se do oboru názvů nasadí stabilní verze úloh ( sampleapp nasazení v manifests/deployment.yml).

Inicializovat kanárný pracovní postup

Stabilní verze úlohy sampleapp teď v clusteru existuje. Dále proveďte následující změnu aplikace simulace:

V aplikaci/app.py přejděte success_rate = 10 na success_rate = 20.

Tato změna aktivuje kanál buildu, což vede k sestavení a nasdílení image do registru kontejneru. Tento proces zase aktivuje kanál verze a zahájí fázi nasazení.

Simulace požadavků

Na vývojovém počítači spusťte následující příkazy a udržujte ho spuštěný tak, aby odesílal konstantní datový proud požadavků ve službě sampleapp . sampleapp směruje požadavky na pody, které jsou vysunuty stabilním sampleapp nasazením, a do podů, které jsou roztěsněny a sampleapp-baselinesampleapp-canary nasazeními. Selektor zadaný pro sampleapp je použitelný pro všechny tyto pody.

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/

Nastavení řídicího panelu Grafana

  1. Spusťte na místním vývojovém počítači následující příkaz pro přesměrování portů, abyste měli přístup k Grafana.

    kubectl port-forward svc/sampleapp-grafana 3000:80
    
  2. V prohlížeči otevřete následující adresu URL.

    http://localhost:3000/login
    
  3. Pokud se při instalaci chartu Helm nezobrazí výzva k zadání přihlašovacích údajů, adminPasswordprometheus-operator můžete použít následující hodnoty:

    • uživatelské jméno: správce
    • password: prom-operator
  4. V nabídce vlevo zvolte +>Graf řídicího panelu>.

  5. Vyberte libovolné místo na nově přidaném panelu a zadejte e panel a upravte ho.

  6. Na kartě Metriky zadejte následující dotaz:

    rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
    
  7. Na kartě Obecné změňte název tohoto panelu na Všechny pody ukázkové aplikace.

  8. Na panelu přehledu v horní části stránky změňte rozsah trvání na Posledních 5 minut nebo Posledních 15 minut.

  9. Pokud chcete tento panel uložit, vyberte ikonu pro uložení na panelu přehledu.

  10. Předchozí panel vizualizuje metriky úspěšnosti ze všech variant. Patří mezi ně stabilní (z sampleapp nasazení), směrný plán (z sampleapp-baseline nasazení) a kanár (z sampleapp-canary nasazení). Pomocí následující konfigurace můžete vizualizovat pouze základní a kanárské metriky přidáním dalšího panelu:

    • Na kartě Obecné v části Název vyberte směrný plán ukázkové aplikace a kanár.
    • Na kartě Metriky použijte následující dotaz:
    rate(requests_total{pod=~"sampleapp-baseline-.*|sampleapp-canary-.*", custom_status="good"}[1m])
    

    Poznámka:

    Panel standardních a kanárských metrik bude mít k dispozici pouze metriky pro porovnání za určitých podmínek. Tyto podmínky jsou v případě úspěšného dokončení fáze nasazení canary a fáze povýšení/odmítnutí čeká na ruční zásah.

    Tip

    Nastavte poznámky pro řídicí panely Grafana tak, aby vizuálně znázorňovaly události dokončení fáze pro kanárku Deploy a Promote/reject kanár. To je užitečné, abyste věděli, kdy začít porovnávat směrný plán s kanárkou a kdy se povýšení nebo odmítnutí kanárky dokončilo.

Porovnání směrného plánu a kanáru

  1. V tuto chvíli se fáze nasazení úspěšně dokončila (na základě změny success_rate z 10 na 20). Fáze kanárů povýšení /odmítnutí čeká na ruční zásah. Teď můžete porovnat míru úspěšnosti (podle custom_status=goodurčení) směrného plánu a kanárkové varianty na řídicím panelu Grafana. Mělo by to vypadat nějak takto:

    Screenshot that shows a comparison of baseline and canary metrics.

  2. Na základě pozorování, že míra úspěšnosti je vyšší pro kanár, propagujte kanár. V úloze ručního zásahu vyberte Pokračovat .