Dela via


Självstudie: Använda en kanariedistributionsstrategi för Kubernetes-distributioner

Azure DevOps Services | Azure DevOps Server 2022

En kanariedistributionsstrategi innebär att distribuera nya versioner av ett program bredvid stabila produktionsversioner. Du kan sedan se hur kanarieversionen jämförs med baslinjen innan du befordrar eller avvisar distributionen.

Den här stegvisa guiden beskriver hur du använder Kubernetes-manifestuppgiftens kanariestrategi. Mer specifikt får du lära dig hur du konfigurerar kanariedistributioner för Kubernetes och det associerade arbetsflödet för att utvärdera kod. Sedan använder du koden för att jämföra baslinje- och kanarieappdistributioner, så att du kan bestämma om du vill höja upp eller avvisa kanariedistributionen.

Om du använder Azure Kubernetes Service är Azure Resource Manager-tjänstens anslutningstyp det bästa sättet att ansluta till ett privat kluster eller ett kluster som har inaktiverat lokala konton.

Förutsättningar

Exempelkod

Förgrena följande lagringsplats på GitHub.

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

Här är en kort översikt över filerna på lagringsplatsen som används under den här guiden:

  • ./app:
    • app.py – en enkel Flask-baserad webbserver som instrumenteras med hjälp av Prometheus-instrumentationsbiblioteket för Python-program. En anpassad räknare konfigureras för antalet bra och dåliga svar som ges ut, baserat på variabelns success_rate värde.
    • Dockerfile – används för att skapa avbildningen med varje ändring som görs i app.py. Vid varje ändring utlöses bygg-pipelinen och avbildningen skapas och skickas till containerregistret.
  • ./manifest:
    • deployment.yml – Innehåller specifikationen för distributionsarbetsbelastningen sampleapp som motsvarar den avbildning som publicerades tidigare. Du använder den här manifestfilen inte bara för den stabila versionen av distributionsobjektet, utan även för att härleda baslinje- och kanarievarianterna för arbetsbelastningarna.
    • service.yml – Skapar sampleapp tjänsten. Den här tjänsten dirigerar begäranden till poddarna som spunnits upp av de distributioner (stabil, baslinje och kanariefågel) som nämnts tidigare.
  • ./Misc
    • service-monitor.yml – Används för att konfigurera ett ServiceMonitor-objekt. Det här objektet konfigurerar Prometheus-måttskrapa.
    • fortio-deploy.yml – Används för att konfigurera en fortio-distribution. Den här distributionen används senare som ett belastningstestverktyg för att skicka en dataström med begäranden till tjänsten sampleapp som distribuerades tidigare. Dataströmmen med begäranden som skickas till sampleapp dirigeras till poddar under alla tre distributionerna (stabil, baslinje och kanariefågel).

Kommentar

I den här guiden använder du Prometheus för kodinstrumentation och övervakning. Alla motsvarande lösningar, till exempel Azure Application Insights, kan användas som ett alternativ.

Installera prometheus-operator

Om du vill installera Prometheus i klustret använder du följande kommando från utvecklingsdatorn. Du måste ha kubectl och Helm installerade, och du måste ange kontexten till det kluster som du vill distribuera mot. Grafana, som du använder senare för att visualisera baslinje- och kanariemått på instrumentpaneler, installeras som en del av det här Helm-diagrammet.

Först lägger du till Prometheus Community Kubernetes Helm Charts-lagringsplatsen i Helm-installationen. Sedan installerar du kube-prometheus-stacken, en samling Kubernetes-manifest, Grafana-instrumentpaneler och Prometheus-regler.

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

Skapa tjänstanslutningar

  1. Gå till Projektinställningar>Pipelines>Service-anslutningar i Azure DevOps-menyn.
  2. Skapa en Docker-registertjänstanslutning som är associerad med ditt containerregister. Ge den namnet azure-pipelines-canary-k8s.
  3. Skapa en Kubernetes-tjänstanslutning för kubernetes-klustret och namnområdet som du vill distribuera till. Ge den namnet azure-pipelines-canary-k8s.

Kommentar

Om du använder Azure Kubernetes Service är Azure Resource Manager-tjänstens anslutningstyp det bästa sättet att ansluta till ett privat kluster eller ett kluster som har inaktiverat lokala konton.

Konfigurera kontinuerlig integrering

  1. Gå till Pipelines>Skapa pipeline och välj din lagringsplats.

  2. På fliken Konfigurera väljer du Startpipeline.

  3. På fliken Granska ersätter du YAML-pipelinen med den här koden.

    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)
    

    Om Docker-registertjänstanslutningen som du skapade är associerad med example.azurecr.ioär avbildningen till example.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId), baserat på föregående konfiguration.

Redigera manifestfil

I manifest/deployment.yml ersätter du <example> med containerregistrets URL. Efter att bildfältet har ersatts bör det till exempel se ut ungefär som contosodemo.azurecr.io/azure-pipelines-canary-k8s.

Konfigurera kontinuerlig distribution

Följande avsnitt innehåller steg för att konfigurera kontinuerlig distribution, inklusive hur du distribuerar kanariefasen och hur du höjer upp eller avvisar kanariefågeln genom manuella åtgärder.

Distribuera kanariesteg

Du kan distribuera med YAML eller Klassisk.

  1. Gå till Pipelines-miljöer>>Skapa miljö.

  2. Skapa en ny miljö.

    • Namn: akscanary
    • Resurs: Välj Kubernetes.
  3. Välj Nästa och konfigurera Kubernetes-resursen på följande sätt:

    • Provider: Azure Kubernetes Service
    • Azure-prenumeration: Välj den prenumeration som innehåller ditt Kubernetes-kluster.
    • Kluster: Välj ditt kluster.
    • Namnområde: Skapa ett nytt namnområde med namnet canarydemo.
  4. Välj Verifiera och skapa.

  5. Gå till Pipelines. Välj den pipeline som du skapade och välj Redigera.

  6. Ändra det steg som du skapade tidigare för att nu använda en fas. Lägg till ytterligare två steg för att kopiera manifest och kataloger som artefakter för användning i efterföljande steg. Du kanske också vill flytta ett par värden till variabler för enklare användning senare i pipelinen. Din fullständiga YAML bör nu se ut så här.

    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. Lägg till en fas i slutet av YAML-filen för att distribuera kanarieversionen.

    - 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. Spara din pipeline genom att checka in direkt till huvudgrenen. Den här incheckningen bör redan köra pipelinen.

Manuella åtgärder för att främja eller avvisa kanariefågel

Du kan ingripa manuellt med YAML eller Klassisk.

  1. Gå till Pipelines-miljöer>>Ny miljö.

  2. Konfigurera den nya miljön.

    • Namn: akspromote
    • Resurs: Välj Kubernetes.
  3. Välj Nästa och konfigurera Kubernetes-resursen på följande sätt:

    • Provider: Azure Kubernetes Service
    • Azure-prenumeration: Välj den prenumeration som innehåller ditt Kubernetes-kluster.
    • Kluster: Välj ditt kluster.
    • Namnområde: Välj det namnområde, canarydemo, som du skapade tidigare.
  4. Välj Verifiera och skapa.

  5. Välj din nya akspromote miljö i listan över miljöer.

  6. Välj Godkännanden och kontroller>Godkännanden. Välj sedan ellipsikonen (de tre punkterna).

  7. Konfigurera ditt godkännande på följande sätt:

    • Godkännare: Lägg till ditt eget användarkonto.
    • Avancerat: Kontrollera att rutan Tillåt godkännare att godkänna sina egna körningar är markerad.
  8. Välj Skapa.

  9. Gå till Pipelines och välj den pipeline som du skapade. Välj sedan Redigera.

  10. Lägg till en annan fas, PromoteRejectCanary, i slutet av YAML-filen, för att höja upp ändringarna.

    - 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. Lägg till en annan fas, RejectCanary, i slutet av YAML-filen, för att återställa ändringarna.

    - 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. Spara YAML-pipelinen genom att välja Spara och sedan checka in den direkt till huvudgrenen.

Distribuera en stabil version

Du kan distribuera en stabil version med YAML eller Klassisk.

För den första körningen av pipelinen finns inte den stabila versionen av arbetsbelastningarna, och deras baslinje- eller kanarieversioner finns inte i klustret. Så här distribuerar du den stabila versionen:

  1. I app/app.py ändrar du success_rate = 5 till success_rate = 10. Den här ändringen utlöser pipelinen, vilket leder till en version och push-överföring av avbildningen till containerregistret. Det utlöser DeployCanary också fasen.
  2. Eftersom du har konfigurerat ett godkännande för akspromote miljön väntar versionen innan du kör den fasen.
  3. I sammanfattningen av körningen väljer du Granska>Godkänn. Detta distribuerar den stabila versionen av arbetsbelastningarna (distributionen sampleapp i manifest/deployment.yml) till namnområdet.

Initiera kanariearbetsflöde

Den stabila versionen av arbetsbelastningen sampleapp finns nu i klustret. Gör sedan följande ändring i simuleringsprogrammet:

I app/app.py ändrar du success_rate = 10 till success_rate = 20.

Den här ändringen utlöser bygg-pipelinen, vilket resulterar i att avbildningen byggs och skickas till containerregistret. Den här processen utlöser i sin tur versionspipelinen och påbörjar fasen Distribuera kanariefågel .

Simulera begäranden

På utvecklingsdatorn kör du följande kommandon och fortsätter att köra det för att skicka en konstant ström med begäranden till sampleapp tjänsten. sampleapp dirigerar begäranden till poddarna som spunnits av den stabila sampleapp distributionen och till poddarna som spunnits upp av sampleapp-baseline distributionerna och sampleapp-canary . Väljaren som anges för sampleapp gäller för alla dessa poddar.

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/

Konfigurera Grafana-instrumentpanelen

  1. Kör följande portvidarebefordringskommando på den lokala utvecklingsdatorn för att få åtkomst till Grafana.

    kubectl port-forward svc/sampleapp-grafana 3000:80
    
  2. Öppna följande URL i en webbläsare.

    http://localhost:3000/login
    
  3. Om du inte åsidosätter värdet under Helm-diagraminstallationen prometheus-operator kan du använda följande värden när du uppmanas att ange autentiseringsuppgifteradminPassword:

    • username: admin
    • lösenord: prom-operator
  4. Välj +>Instrumentpanelsdiagram> på menyn till vänster.

  5. Välj var som helst på den nyligen tillagda panelen och skriv e för att redigera panelen.

  6. På fliken Mått anger du följande fråga:

    rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
    
  7. På fliken Allmänt ändrar du namnet på den här panelen till Alla exempelapppoddar.

  8. I översiktsfältet överst på sidan ändrar du varaktighetsintervallet till Senaste 5 minuterna eller Senaste 15 minuterna.

  9. Om du vill spara den här panelen väljer du ikonen Spara i översiktsfältet.

  10. Föregående panel visualiserar mått för framgångsfrekvens från alla varianter. Dessa omfattar stabila (från distributionen sampleapp ), baslinje (från distributionen sampleapp-baseline ) och kanarie (från distributionen sampleapp-canary ). Du kan visualisera bara baslinje- och kanariemått genom att lägga till en annan panel med följande konfiguration:

    • På fliken Allmänt för Rubrik väljer du sampleappbaslinje och kanarielista.
    • På fliken Mått använder du följande fråga:
    rate(requests_total{pod=~"sampleapp-baseline-.*|sampleapp-canary-.*", custom_status="good"}[1m])
    

    Kommentar

    Panelen för baslinje- och kanariemått har endast mått tillgängliga för jämförelse under vissa förhållanden. Dessa villkor är när den distribuerade kanariefasen har slutförts och kanariesteget Höj upp/avvisa väntar på manuella åtgärder.

    Dricks

    Konfigurera anteckningar för Grafana-instrumentpaneler för att visuellt avbilda scensluthändelser för Distribuera kanarie- och upp- och avvisa-kanariefågel. Det här är användbart så att du vet när du ska börja jämföra baslinjen med kanariefågeln och när befordran eller avvisandet av kanariefågeln har slutförts.

Jämför baslinje och kanarie

  1. Nu har kanariefasen Distribuera slutförts (baserat på ändringen av success_rate från 10 till 20). Kanariesteget Höj upp/avvisa väntar på manuella åtgärder. Nu kan du jämföra framgångsfrekvensen (enligt ) custom_status=goodför baslinjen och kanarievarianterna på Grafana-instrumentpanelen. Det bör se ut ungefär så här:

    Skärmbild som visar en jämförelse av baslinje- och kanariemått.

  2. Baserat på observationen att framgångsgraden är högre för kanariefågeln, främja kanariefågeln. Välj Återuppta i den manuella åtgärdsaktiviteten.