Självstudie: Använda en kanariedistributionsstrategi för Kubernetes
Azure DevOps Services | Azure DevOps Server 2022
Den här stegvisa guiden beskriver hur du använder Kubernetes-manifestuppgiften canary
med strategin. En kanariedistributionsstrategi distribuerar nya versioner av ett program bredvid stabila produktionsversioner.
Du använder det associerade arbetsflödet för att distribuera koden och jämföra baslinje- och kanarieappdistributioner. Baserat på utvärderingen bestämmer du om du vill höja upp eller avvisa kanariedistributionen.
I den här självstudien används Docker Registry- och Azure Resource Manager-tjänstanslutningar för att ansluta till Azure-resurser. För ett privat Azure Kubernetes Service-kluster (AKS) eller ett kluster som har lokala konton inaktiverade är en Azure Resource Manager-tjänstanslutning ett bättre sätt att ansluta.
Förutsättningar
Ett Azure DevOps-projekt med minst användarbehörighet .
Ett Azure-konto. Skapa ett konto utan kostnad.
En Azure Container Registry-instans med push-behörigheter.
Ett AKS-kluster (Azure Kubernetes Service) distribuerat. Du kan koppla AKS-klustret till ditt Azure Container-registerkluster när du distribuerar AKS-klustret eller efteråt.
Ett GitHub-konto. Skapa ett kostnadsfritt GitHub-konto.
En förgrening av https://github.com/MicrosoftDocs/azure-pipelines-canary-k8s GitHub-lagringsplatsen.
Viktigt!
Under följande procedurer kan du uppmanas att skapa en GitHub-tjänstanslutning eller omdirigeras till GitHub för att logga in, installera Azure Pipelines eller auktorisera Azure Pipelines. Följ anvisningarna på skärmen för att slutföra processen. Mer information finns i Åtkomst till GitHub-lagringsplatser.
GitHub-lagringsplatsfiler
GitHub-lagringsplatsen innehåller följande filer:
Fil | beskrivning |
---|---|
./app/app.py | En enkel Flask-baserad webbserver . Filen konfigurerar en anpassad räknare för antalet bra och dåliga svar baserat på variabelns success_rate värde. |
./app/Dockerfile | Används för att skapa avbildningen med varje ändring i app.py. Varje ändring utlöser bygg-pipelinen för att skapa avbildningen och push-överföra den till containerregistret. |
./manifest/deployment.yml | Innehåller specifikationen för distributionsarbetsbelastningen sampleapp som motsvarar den publicerade avbildningen. Du använder den här manifestfilen för den stabila versionen av distributionsobjektet och för att härleda baslinje- och kanarievarianterna för arbetsbelastningarna. |
./manifest/service.yml | Skapar tjänsten sampleapp . Den här tjänsten dirigerar begäranden till poddarna som spunnits upp av stabila distributioner, baslinje- och kanariedistributioner. |
./misc/fortio.yml | Konfigurerar en fortio-distribution. Den här distributionen är ett belastningstestverktyg som skickar en dataström med begäranden till den distribuerade sampleapp tjänsten. Begärandeströmmen dirigerar till poddar under de tre distributionerna: stabil, baslinje och kanariefågel. |
Skapa tjänstanslutningar
- I ditt Azure DevOps-projekt går du till Project settings>Pipelines Service connections (Pipelines>Service-anslutningar).
- Skapa en Docker Registry-tjänstanslutning med namnet azure-pipelines-canary-acr som är associerad med din Azure Container Registry-instans.
- Skapa en Azure Resource Manager-tjänstanslutning med arbetsbelastningsidentiteten azure-pipelines-canary-k8s för resursgruppen.
Lägg till byggsteget
I ditt Azure DevOps-projekt går du till Pipelines>Skapa pipeline eller Ny pipeline.
Välj GitHub för din kodplats och välj din förgrenade azure-pipelines-canary-k8s-lagringsplats .
På fliken Konfigurera väljer du Startpipeline.
På fliken Granska ersätter du YAML-pipelinen med följande kod.
trigger: - main pool: vmImage: ubuntu-latest variables: imageName: azure-pipelines-canary-k8s # name of ACR image dockerRegistryServiceConnection: azure-pipelines-canary-acr # name of ACR service connection imageRepository: 'azure-pipelines-canary-k8s' # name of image repository containerRegistry: example.azurecr.io # name of Azure container registry 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)
Om Docker-registertjänstanslutningen som du skapade är associerad med ett containerregister med namnet
example.azurecr.io
är avbildningen inställd påexample.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId)
.Välj Spara och kör och se till att jobbet körs korrekt.
Redigera manifestfilen
I lagringsplatsens förgrening redigerar du manifest/deployment.yml för att ersätta <foobar>
med containerregistrets URL, till exempel example.azurecr.io/azure-pipelines-canary-k8s
.
Konfigurera kontinuerlig distribution
Nu konfigurerar du kontinuerlig distribution, distribuerar kanariefasen och höjer upp eller avvisar kanariefågeln genom manuellt godkännande.
Skapa en miljö
Du kan distribuera med YAML eller Klassisk.
- I ditt Azure DevOps-projekt går du till Pipelines-miljöer> och väljer sedan Skapa miljö eller Ny miljö.
- På den första skärmen Ny miljö anger du akscanary under Namn, väljer Kubernetes under Resurs och väljer Nästa.
- Fyll i Kubernetes-resursskärmen på följande sätt:
- Provider: Välj Azure Kubernetes Service.
- Azure-prenumeration: Välj din Azure-prenumeration.
- Kluster: Välj ditt AKS-kluster.
- Namnområde: Välj Ny och ange canarydemo.
- Välj Verifiera och skapa.
Lägg till kanariesteget
Gå till Pipelines, välj den pipeline som du skapade och välj Redigera.
Ersätt hela YAML-pipelinen med följande kod.
Den här koden ändrar det
Docker@2
steg som du körde tidigare för att använda en fas och lägger till ytterligare två steg för att kopiera manifesten och felkatalogerna som artefakter för efterföljande faser som ska användas.Koden flyttar även vissa värden till variabler för enklare användning senare i pipelinen. I variabeln
containerRegistry
ersätter du<example>
med namnet på ditt containerregister.trigger: - main pool: vmImage: ubuntu-latest variables: imageName: azure-pipelines-canary-k8s dockerRegistryServiceConnection: azure-pipelines-canary-acr imageRepository: 'azure-pipelines-canary-k8s' containerRegistry: <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 ytterligare en fas i slutet av YAML-filen för att distribuera kanarieversionen. Ersätt värdena
my-resource-group
ochmy-aks-cluster
med resursgruppen och Azure Kubernetes Service-klusternamnet.trigger: - main pool: vmImage: ubuntu-latest variables: imageName: azure-pipelines-canary-k8s dockerRegistryServiceConnection: azure-pipelines-canary-acr imageRepository: 'azure-pipelines-canary-k8s' containerRegistry: yourcontainerregistry.azurecr.io #update with container registry 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 - stage: DeployCanary displayName: Deploy canary dependsOn: Build condition: succeeded() jobs: - deployment: Deploycanary displayName: Deploy canary pool: vmImage: ubuntu-latest environment: 'akscanary' strategy: runOnce: deploy: steps: - task: KubernetesManifest@1 displayName: Create Docker Registry Secret inputs: action: 'createSecret' connectionType: 'azureResourceManager' azureSubscriptionConnection: 'azure-pipelines-canary-sc' azureResourceGroup: 'my-resource-group' kubernetesCluster: 'my-aks-cluster' secretType: 'dockerRegistry' secretName: 'my-acr-secret' dockerRegistryEndpoint: 'azure-pipelines-canary-acr' - task: KubernetesManifest@1 displayName: Deploy to Kubernetes cluster inputs: action: 'deploy' connectionType: 'azureResourceManager' azureSubscriptionConnection: 'azure-pipelines-canary-sc' azureResourceGroup: 'my-resource-group' kubernetesCluster: 'my-aks-cluster' strategy: 'canary' percentage: '25' manifests: | $(Pipeline.Workspace)/manifests/deployment.yml $(Pipeline.Workspace)/manifests/service.yml containers: '$(containerRegistry)/$(imageRepository):$(tag)' imagePullSecrets: 'my-acr-secret' - task: KubernetesManifest@1 displayName: Deploy Forbio to Kubernetes cluster inputs: action: 'deploy' connectionType: 'azureResourceManager' azureSubscriptionConnection: 'azure-pipelines-canary-sc' azureResourceGroup: 'my-resource-group' kubernetesCluster: 'my-aks-cluster' manifests: '$(Pipeline.Workspace)/misc/*'
Välj Verifiera och spara och spara pipelinen direkt till huvudgrenen.
Lägga till manuellt godkännande för att främja eller avvisa kanariedistribution
Du kan ingripa manuellt med YAML eller Klassisk.
- Skapa en ny Kubernetes-miljö med namnet akspromote.
- Öppna den nya akspromote-miljön från listan över miljöer och välj Godkännanden på fliken Godkännanden och kontroller .
- På skärmen Godkännanden lägger du till ditt eget användarkonto under Godkännare.
- Expandera Avancerat och se till att Tillåt godkännare att godkänna sina egna körningar har valts.
- Välj Skapa.
Lägga till steg för att höja upp och avvisa i pipelinen
Gå till Pipelines, välj den pipeline som du skapade och välj Redigera.
Lägg till följande
PromoteRejectCanary
steg i slutet av YAML-filen som höjer 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' strategy: runOnce: deploy: steps: - task: KubernetesManifest@1 displayName: Create Docker Registry Secret for akspromote inputs: action: 'createSecret' connectionType: 'azureResourceManager' azureSubscriptionConnection: 'azure-pipelines-canary-sc' azureResourceGroup: 'my-resource-group' kubernetesCluster: 'my-aks-cluster' secretType: 'dockerRegistry' secretName: 'my-acr-secret' dockerRegistryEndpoint: 'azure-pipelines-canary-acr' - task: KubernetesManifest@1 displayName: promote canary inputs: action: 'promote' connectionType: 'azureResourceManager' azureSubscriptionConnection: 'azure-pipelines-canary-sc' azureResourceGroup: 'my-resource-group' kubernetesCluster: 'my-aks-cluster' strategy: 'canary' manifests: '$(Pipeline.Workspace)/manifests/*' containers: '$(containerRegistry)/$(imageRepository):$(tag)' imagePullSecrets: 'my-acr-secret' ```
Lägg till följande
RejectCanary
steg i slutet av filen som återställer ändringarna.- stage: RejectCanary displayName: Reject canary dependsOn: PromoteRejectCanary condition: failed() jobs: - deployment: RejectCanary displayName: Reject Canary pool: vmImage: ubuntu-latest environment: 'akscanary' strategy: runOnce: deploy: steps: - task: KubernetesManifest@1 displayName: Create Docker Registry Secret for reject canary inputs: action: 'createSecret' connectionType: 'azureResourceManager' azureSubscriptionConnection: 'azure-pipelines-canary-sc' azureResourceGroup: 'kubernetes-testing' kubernetesCluster: 'my-aks-cluster' secretType: 'dockerRegistry' secretName: 'my-acr-secret' dockerRegistryEndpoint: 'azure-pipelines-canary-acr' - task: KubernetesManifest@1 displayName: Reject canary deployment inputs: action: 'reject' connectionType: 'azureResourceManager' azureSubscriptionConnection: 'azure-pipelines-canary-sc' azureResourceGroup: 'my-resource-group' kubernetesCluster: 'my-aks-cluster' namespace: 'default' strategy: 'canary' manifests: '$(Pipeline.Workspace)/manifests/*' ```
Välj Verifiera och spara och spara pipelinen direkt till huvudgrenen.
Distribuera en stabil version
För den första körningen av pipelinen finns inte den stabila versionen av arbetsbelastningarna och deras baslinje- eller kanarieversioner i klustret. Distribuera en stabil version av arbetsbelastningen enligt sampleapp
följande.
Du kan distribuera en stabil version med YAML eller Klassisk.
- I app/app.py ändrar du
success_rate = 50
tillsuccess_rate = 100
. Den här ändringen utlöser pipelinen, skapar och push-överför avbildningen till containerregistret och utlöserDeployCanary
även fasen. - Eftersom du har konfigurerat ett godkännande för
akspromote
miljön väntar versionen innan du kör den fasen. På sammanfattningssidan för byggkörning väljer du Granska och sedan Godkänn.
När den har godkänts distribuerar pipelinen den stabila versionen av arbetsbelastningen sampleapp
i manifest/deployment.yml till namnområdet.
Initiera kanariearbetsflödet och avvisa godkännandet
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 = 50
tillsuccess_rate = 100
. Den här ändringen utlöser pipelinen, skapar och push-överför avbildningen till containerregistret och utlöserDeployCanary
även fasen. - Eftersom du har konfigurerat ett godkännande för
akspromote
miljön väntar versionen innan du kör den fasen. - På sammanfattningssidan för byggkörning väljer du Granska och sedan Avvisa i den efterföljande dialogrutan. Detta avvisar distributionen.
När den har avvisats förhindrar pipelinen koddistributionen.
Rensa
Om du inte fortsätter att använda det här programmet tar du bort resursgruppen i Azure Portal och projektet i Azure DevOps.