Поделиться через


Руководство. Использование стратегии развертывания канарной версии для Kubernetes

Azure DevOps Services | Azure DevOps Server 2022

В этом пошаговом руководстве описывается, как использовать задачу манифеста Kubernetes с canary стратегией. Стратегия развертывания может развертывать новые версии приложения рядом с стабильными рабочими версиями.

Связанный рабочий процесс используется для развертывания кода и сравнения базовых и канаровых развертываний приложений. На основе оценки вы решите, следует ли продвигать или отклонять канаровое развертывание.

В этом руководстве используются подключения службы Docker и Службы Azure Resource Manager для подключения к ресурсам Azure. Для частного кластера Служба Azure Kubernetes (AKS) или кластера с отключенными локальными учетными записями подключение службы Azure Resource Manager лучше всего подходит для подключения.

Необходимые компоненты

Файлы репозитория GitHub

Репозиторий GitHub содержит следующие файлы:

Файл Description
./app/app.py Простой веб-сервер на основе Flask. Файл настраивает счетчик для количества хороших и плохих ответов на основе значения переменной success_rate .
./app/Dockerfile Используется для создания образа с каждым изменением app.py. Каждое изменение активирует конвейер сборки для создания образа и отправки его в реестр контейнеров.
./manifests/deployment.yml Содержит спецификацию рабочей нагрузки sampleapp развертывания, соответствующей опубликованному образу. Этот файл манифеста используется для стабильной версии объекта развертывания и для получения базовых и канамерных вариантов рабочих нагрузок.
./manifests/service.yml sampleapp Создает службу. Эта служба направляет запросы к модулям pod, созданным на основе стабильных, базовых и канаарных развертываний.
./misc/fortio.yml Настраивает развертывание fortio. Это средство нагрузочного тестирования, которое отправляет поток запросов в развернутую sampleapp службу. Поток запросов направляется в модули pod в рамках трех развертываний: стабильный, базовый и канарной.

Создание подключений к службе

  1. В проекте Azure DevOps перейдите к подключениям к службам конвейеров>проектов>.
  2. Создайте подключение службы реестра Docker с именем azure-pipelines-canary-acr, связанное с вашим экземпляром Реестр контейнеров Azure.
  3. Создайте подключение службы Azure Resource Manager с удостоверением рабочей нагрузки с именем azure-pipelines-canary-k8s для группы ресурсов.

Добавление этапа сборки

  1. В проекте Azure DevOps перейдите в раздел >"Создание конвейера" или "Создать конвейер".

  2. Выберите GitHub для своего расположения кода и выберите вилку репозитория azure-pipelines-canary-k8s .

  3. На вкладке "Настройка" выберите конвейер Starter.

  4. На вкладке "Рецензирование" замените YAML конвейера следующим кодом.

    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)
    

    Если созданное соединение службы реестра Docker связано с именем example.azurecr.ioреестра контейнеров, то для образа задано значение example.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId).

  5. Выберите "Сохранить и запустить " и убедитесь, что задание выполняется успешно.

Изменение файла манифеста

В вилке репозитория измените манифесты/deployment.yml , чтобы заменить <foobar> URL-адрес реестра контейнеров, например example.azurecr.io/azure-pipelines-canary-k8s.

Настройка непрерывного развертывания

Теперь настройте непрерывное развертывание, разверните канаречную стадию и отклоните канарию с помощью ручного утверждения.

Создать среду

Вы можете развернуть с помощью YAML или классической версии.

  1. В проекте Azure DevOps перейдите в "Среды конвейеров>" и выберите "Создать среду" или "Создать среду".
  2. На первом экране "Создать среду " введите akscanary в разделе "Имя", выберите Kubernetes в разделе "Ресурс" и нажмите кнопку "Далее".
  3. Заполните экран ресурсов Kubernetes следующим образом:
    • Поставщик: выберите Служба Azure Kubernetes.
    • Подписка Azure. Выберите подписку Azure.
    • Кластер: выберите кластер AKS.
    • Пространство имен: выберите "Создать " и введите canarydemo.
  4. Выберите Проверить и создать.

Добавление канарной стадии

  1. Перейдите к конвейерам, выберите созданный конвейер и нажмите кнопку "Изменить".

  2. Замените весь yamL конвейера следующим кодом.

    Этот код изменяет шаг, Docker@2 который вы выполнили ранее, чтобы использовать этап, и добавляет еще два шага для копирования манифестов и неправильных каталогов в качестве артефактов для последовательных этапов использования.

    Код также перемещает некоторые значения в переменные для упрощения использования позже в конвейере. В переменной замените containerRegistry <example> имя реестра контейнеров.

    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. Добавьте еще один этап в конце ФАЙЛА YAML для развертывания канарной версии. Замените значения my-resource-group и my-aks-cluster группу ресурсов и Служба Azure Kubernetes имя кластера.

    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. Выберите "Проверить и сохранить" и сохраните конвейер непосредственно в главной ветви.

Добавление утверждения вручную для продвижения или отклонения канарного развертывания

Вы можете вмешаться вручную с YAML или классической версией.

  1. Создайте новую среду Kubernetes с именем akspromote.
  2. Откройте новую среду akspromote из списка сред и выберите "Утверждения" на вкладке "Утверждения и проверки".
  3. На экране "Утверждения" добавьте собственную учетную запись пользователя в разделе "Утверждающие".
  4. Разверните узел "Дополнительно" и убедитесь, что утверждающие могут утвердить собственные запуски .
  5. Нажмите кнопку создания.

Добавление этапов повышения и отклонения конвейера

  1. Перейдите к конвейерам, выберите созданный конвейер и нажмите кнопку "Изменить".

  2. Добавьте следующий PromoteRejectCanary этап в конце файла YAML, который способствует изменениям.

    - 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. Добавьте следующий RejectCanaryэтап в конце файла, который откатывает изменения.

    - 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. Выберите "Проверить и сохранить" и сохраните конвейер непосредственно в главной ветви.

Развертывание стабильной версии

Для первого запуска конвейера стабильная версия рабочих нагрузок и их базовые или канарские версии не существуют в кластере. Разверните стабильную версию рабочей нагрузки sampleapp следующим образом.

Вы можете развернуть стабильную версию с помощью YAML или классической версии.

  1. В приложении/app.py перейдите success_rate = 50 на success_rate = 100. Это изменение активирует конвейер, сборку и отправку образа в реестр контейнеров, а также активирует DeployCanary этап.
  2. Так как вы настроили утверждение в akspromote среде, выпуск ожидается перед выполнением этого этапа. На странице сводки запуска сборки выберите "Проверка " и нажмите кнопку "Утвердить".

После утверждения конвейер развертывает стабильную версию sampleapp рабочей нагрузки в манифестах или deployment.yml в пространстве имен.

Инициирование канарского рабочего процесса и отклонение утверждения

Стабильная версия рабочей нагрузки sampleapp теперь существует в кластере. Затем внесите следующее изменение в приложение моделирования.

  1. В приложении/app.py перейдите success_rate = 50 на success_rate = 100. Это изменение активирует конвейер, сборку и отправку образа в реестр контейнеров, а также активирует DeployCanary этап.
  2. Так как вы настроили утверждение в akspromote среде, выпуск ожидается перед выполнением этого этапа.
  3. На странице сводки запуска сборки выберите "Рецензирование ", а затем нажмите кнопку "Отклонить " в следующем диалоговом окне. Это отклоняет развертывание.

После отклонения конвейер предотвращает развертывание кода.

Очистка

Если вы не собираетесь продолжать использовать это приложение, удалите группу ресурсов в портал Azure и проект в Azure DevOps.