Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Azure DevOps Services | 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 при развертывании кластера 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, связанное с вашим экземпляром Реестр контейнеров Azure.
- Создайте подключение службы Azure Resource Manager с удостоверением рабочей нагрузки с именем azure-pipelines-canary-k8s для группы ресурсов.
Добавление этапа сборки
В проекте Azure DevOps перейдите в раздел >"Создание конвейера" или "Создать конвейер".
Выберите GitHub для своего расположения кода и выберите вилку репозитория azure-pipelines-canary-k8s .
На вкладке "Настройка" выберите конвейер Starter.
На вкладке "Рецензирование" замените 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)
.Выберите "Сохранить и запустить " и убедитесь, что задание выполняется успешно.
Изменение файла манифеста
В вилке репозитория измените манифесты/deployment.yml , чтобы заменить <foobar>
URL-адрес реестра контейнеров, например example.azurecr.io/azure-pipelines-canary-k8s
.
Настройка непрерывного развертывания
Теперь настройте непрерывное развертывание, разверните канаречную стадию и отклоните канарию с помощью ручного утверждения.
Создать среду
Вы можете развернуть с помощью YAML или классической версии.
- В проекте Azure DevOps перейдите в "Среды конвейеров>" и выберите "Создать среду" или "Создать среду".
- На первом экране "Создать среду " введите akscanary в разделе "Имя", выберите Kubernetes в разделе "Ресурс" и нажмите кнопку "Далее".
- Заполните экран ресурсов Kubernetes следующим образом:
- Поставщик: выберите Служба Azure Kubernetes.
- Подписка Azure. Выберите подписку Azure.
- Кластер: выберите кластер AKS.
- Пространство имен: выберите "Создать " и введите 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 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
Добавьте еще один этап в конце ФАЙЛА 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/*'
Выберите "Проверить и сохранить" и сохраните конвейер непосредственно в главной ветви.
Добавление утверждения вручную для продвижения или отклонения канарного развертывания
Вы можете вмешаться вручную с YAML или классической версией.
- Создайте новую среду Kubernetes с именем akspromote.
- Откройте новую среду akspromote из списка сред и выберите "Утверждения" на вкладке "Утверждения и проверки".
- На экране "Утверждения" добавьте собственную учетную запись пользователя в разделе "Утверждающие".
- Разверните узел "Дополнительно" и убедитесь, что утверждающие могут утвердить собственные запуски .
- Нажмите кнопку создания.
Добавление этапов повышения и отклонения конвейера
Перейдите к конвейерам, выберите созданный конвейер и нажмите кнопку "Изменить".
Добавьте следующий
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' ```
Добавьте следующий
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/*' ```
Выберите "Проверить и сохранить" и сохраните конвейер непосредственно в главной ветви.
Развертывание стабильной версии
Для первого запуска конвейера стабильная версия рабочих нагрузок и их базовые или канарские версии не существуют в кластере. Разверните стабильную версию рабочей нагрузки 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.