Руководство. Использование стратегии развертывания канарной версии для развертываний Kubernetes
Azure DevOps Services | Azure DevOps Server 2022
Стратегия развертывания canary означает развертывание новых версий приложения рядом с стабильными рабочими версиями. Затем можно увидеть, как канареарная версия сравнивается с базовой версией, прежде чем продвигать или отклонять развертывание.
В этом пошаговом руководстве описывается использование канарной стратегии задачи манифеста Kubernetes. В частности, вы узнаете, как настроить канаровые развертывания для Kubernetes и связанный рабочий процесс для оценки кода. Затем вы используете этот код для сравнения базовых и канаровых развертываний приложений, чтобы решить, следует ли продвигать или отклонять канаровое развертывание.
Если вы используете Служба Azure Kubernetes, тип подключения службы Azure Resource Manager является лучшим способом подключения к частному кластеру или кластеру с отключенными локальными учетными записями.
Необходимые компоненты
- Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
- Учетная запись GitHub. Создайте бесплатную учетную запись GitHub, если еще не сделали этого.
- Привилегии отправки Реестр контейнеров Azure с помощью push-уведомлений. Создайте Реестр контейнеров Azure, если у вас еще нет.
- Кластер Kubernetes. Разверните кластер Служба Azure Kubernetes (AKS).
Пример кода
Вилку следующего репозитория на сайте GitHub.
https://github.com/MicrosoftDocs/azure-pipelines-canary-k8s
Ниже приведен краткий обзор файлов в репозитории, которые используются в этом руководстве:
- ./app:
- app.py — простой веб-сервер на основе Flask, инструментирующийся с помощью библиотеки инструментирования Prometheus для приложений Python. Настраиваемый счетчик настраивается для количества предоставленных хороших и плохих ответов на основе значения переменной
success_rate
. - Dockerfile — используется для создания образа с каждым изменением, внесенным в app.py. При каждом изменении конвейер сборки активируется и образ создается и отправляется в реестр контейнеров.
- app.py — простой веб-сервер на основе Flask, инструментирующийся с помощью библиотеки инструментирования Prometheus для приложений Python. Настраиваемый счетчик настраивается для количества предоставленных хороших и плохих ответов на основе значения переменной
- ./manifests:
- deployment.yml — содержит спецификацию рабочей нагрузки
sampleapp
развертывания, соответствующей изображению, опубликованному ранее. Этот файл манифеста используется не только для стабильной версии объекта развертывания, но и для получения базовых и канаарных вариантов рабочих нагрузок. - service.yml — создает
sampleapp
службу. Эта служба направляет запросы к модулям pod, присоединенным к развертываниям (стабильным, базовым и канарной) упоминание ранее.
- deployment.yml — содержит спецификацию рабочей нагрузки
- ./Разное
- service-monitor.yml — используется для настройки объекта ServiceMonitor . Этот объект настраивает очистку метрик Prometheus.
- fortio-deploy.yml — используется для настройки развертывания fortio. Это развертывание позже используется в качестве средства нагрузочного тестирования для отправки потока запросов в службу, развернутую
sampleapp
ранее. Поток отправленныхsampleapp
запросов направляется на модули pod во всех трех развертываниях (стабильных, базовых и канарной).
Примечание.
В этом руководстве вы используете Prometheus для инструментирования кода и мониторинга. Любое эквивалентное решение, например приложение Azure Аналитика, можно использовать в качестве альтернативы.
Установка prometheus-operator
Чтобы установить Prometheus в кластере, используйте следующую команду на компьютере разработки. Необходимо установить kubectl и Helm, и необходимо задать контекст для кластера, для которого требуется развернуть. Grafana, который вы используете позже для визуализации базовых показателей и канарной метрики на панелях мониторинга, устанавливается в рамках этой диаграммы Helm.
Сначала вы добавите репозиторий Prometheus Community Kubernetes Helm Chart в установку Helm. Затем вы установите стек kube-prometheus, коллекцию манифестов Kubernetes, панелей мониторинга Grafana и правил Prometheus.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update # update local cache
helm install --name sampleapp prometheus-community/kube-prometheus-stack
Создание подключений к службе
- Перейдите к подключениям к службам конвейеров>>project в меню Azure DevOps.
- Создайте подключение службы реестра Docker, связанное с реестром контейнеров. Назовите его azure-pipelines-canary-k8s.
- Создайте подключение службы Kubernetes для кластера Kubernetes и пространства имен, в которое требуется развернуть. Назовите его azure-pipelines-canary-k8s.
Примечание.
Если вы используете Служба Azure Kubernetes, тип подключения службы Azure Resource Manager является лучшим способом подключения к частному кластеру или кластеру с отключенными локальными учетными записями.
Настройка непрерывной интеграции
Перейдите к конвейеру создания конвейера> и выберите репозиторий.
На вкладке "Настройка" выберите конвейер Starter.
На вкладке "Рецензирование" замените yamL конвейера этим кодом.
trigger: - main pool: vmImage: ubuntu-latest variables: imageName: azure-pipelines-canary-k8s steps: - task: Docker@2 displayName: Build and push image inputs: containerRegistry: azure-pipelines-canary-k8s #replace with name of your Docker registry service connection repository: $(imageName) command: buildAndPush Dockerfile: app/Dockerfile tags: | $(Build.BuildId)
Если созданное подключение к службе реестра Docker связано
example.azurecr.io
, то образ —example.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId)
на основе предыдущей конфигурации.
Изменение файла манифеста
В манифестах/deployment.yml замените <example>
URL-адрес реестра контейнеров. Например, после замены поле изображения должно выглядеть примерно так contosodemo.azurecr.io/azure-pipelines-canary-k8s
.
Настройка непрерывного развертывания
В следующих разделах приведены инструкции по настройке непрерывного развертывания, включая развертывание канарной стадии, а также повышение или отклонение канарии с помощью ручного вмешательства.
Развертывание канарной стадии
Вы можете развернуть с помощью YAML или классической версии.
Перейдите в среду создания сред>конвейеров>.
Создайте новую среду.
- Имя: akscanary
- Ресурс: выберите Kubernetes.
Нажмите кнопку "Далее" и настройте ресурс Kubernetes следующим образом:
- Поставщик: Служба Azure Kubernetes
- Подписка Azure. Выберите подписку, содержащую кластер Kubernetes.
- Кластер. Выберите кластер.
- Пространство имен: создайте новое пространство имен с именем canarydemo.
Выберите " Проверить и создать".
Перейдите в раздел Конвейеры. Выберите созданный конвейер и нажмите кнопку "Изменить".
Измените шаг, созданный ранее, чтобы использовать этап. Добавьте еще два шага для копирования манифестов и неправильных каталогов в качестве артефактов для использования на последовательных этапах. Вы также можете переместить несколько значений в переменные, чтобы упростить использование позже в конвейере. Теперь полный YAML должен выглядеть следующим образом.
trigger: - main pool: vmImage: ubuntu-latest variables: imageName: azure-pipelines-canary-k8s dockerRegistryServiceConnection: dockerRegistryServiceConnectionName #replace with name of your Docker registry service connection imageRepository: 'azure-pipelines-canary-k8s' containerRegistry: example.azurecr.io #replace with the name of your container registry, Should be in the format 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 для развертывания канарной версии.
- stage: DeployCanary displayName: Deploy canary dependsOn: Build condition: succeeded() jobs: - deployment: Deploycanary displayName: Deploy canary pool: vmImage: ubuntu-latest environment: 'akscanary.canarydemo' strategy: runOnce: deploy: steps: - task: KubernetesManifest@0 displayName: Create imagePullSecret inputs: action: createSecret secretName: azure-pipelines-canary-k8s dockerRegistryEndpoint: azure-pipelines-canary-k8s - task: KubernetesManifest@0 displayName: Deploy to Kubernetes cluster inputs: action: 'deploy' strategy: 'canary' percentage: '25' manifests: | $(Pipeline.Workspace)/manifests/deployment.yml $(Pipeline.Workspace)/manifests/service.yml containers: '$(containerRegistry)/$(imageRepository):$(tag)' imagePullSecrets: azure-pipelines-canary-k8s - task: KubernetesManifest@0 displayName: Deploy Forbio and ServiceMonitor inputs: action: 'deploy' manifests: | $(Pipeline.Workspace)/misc/*
Сохраните конвейер, зафиксировав непосредственно в главную ветвь. Эта фиксация уже должна успешно запустить конвейер.
Ручное вмешательство для поощрения или отклонения канарной
Вы можете вмешаться вручную с YAML или классической версией.
Перейдите в новую среду конвейеров>>.
Настройте новую среду.
- Имя: akspromote
- Ресурс: выберите Kubernetes.
Нажмите кнопку "Далее" и настройте ресурс Kubernetes следующим образом:
- Поставщик: Служба Azure Kubernetes
- Подписка Azure. Выберите подписку, содержащую кластер Kubernetes.
- Кластер. Выберите кластер.
- Пространство имен: выберите пространство имен, canarydemo, созданное ранее.
Выберите " Проверить и создать".
Выберите новую
akspromote
среду из списка сред.Выберите Утверждения и проверка Утверждения>. Затем выберите значок многоточия (три точки).
Настройте утверждение следующим образом:
- Утверждающие: добавьте собственную учетную запись пользователя.
- Дополнительно. Убедитесь, что выбран флажок "Разрешить утверждающим утвердить свои собственные запуски ".
Нажмите кнопку создания.
Перейдите к конвейерам и выберите созданный конвейер. Затем выберите Edit (Изменить).
Добавьте еще один этап,
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.canarydemo' strategy: runOnce: deploy: steps: - task: KubernetesManifest@0 displayName: promote canary inputs: action: 'promote' strategy: 'canary' manifests: '$(Pipeline.Workspace)/manifests/*' containers: '$(containerRegistry)/$(imageRepository):$(tag)' imagePullSecrets: '$(imagePullSecret)'
Добавьте еще один этап,
RejectCanary
в конце файла YAML, чтобы откатить изменения.- stage: RejectCanary displayName: Reject canary dependsOn: PromoteRejectCanary condition: failed() jobs: - deployment: RejectCanary displayName: Reject Canary pool: vmImage: ubuntu-latest environment: 'akscanary.canarydemo' strategy: runOnce: deploy: steps: - task: KubernetesManifest@0 displayName: reject canary inputs: action: 'reject' strategy: 'canary' manifests: '$(Pipeline.Workspace)/manifests/*'
Сохраните конвейер YAML, нажав кнопку "Сохранить", а затем зафиксируйте его непосредственно в главной ветви.
Развертывание стабильной версии
Вы можете развернуть стабильную версию с помощью YAML или классической версии.
Для первого запуска конвейера стабильная версия рабочих нагрузок, а их базовые или канарские версии не существуют в кластере. Чтобы развернуть стабильную версию, выполните следующие действия.
- В app/app.py перейдите
success_rate = 5
наsuccess_rate = 10
. Это изменение активирует конвейер, что приводит к сборке и отправке образа в реестр контейнеров. Он также активируетDeployCanary
этап. - Так как вы настроили утверждение в
akspromote
среде, выпуск будет ждать, прежде чем запустить этот этап. - В сводке выполнения выберите "Проверить>утверждение". Это развертывает стабильную версию рабочих нагрузок (
sampleapp
развертывание в манифестах или deployment.yml) в пространстве имен.
Запуск канарского рабочего процесса
Стабильная версия рабочей нагрузки sampleapp
теперь существует в кластере. Затем внесите следующее изменение в приложение моделирования:
В app/app.py перейдите success_rate = 10
на success_rate = 20
.
Это изменение активирует конвейер сборки, что приводит к сборке и отправке образа в реестр контейнеров. Этот процесс, в свою очередь, активирует конвейер выпуска и начинает этап развертывания канарии .
Имитация запросов
На компьютере разработки выполните следующие команды и сохраните его, чтобы отправить постоянный поток запросов в sampleapp
службе. sampleapp
перенаправляет запросы к модулям pod, которые выполняются в стабильном sampleapp
развертывании, а также к модулям pod, которые выполняются с помощью sampleapp-baseline
и sampleapp-canary
развертывания. Селектор, указанный для sampleapp
, применим ко всем этим модулям pod.
FORTIO_POD=$(kubectl get pod | grep fortio | awk '{ print $1 }')
kubectl exec -it $FORTIO_POD -c fortio /usr/bin/fortio -- load -allow-initial-errors -t 0 http://sampleapp:8080/
Настройка панели мониторинга Grafana
Выполните следующую команду перенаправления портов на локальном компьютере разработки, чтобы получить доступ к Grafana.
kubectl port-forward svc/sampleapp-grafana 3000:80
В браузере откройте следующий URL-адрес.
http://localhost:3000/login
При появлении запроса на получение учетных данных, если
adminPassword
значение не было переопределено во времяprometheus-operator
установки диаграммы Helm, можно использовать следующие значения:- имя пользователя: администратор
- password: prom-operator
В меню слева выберите +>Graph панели мониторинга.>
Выберите в любом месте недавно добавленной панели и введите
e
, чтобы изменить панель.На вкладке "Метрики" введите следующий запрос:
rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
На вкладке "Общие " измените имя этой панели на все примеры podapp.
В строке обзора в верхней части страницы измените диапазон длительности на "Последние 5 минут " или "Последние 15 минут".
Чтобы сохранить эту панель, выберите значок сохранения на панели обзора.
На предыдущей панели отображаются метрики частоты успеха из всех вариантов. К ним относятся стабильные (из развертывания), базовые
sampleapp
показатели (изsampleapp-baseline
развертывания) и канарии (изsampleapp-canary
развертывания). Вы можете визуализировать только базовые и канаровые метрики, добавив другую панель с следующей конфигурацией:- На вкладке "Общие" выберите пример базового и канарского приложения.
- На вкладке "Метрики" используйте следующий запрос:
rate(requests_total{pod=~"sampleapp-baseline-.*|sampleapp-canary-.*", custom_status="good"}[1m])
Примечание.
Панель базовых и канарной метрик будет иметь только метрики, доступные для сравнения в определенных условиях. Эти условия относятся к успешному завершению этапа развертывания, а этап "Повышение и отклонение" ожидает вмешательства вручную.
Совет
Настройте заметки для панелей мониторинга Grafana для визуального изображения событий завершения этапа для развертывания канарной и отклонить канарной. Это полезно, чтобы вы знали, когда начать сравнение базовых показателей с канарной, и когда повышение или отклонение канария завершилось соответственно.
Сравнение базовых показателей и канарной
На этом этапе процесс развертывания может успешно завершиться (в зависимости от изменения
success_rate
на10
20
). Этап продвижения и отклонения канарной стадии ожидает ручного вмешательства. Теперь вы можете сравнить частоту успешного выполнения (как определеноcustom_status=good
) базовых и канаарных вариантов на панели мониторинга Grafana. Это должно выглядеть следующим образом:Основываясь на наблюдении, что скорость успеха выше для канарной, продвигайте канарной. Выберите "Возобновить" в задаче вмешательства вручную.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по