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
- Ett Azure-konto med en aktiv prenumeration. Skapa ett konto utan kostnad.
- Ett GitHub-konto. Skapa ett kostnadsfritt GitHub-konto om du inte redan har ett.
- Ett Azure Container Registrymed push-behörigheter. Skapa ett Azure Container Registry om du inte redan har ett.
- Ett Kubernetes-kluster. Distribuera ett AKS-kluster (Azure Kubernetes Service).
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.
- 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
- ./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.
- deployment.yml – Innehåller specifikationen för distributionsarbetsbelastningen
- ./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 tillsampleapp
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
- Gå till Projektinställningar>Pipelines>Service-anslutningar i Azure DevOps-menyn.
- Skapa en Docker-registertjänstanslutning som är associerad med ditt containerregister. Ge den namnet azure-pipelines-canary-k8s.
- 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
Gå till Pipelines>Skapa pipeline och välj din lagringsplats.
På fliken Konfigurera väljer du Startpipeline.
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 tillexample.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.
Gå till Pipelines-miljöer>>Skapa miljö.
Skapa en ny miljö.
- Namn: akscanary
- Resurs: Välj Kubernetes.
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.
Välj Verifiera och skapa.
Gå till Pipelines. Välj den pipeline som du skapade och välj Redigera.
Ä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
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/*
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.
Gå till Pipelines-miljöer>>Ny miljö.
Konfigurera den nya miljön.
- Namn: akspromote
- Resurs: Välj Kubernetes.
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.
Välj Verifiera och skapa.
Välj din nya
akspromote
miljö i listan över miljöer.Välj Godkännanden och kontroller>Godkännanden. Välj sedan ellipsikonen (de tre punkterna).
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.
Välj Skapa.
Gå till Pipelines och välj den pipeline som du skapade. Välj sedan Redigera.
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)'
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/*'
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:
- I app/app.py ändrar du
success_rate = 5
tillsuccess_rate = 10
. Den här ändringen utlöser pipelinen, vilket leder till en version och push-överföring av avbildningen till containerregistret. Det utlöserDeployCanary
också fasen. - Eftersom du har konfigurerat ett godkännande för
akspromote
miljön väntar versionen innan du kör den fasen. - 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
Kör följande portvidarebefordringskommando på den lokala utvecklingsdatorn för att få åtkomst till Grafana.
kubectl port-forward svc/sampleapp-grafana 3000:80
Öppna följande URL i en webbläsare.
http://localhost:3000/login
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
Välj +>Instrumentpanelsdiagram> på menyn till vänster.
Välj var som helst på den nyligen tillagda panelen och skriv
e
för att redigera panelen.På fliken Mått anger du följande fråga:
rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
På fliken Allmänt ändrar du namnet på den här panelen till Alla exempelapppoddar.
I översiktsfältet överst på sidan ändrar du varaktighetsintervallet till Senaste 5 minuterna eller Senaste 15 minuterna.
Om du vill spara den här panelen väljer du ikonen Spara i översiktsfältet.
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 distributionensampleapp-baseline
) och kanarie (från distributionensampleapp-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
Nu har kanariefasen Distribuera slutförts (baserat på ändringen av
success_rate
från10
till20
). Kanariesteget Höj upp/avvisa väntar på manuella åtgärder. Nu kan du jämföra framgångsfrekvensen (enligt )custom_status=good
för baslinjen och kanarievarianterna på Grafana-instrumentpanelen. Det bör se ut ungefär så här: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.