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

Azure DevOps Services | Azure DevOps Server 2022

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

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

Если вы используете Служба Azure Kubernetes, тип подключения службы Azure Resource Manager является лучшим способом подключения к частному кластеру или кластеру с отключенными локальными учетными записями.

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

Пример кода

Вилку следующего репозитория на сайте GitHub.

https://github.com/MicrosoftDocs/azure-pipelines-canary-k8s

Ниже приведен краткий обзор файлов в репозитории, которые используются в этом руководстве:

  • ./app:
    • app.py — простой веб-сервер на основе Flask, инструментирующийся с помощью библиотеки инструментирования Prometheus для приложений Python. Настраиваемый счетчик настраивается для количества предоставленных хороших и плохих ответов на основе значения переменной success_rate .
    • Dockerfile — используется для создания образа с каждым изменением, внесенным в app.py. При каждом изменении конвейер сборки активируется и образ создается и отправляется в реестр контейнеров.
  • ./manifests:
    • deployment.yml — содержит спецификацию рабочей нагрузки sampleapp развертывания, соответствующей изображению, опубликованному ранее. Этот файл манифеста используется не только для стабильной версии объекта развертывания, но и для получения базовых и канаарных вариантов рабочих нагрузок.
    • service.yml — создает sampleapp службу. Эта служба направляет запросы к модулям pod, присоединенным к развертываниям (стабильным, базовым и канарной) упоминание ранее.
  • ./Разное
    • 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

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

  1. Перейдите к подключениям к службам конвейеров>>project в меню Azure DevOps.
  2. Создайте подключение службы реестра Docker, связанное с реестром контейнеров. Назовите его azure-pipelines-canary-k8s.
  3. Создайте подключение службы Kubernetes для кластера Kubernetes и пространства имен, в которое требуется развернуть. Назовите его azure-pipelines-canary-k8s.

Примечание.

Если вы используете Служба Azure Kubernetes, тип подключения службы Azure Resource Manager является лучшим способом подключения к частному кластеру или кластеру с отключенными локальными учетными записями.

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

  1. Перейдите к конвейеру создания конвейера> и выберите репозиторий.

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

  3. На вкладке "Рецензирование" замените 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 или классической версии.

  1. Перейдите в среду создания сред>конвейеров>.

  2. Создайте новую среду.

    • Имя: akscanary
    • Ресурс: выберите Kubernetes.
  3. Нажмите кнопку "Далее" и настройте ресурс Kubernetes следующим образом:

    • Поставщик: Служба Azure Kubernetes
    • Подписка Azure. Выберите подписку, содержащую кластер Kubernetes.
    • Кластер. Выберите кластер.
    • Пространство имен: создайте новое пространство имен с именем canarydemo.
  4. Выберите " Проверить и создать".

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

  6. Измените шаг, созданный ранее, чтобы использовать этап. Добавьте еще два шага для копирования манифестов и неправильных каталогов в качестве артефактов для использования на последовательных этапах. Вы также можете переместить несколько значений в переменные, чтобы упростить использование позже в конвейере. Теперь полный 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
    
  7. Добавьте этап в конце файла 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/*
    
  8. Сохраните конвейер, зафиксировав непосредственно в главную ветвь. Эта фиксация уже должна успешно запустить конвейер.

Ручное вмешательство для поощрения или отклонения канарной

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

  1. Перейдите в новую среду конвейеров>>.

  2. Настройте новую среду.

    • Имя: akspromote
    • Ресурс: выберите Kubernetes.
  3. Нажмите кнопку "Далее" и настройте ресурс Kubernetes следующим образом:

    • Поставщик: Служба Azure Kubernetes
    • Подписка Azure. Выберите подписку, содержащую кластер Kubernetes.
    • Кластер. Выберите кластер.
    • Пространство имен: выберите пространство имен, canarydemo, созданное ранее.
  4. Выберите " Проверить и создать".

  5. Выберите новую akspromote среду из списка сред.

  6. Выберите Утверждения и проверка Утверждения>. Затем выберите значок многоточия (три точки).

  7. Настройте утверждение следующим образом:

    • Утверждающие: добавьте собственную учетную запись пользователя.
    • Дополнительно. Убедитесь, что выбран флажок "Разрешить утверждающим утвердить свои собственные запуски ".
  8. Нажмите кнопку создания.

  9. Перейдите к конвейерам и выберите созданный конвейер. Затем выберите Edit (Изменить).

  10. Добавьте еще один этап, 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)'
    
  11. Добавьте еще один этап, 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/*'
    
  12. Сохраните конвейер YAML, нажав кнопку "Сохранить", а затем зафиксируйте его непосредственно в главной ветви.

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

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

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

  1. В app/app.py перейдите success_rate = 5 на success_rate = 10. Это изменение активирует конвейер, что приводит к сборке и отправке образа в реестр контейнеров. Он также активирует DeployCanary этап.
  2. Так как вы настроили утверждение в akspromote среде, выпуск будет ждать, прежде чем запустить этот этап.
  3. В сводке выполнения выберите "Проверить>утверждение". Это развертывает стабильную версию рабочих нагрузок ( 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

  1. Выполните следующую команду перенаправления портов на локальном компьютере разработки, чтобы получить доступ к Grafana.

    kubectl port-forward svc/sampleapp-grafana 3000:80
    
  2. В браузере откройте следующий URL-адрес.

    http://localhost:3000/login
    
  3. При появлении запроса на получение учетных данных, если adminPassword значение не было переопределено во время prometheus-operator установки диаграммы Helm, можно использовать следующие значения:

    • имя пользователя: администратор
    • password: prom-operator
  4. В меню слева выберите +>Graph панели мониторинга.>

  5. Выберите в любом месте недавно добавленной панели и введите e , чтобы изменить панель.

  6. На вкладке "Метрики" введите следующий запрос:

    rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
    
  7. На вкладке "Общие " измените имя этой панели на все примеры podapp.

  8. В строке обзора в верхней части страницы измените диапазон длительности на "Последние 5 минут " или "Последние 15 минут".

  9. Чтобы сохранить эту панель, выберите значок сохранения на панели обзора.

  10. На предыдущей панели отображаются метрики частоты успеха из всех вариантов. К ним относятся стабильные (из развертывания), базовые sampleapp показатели (из sampleapp-baseline развертывания) и канарии (из sampleapp-canary развертывания). Вы можете визуализировать только базовые и канаровые метрики, добавив другую панель с следующей конфигурацией:

    • На вкладке "Общие" выберите пример базового и канарского приложения.
    • На вкладке "Метрики" используйте следующий запрос:
    rate(requests_total{pod=~"sampleapp-baseline-.*|sampleapp-canary-.*", custom_status="good"}[1m])
    

    Примечание.

    Панель базовых и канарной метрик будет иметь только метрики, доступные для сравнения в определенных условиях. Эти условия относятся к успешному завершению этапа развертывания, а этап "Повышение и отклонение" ожидает вмешательства вручную.

    Совет

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

Сравнение базовых показателей и канарной

  1. На этом этапе процесс развертывания может успешно завершиться (в зависимости от изменения success_rate на 1020). Этап продвижения и отклонения канарной стадии ожидает ручного вмешательства. Теперь вы можете сравнить частоту успешного выполнения (как определено custom_status=good) базовых и канаарных вариантов на панели мониторинга Grafana. Это должно выглядеть следующим образом:

    Screenshot that shows a comparison of baseline and canary metrics.

  2. Основываясь на наблюдении, что скорость успеха выше для канарной, продвигайте канарной. Выберите "Возобновить" в задаче вмешательства вручную.