Sdílet prostřednictvím


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

Azure DevOps Services | Azure DevOps Server 2022

Tento podrobný průvodce popisuje, jak používat úlohu manifestu canary Kubernetes se strategií. Kanárná strategie nasazení nasadí nové verze aplikace vedle stabilních produkčních verzí.

Přidružený pracovní postup použijete k nasazení kódu a porovnání standardních hodnot a nasazení kanárských aplikací. Na základě vyhodnocení se rozhodnete, jestli chcete zvýšit úroveň nebo odmítnout nasazení kanárů.

Tento kurz používá připojení ke službám Docker Registry a Azure Resource Manageru k připojení k prostředkům Azure. Pro privátní cluster Azure Kubernetes Service (AKS) nebo cluster, který má zakázané místní účty, je lepší způsob připojení služby Azure Resource Manager.

Požadavky

Soubory úložiště GitHub

Úložiště GitHub obsahuje následující soubory:

Soubor Popis
./app/app.py Jednoduchý webový server založený na Flasku . Soubor nastaví vlastní čítač pro počet dobrých a špatných odpovědí na základě hodnoty success_rate proměnné.
./app/Dockerfile Používá se k vytvoření image s každou změnou app.py. Každá změna aktivuje kanál buildu pro sestavení image a nasdílí ji do registru kontejneru.
./manifests/deployment.yml Obsahuje specifikaci sampleapp úlohy nasazení odpovídající publikované imagi. Tento soubor manifestu použijete pro stabilní verzi objektu nasazení a pro odvození směrného plánu a kanárských variant úloh.
./manifests/service.yml sampleapp Vytvoří službu. Tato služba směruje požadavky na pody, které se roztáhnou stabilním, směrným plánem a kanárnými nasazeními.
./misc/fortio.yml Nastaví nasazení fortio. Toto nasazení je nástroj pro zátěžové testování, který odesílá stream požadavků do nasazené sampleapp služby. Stream požadavků směruje pody ve třech nasazeních: stabilní, směrný plán a kanár.

Vytvoření připojení služeb

  1. V projektu Azure DevOps přejděte na připojení Pipelines>Service nastavení> projektu.
  2. Vytvořte připojení služby Docker Registry s názvem azure-pipelines-canary-acr , které je přidružené k vaší instanci služby Azure Container Registry.
  3. Vytvořte připojení služby Azure Resource Manageru s identitou úlohy s názvem azure-pipelines-canary-k8s pro vaši skupinu prostředků.

Přidání fáze sestavení

  1. V projektu Azure DevOps přejděte na Kanály>vytvořit kanál nebo nový kanál.

  2. Jako umístění kódu vyberte GitHub a vyberte úložiště forked azure-pipelines-canary-k8s .

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

  4. Na kartě Revize nahraďte YAML kanálu následujícím kódem.

    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)
    

    Pokud je připojení služby registru Dockeru, které jste vytvořili, přidruženo k registru kontejneru s názvem example.azurecr.io, pak je image nastavena na example.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId).

  5. Vyberte Uložit a spusťte a ujistěte se, že se úloha úspěšně spustí.

Úprava souboru manifestu

Ve forku úložiště upravte manifesty/deployment.yml tak, aby se nahradily <foobar> adresou URL registru kontejneru, například example.azurecr.io/azure-pipelines-canary-k8s.

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

Teď nastavte průběžné nasazování, nasaďte kanárku a propagujte nebo odmítněte kanáru prostřednictvím ručního schválení.

Vytvořit prostředí

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

  1. V projektu Azure DevOps přejděte do prostředí Pipelines>a pak vyberte Vytvořit prostředí nebo Nové prostředí.
  2. Na první obrazovce Nové prostředí zadejte akscanary v části Název, vyberte Kubernetes v části Prostředek a vyberte Další.
  3. Vyplňte obrazovku prostředku Kubernetes následujícím způsobem:
    • Poskytovatel: Vyberte službu Azure Kubernetes Service.
    • Předplatné Azure: Vyberte své předplatné Azure.
    • Cluster: Vyberte cluster AKS.
    • Obor názvů: Vyberte Nový a zadejte canarydemo.
  4. Vyberte Ověřit a vytvořit.

Přidání kanárové fáze

  1. Přejděte na Kanály, vyberte kanál, který jste vytvořili, a vyberte Upravit.

  2. Nahraďte celý kanál YAML následujícím kódem.

    Tento kód změní Docker@2 krok, který jste spustili dříve, aby se použila fáze, a přidá dva další kroky ke zkopírování manifestů a chybných adresářů jako artefaktů pro po sobě jdoucí fáze, které se mají použít.

    Kód také přesune některé hodnoty do proměnných pro snadnější použití později v kanálu. containerRegistry V proměnné nahraďte <example> názvem vašeho registru kontejneru.

    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. Na konec souboru YAML přidejte další fázi pro nasazení kanárové verze. Nahraďte hodnoty my-resource-group a my-aks-cluster skupinou prostředků a názvem clusteru Azure Kubernetes Service.

    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. Vyberte Ověřit a uložit a uložte kanál přímo do hlavní větve.

Přidání ručního schválení pro zvýšení nebo odmítnutí kanárského nasazení

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

  1. Vytvořte nové prostředí Kubernetes označované jako akspromote.
  2. Otevřete nové prostředí akspromote ze seznamu prostředí a na kartě Schválení a kontroly vyberte Schválení.
  3. Na obrazovce Schválení přidejte do části Schvalovatelé vlastní uživatelský účet.
  4. Rozbalte položku Upřesnit a ujistěte se, že je vybraná možnost Povolit schvalovatelům schvalovat vlastní spuštění .
  5. Vyberte Vytvořit.

Přidání fází zvýšení úrovně a zamítnutí do kanálu

  1. Přejděte na Kanály, vyberte kanál, který jste vytvořili, a vyberte Upravit.

  2. Na konec souboru YAML přidejte následující PromoteRejectCanary fázi, která podporuje změny.

    - 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. Na konec souboru přidejte následující RejectCanaryfázi, která vrátí změny zpět.

    - 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. Vyberte Ověřit a uložit a uložte kanál přímo do hlavní větve.

Nasazení stabilní verze

Pro první spuštění kanálu neexistují stabilní verze úloh a jejich standardní nebo kanárové verze v clusteru. Následujícím způsobem nasaďte stabilní verzi sampleapp úlohy.

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

  1. V aplikaci/app.py přejděte success_rate = 50 na success_rate = 100. Tato změna aktivuje kanál, sestaví a nasdílí image do registru kontejneru a aktivuje také DeployCanary fázi.
  2. Vzhledem k tomu, že jste nakonfigurovali schválení v akspromote prostředí, čeká verze před spuštěním této fáze. Na stránce souhrnu spuštění sestavení vyberte Zkontrolovat a pak vyberte Schválit.

Po schválení kanál nasadí stabilní verzi sampleapp úlohy v manifestech/deployment.yml do oboru názvů.

Zahájení pracovního postupu kanárů a odmítnutí schválení

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

  1. V aplikaci/app.py přejděte success_rate = 50 na success_rate = 100. Tato změna aktivuje kanál, sestaví a nasdílí image do registru kontejneru a aktivuje také DeployCanary fázi.
  2. Vzhledem k tomu, že jste nakonfigurovali schválení v akspromote prostředí, čeká verze před spuštěním této fáze.
  3. Na stránce souhrnu spuštění sestavení vyberte Zkontrolovat a v následujícím dialogovém okně vyberte Odmítnout . Tím se nasazení odmítne.

Po zamítnutí kanál zabrání nasazení kódu.

Vyčištění

Pokud tuto aplikaci nebudete dál používat, odstraňte skupinu prostředků na webu Azure Portal a projekt v Azure DevOps.