Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
В этом пошаговом наставлении показано, как использовать задачу манифеста Kubernetes с использованием canary стратегии. Стратегия развертывания может развертывать новые версии приложения рядом с стабильными рабочими версиями.
Связанный рабочий процесс используется для развертывания кода и сравнения базовых и канаровых развертываний приложений. На основе оценки вы решите, следует ли продвигать или отклонять канаровое развертывание.
В этом руководстве используются подключения службы Docker и Службы Azure Resource Manager для подключения к ресурсам Azure. Для частного кластера Служба Azure Kubernetes (AKS) или кластера с отключенными локальными учетными записями подключение службы Azure Resource Manager лучше всего подходит для подключения.
Необходимые компоненты
Проект Azure DevOps с по крайней мере разрешениями пользователя .
Учетная запись Azure. Создайте учетную запись бесплатно .
Экземпляр Реестр контейнеров Azure с привилегиями отправки.
Развернутый кластер Служба Azure Kubernetes (AKS). Кластер AKS можно подключить к Azure Container Registry при развертывании кластера AKS или после этого.
Учетная запись GitHub. Создайте бесплатную учетную запись GitHub.
Вилку репозитория https://github.com/MicrosoftDocs/azure-pipelines-canary-k8s GitHub.
Внимание
В следующих процедурах может потребоваться создать подключение службы GitHub или перенаправить на GitHub для входа, установки Azure Pipelines или авторизации Azure Pipelines. Следуйте инструкциям на экране, чтобы завершить процесс. Дополнительные сведения см. в разделе Access к репозиториям GitHub.
Файлы репозитория 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 в рамках трех развертываний: стабильный, базовый и канарной. |
Создание подключений к службе
- В проекте Azure DevOps перейдите к параметрам проекта>подключениям службы.
- Нажмите кнопку "Новое подключение службы".
- Создайте подключение службы реестра Docker со следующими параметрами:
-
Имя подключения службы:
azure-pipelines-canary-acr - Реестр Docker: выбор экземпляра реестра контейнеров Azure
- Нажмите кнопку "Сохранить", чтобы создать подключение.
-
Имя подключения службы:
- Создайте второе подключение службы, снова нажав кнопку "Создать подключение службы ".
- Создайте подключение службы Azure Resource Manager со следующими параметрами:
-
Имя подключения службы:
azure-pipelines-canary-k8s(илиazure-pipelines-canary-scкак используется в конвейере YAML) - Уровень области: выбор подписки
- Подписка Azure. Выбор подписки Azure
- Группа ресурсов: выбор группы ресурсов
- Нажмите кнопку "Сохранить", чтобы создать подключение.
-
Имя подключения службы:
Добавление этапа сборки
В проекте Azure DevOps перейдите в раздел >"Создание конвейера" или "Создать конвейер".
Выберите GitHub для своего расположения кода и выберите вилку репозитория azure-pipelines-canary-k8s .
На вкладке "Настройка" выберите конвейер Starter.
На вкладке "Рецензирование" замените YAML конвейера следующим кодом.
trigger: - main pool: vmImage: ubuntu-latest variables: imageName: azure-pipelines-canary-k8s # Docker image name dockerRegistryServiceConnection: azure-pipelines-canary-acr # Service connection to ACR imageRepository: 'azure-pipelines-canary-k8s' # Image repository name containerRegistry: example.azurecr.io # Full container registry URL tag: '$(Build.BuildId)' # Tag image with the build ID for versioning stages: - stage: Build displayName: Build stage jobs: - job: Build displayName: Build pool: vmImage: ubuntu-latest steps: # Build and push Docker image to Azure Container Registry - 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).Выберите "Сохранить и запустить " и убедитесь, что задание выполняется успешно.
Изменение файла манифеста
В вилке репозитория измените манифесты/deployment.yml , чтобы заменить <foobar> URL-адрес реестра контейнеров, например example.azurecr.io/azure-pipelines-canary-k8s.
Настройка непрерывного развертывания
Теперь настройте непрерывное развертывание, разверните канаречную стадию и отклоните канарию с помощью ручного утверждения.
Создать среду
Вы можете развернуть с помощью YAML или классической версии.
- В проекте Azure DevOps перейдите в Pipelines>Environments.
- Выберите "Создать среду " (или кнопку "Создать среду ").
- На экране "Создание среды" в поле "Имя" введите
akscanary. - В разделе "Ресурс" выберите Kubernetes из раскрывающегося списка.
- Нажмите кнопку "Далее ", чтобы перейти к конфигурации ресурсов Kubernetes.
- На экране конфигурации ресурсов Kubernetes введите следующие сведения:
- Поставщик. Выберите службу Azure Kubernetes из раскрывающегося списка.
- Подписка Azure. Выберите подписку Azure.
- Кластер. Выберите кластер службы Azure Kubernetes.
- Пространство имен: выберите "Создать " и введите canarydemo.
- Выберите Проверить и создать.
Добавление канарной стадии
Перейдите к конвейерам, выберите созданный конвейер и нажмите кнопку "Изменить".
Замените весь 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 # Replace <example> with your registry name tag: '$(Build.BuildId)' # Tag image with unique build ID stages: # Stage 1: Build the Docker image and publish manifests - stage: Build displayName: Build stage jobs: - job: Build displayName: Build pool: vmImage: ubuntu-latest steps: # Build and push Docker image to Azure Container Registry - task: Docker@2 displayName: Build and push image inputs: containerRegistry: $(dockerRegistryServiceConnection) repository: $(imageName) command: buildAndPush Dockerfile: app/Dockerfile tags: | $(tag) # Publish Kubernetes manifests as artifacts for later stages to use - publish: manifests artifact: manifests # Publish load testing tool (Fortio) configuration as artifacts - publish: misc artifact: miscДобавьте еще один этап в конце ФАЙЛА 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 your container registry tag: '$(Build.BuildId)' stages: # Stage 1: Build the Docker image - stage: Build displayName: Build stage jobs: - job: Build displayName: Build pool: vmImage: ubuntu-latest steps: # Build and push Docker image to Azure Container Registry - task: Docker@2 displayName: Build and push image inputs: containerRegistry: $(dockerRegistryServiceConnection) repository: $(imageName) command: buildAndPush Dockerfile: app/Dockerfile tags: | $(tag) # Publish manifests for deployment stages - publish: manifests artifact: manifests # Publish Fortio load testing configuration - publish: misc artifact: misc # Stage 2: Deploy canary version alongside stable version - stage: DeployCanary displayName: Deploy canary dependsOn: Build # Wait for Build stage to complete condition: succeeded() # Only run if Build stage succeeded jobs: - deployment: Deploycanary displayName: Deploy canary pool: vmImage: ubuntu-latest environment: 'akscanary' strategy: runOnce: # Execute deployment strategy once deploy: steps: - task: KubernetesManifest@1 displayName: Create Docker Registry Secret inputs: action: 'createSecret' connectionType: 'azureResourceManager' azureSubscriptionConnection: 'azure-pipelines-canary-sc' # Service connection to Azure azureResourceGroup: 'my-resource-group' # Replace with your resource group kubernetesCluster: 'my-aks-cluster' # Replace with your AKS cluster name secretType: 'dockerRegistry' secretName: 'my-acr-secret' dockerRegistryEndpoint: 'azure-pipelines-canary-acr' # Deploy canary version (25% of traffic) alongside stable deployment - 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' # Use canary deployment strategy percentage: '25' # Deploy to 25% of pods initially manifests: | $(Pipeline.Workspace)/manifests/deployment.yml $(Pipeline.Workspace)/manifests/service.yml containers: '$(containerRegistry)/$(imageRepository):$(tag)' imagePullSecrets: 'my-acr-secret' # Deploy Fortio load testing tool to generate traffic for evaluation - task: KubernetesManifest@1 displayName: Deploy Fortio 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/*' # Fortio configurationВыберите "Проверить и сохранить" и сохраните конвейер непосредственно в главной ветви.
Добавление утверждения вручную для продвижения или отклонения канарного развертывания
Вы можете вмешаться вручную с YAML или классической версией.
- Создайте новую среду Kubernetes с именем akspromote.
- Откройте новую среду akspromote из списка сред и выберите "Утверждения" на вкладке "Утверждения и проверки".
- На странице Согласования добавьте собственную учетную запись пользователя в разделе Согласующие.
- Разверните узел "Дополнительно" и убедитесь, что утверждающие могут утвердить собственные запуски .
- Нажмите кнопку создания.
Добавление этапов повышения и отклонения конвейера
Перейдите к конвейерам, выберите созданный конвейер и нажмите кнопку "Изменить".
Добавьте следующий
PromoteRejectCanaryэтап в конце файла YAML, который способствует изменениям.# Stage 3: Promote canary deployment to full production (manual approval required) - stage: PromoteRejectCanary displayName: Promote or Reject canary dependsOn: DeployCanary # Wait for canary deployment to complete condition: succeeded() # Only run if canary deployment succeeded jobs: - deployment: PromoteCanary displayName: Promote Canary pool: vmImage: ubuntu-latest environment: 'akspromote' # Use akspromote environment with approval gate strategy: runOnce: # Execute once per deployment deploy: steps: # Create Docker registry secret for the promotion environment - 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' # Promote canary deployment to 100% of traffic (full production rollout) - task: KubernetesManifest@1 displayName: promote canary inputs: action: 'promote' # Transition from canary to stable 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' ```Добавьте следующий
RejectCanaryэтап в конце файла, который откатывает изменения.# Stage 4: Reject canary deployment and rollback to stable version - stage: RejectCanary displayName: Reject canary dependsOn: PromoteRejectCanary condition: failed() # Run this stage if the promotion stage fails or is rejected jobs: - deployment: RejectCanary displayName: Reject Canary pool: vmImage: ubuntu-latest environment: 'akscanary' strategy: runOnce: # Execute once per deployment deploy: steps: # Create Docker registry secret for the rejection environment - 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' # Reject canary deployment and rollback to the stable version - task: KubernetesManifest@1 displayName: Reject canary deployment inputs: action: 'reject' # Rollback canary changes connectionType: 'azureResourceManager' azureSubscriptionConnection: 'azure-pipelines-canary-sc' azureResourceGroup: 'my-resource-group' kubernetesCluster: 'my-aks-cluster' namespace: 'default' strategy: 'canary' manifests: '$(Pipeline.Workspace)/manifests/*' ```Выберите "Проверить и сохранить" и сохраните конвейер непосредственно в главной ветви.
Развертывание стабильной версии
Для первого запуска конвейера стабильная версия рабочих нагрузок и их базовых или канарной версий не существует в кластере. Разверните стабильную версию рабочей нагрузки sampleapp следующим образом.
Вы можете развернуть стабильную версию с помощью YAML или классической версии.
- В приложении/app.py перейдите
success_rate = 50наsuccess_rate = 100. Это изменение активирует конвейер, сборку и отправку образа в реестр контейнеров, а также активируетDeployCanaryэтап. - Так как вы настроили утверждение в
akspromoteсреде, выпуск ожидается перед выполнением этого этапа. На странице сводки запуска сборки выберите "Проверка " и нажмите кнопку "Утвердить".
После утверждения конвейер развертывает стабильную версию sampleapp рабочей нагрузки в манифестах или deployment.yml в пространстве имен.
Инициирование канарского рабочего процесса и отклонение утверждения
Стабильная версия рабочей нагрузки sampleapp теперь существует в кластере. Затем внесите следующее изменение в приложение моделирования.
- В приложении/app.py перейдите
success_rate = 50наsuccess_rate = 100. Это изменение активирует конвейер, сборку и отправку образа в реестр контейнеров, а также активируетDeployCanaryэтап. - Так как вы настроили утверждение в
akspromoteсреде, выпуск ожидается перед выполнением этого этапа. - На странице сводки запуска сборки выберите "Рецензирование ", а затем нажмите кнопку "Отклонить " в следующем диалоговом окне. Это действие отклоняет развертывание.
После отклонения конвейер предотвращает развертывание кода.
Очистка
Если вы не собираетесь продолжать использовать это приложение, удалите группу ресурсов на портале Azure и проект в Azure DevOps.