Dela via


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

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

  1. I ditt Azure DevOps-projekt går du till Project settings>Pipelines Service connections (Pipelines>Service-anslutningar).
  2. Skapa en Docker Registry-tjänstanslutning med namnet azure-pipelines-canary-acr som är associerad med din Azure Container Registry-instans.
  3. Skapa en Azure Resource Manager-tjänstanslutning med arbetsbelastningsidentiteten azure-pipelines-canary-k8s för resursgruppen.

Lägg till byggsteget

  1. I ditt Azure DevOps-projekt går du till Pipelines>Skapa pipeline eller Ny pipeline.

  2. Välj GitHub för din kodplats och välj din förgrenade azure-pipelines-canary-k8s-lagringsplats .

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

  4. 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).

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

  1. I ditt Azure DevOps-projekt går du till Pipelines-miljöer> och väljer sedan Skapa miljö eller Ny miljö.
  2. På den första skärmen Ny miljö anger du akscanary under Namn, väljer Kubernetes under Resurs och väljer Nästa.
  3. 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.
  4. Välj Verifiera och skapa.

Lägg till kanariesteget

  1. Gå till Pipelines, välj den pipeline som du skapade och välj Redigera.

  2. 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
    
  3. Lägg till ytterligare en fas i slutet av YAML-filen för att distribuera kanarieversionen. Ersätt värdena my-resource-group och my-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/*'
    
  4. 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.

  1. Skapa en ny Kubernetes-miljö med namnet akspromote.
  2. Öppna den nya akspromote-miljön från listan över miljöer och välj Godkännanden på fliken Godkännanden och kontroller .
  3. På skärmen Godkännanden lägger du till ditt eget användarkonto under Godkännare.
  4. Expandera Avancerat och se till att Tillåt godkännare att godkänna sina egna körningar har valts.
  5. Välj Skapa.

Lägga till steg för att höja upp och avvisa i pipelinen

  1. Gå till Pipelines, välj den pipeline som du skapade och välj Redigera.

  2. 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'
        ```
    
    
  3. Lägg till följande RejectCanarysteg 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/*'
        ```
    
  4. 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.

  1. I app/app.py ändrar du success_rate = 50 till success_rate = 100. Den här ändringen utlöser pipelinen, skapar och push-överför avbildningen till containerregistret och utlöser DeployCanary även fasen.
  2. 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.

  1. I app/app.py ändrar du success_rate = 50 till success_rate = 100. Den här ändringen utlöser pipelinen, skapar och push-överför avbildningen till containerregistret och utlöser DeployCanary även fasen.
  2. Eftersom du har konfigurerat ett godkännande för akspromote miljön väntar versionen innan du kör den fasen.
  3. 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.