Rollouts Argo Создан прогрессивный контроллер доставки для Kubernetes. Это позволяет развертывать ваше приложение с минимальными/нулевыми простоями, приняв постепенный способ развертывания вместо того, чтобы принимать подход «все сразу».
Argo Rollouts Supertrges ваши кластер Kubernetes и в дополнение к обновлениям Rolling Теперь вы можете сделать
- Синие/зеленые развертывания
- Канарские развертывания
- A/B тесты
- Автоматические откаты
- Интегрированный метрический анализ
В предыдущей статье мы видели синие/зеленые развертывания Отказ В этой статье мы увидим пример, который объединяет развертывание Canary с Метрики прометея Это автоматически откатывает приложение, если новая версия не передает определенные метрические пороги.
Как работают канарские развертывания
Канарские развертывания немного более продвинуты, чем синие/зеленые развертывания. С развертыванием Canary вместо того, чтобы иметь один критический момент, когда весь трафик переключается со старой версии на новую версию, только подмножество живого трафика постепенно перемещается в новую версию.
Вот теория:
В начале у нас есть единая версия приложения. Все живые трафик от пользователей отправляются на эту версию. Ключевой момент здесь состоит в том, что умного балансировщик прокси/нагрузки действует как промежуточный между пользователями и инфраструктурой. В исходном состоянии этот балансировщик нагрузки отправляет 100% трафика в стабильную версию.
На следующем этапе мы запустим вторую версию приложения. Затем мы указываем балансировку нагрузки на маршрут 10% трафика на новую версию. Это означает, что если новая версия имеет проблемы только небольшое количество пользователей. Эта версия действует как «канарейка», которая будет уведомить нас, если что-то не так с новым развертыванием благодаря полной развертыванию.
Если мы подумаем, что новое приложение хорошо реагирует на живое движение, мы можем увеличить процент пользователей, которые перенаправлены на него. На втором этапе мы выбрали до маршрута 1/3 всего трафика. Это означает, что у нас все еще есть сбой и всегда можно переключить весь трафик на предыдущую версию, но мы также можем посмотреть, как наша версия ведет себя под представительством трафика.
На последнем шаге мы изменяем балансировщик нагрузки и отправляем 100% трафика на новую версию. Теперь мы можем полностью отменить старую версию. Мы вернулись в исходное состояние
Обратите внимание, что количество этапов, а также в процентах от трафика определено пользователем. Числа, которые мы использовали (10% на этапе 1 и 33% на этапе 2), являются лишь примером.
В зависимости от вашей сетевой настройки вы также можете иметь расширенные решения маршрутизации и вместо того, чтобы ослепляя перенаправить подмножество трафика, вы должны сначала выбрать, кто увидит новую версию. Общие примеры — это пользователи из определенной географической области или пользователей из определенной платформы (E.g. Mobile пользователей сначала).
Triple Service Canary с Revouts Argo
Теперь, когда мы видели, как работают канарские развертывания в целом Давайте посмотрим, что раскатывает ARGO с Kubernetes.
Rollout Argo — контроллер Kubernetes и имеет Несколько вариантов для развертывания Canary Отказ Некоторые из наиболее интересных возможностей являются собственная интеграция с сетевыми решениями (для раскол трафика) и с метрическими решениями для автоматических акций между канарскими этапами.
Однако одна самая основная функция является тем, как Revouts Argo относятся к услугам Kubernetes во время канаренного освобождения. Всякий раз, когда активен Canary, Rollouts Argo может создать для вас 3 службы
- Сервис, который получает трафик как старая, так и новая версия. Это то, что ваши живые пользователи, вероятно, будут использовать
- Сервис, который отправляет трафик только на канареечную/новую версию. Вы можете использовать эту услугу, чтобы собрать свои метрики или запустить дымовые тесты или дать ему только некоторым пользователям, которые хотят получить доступ к новому выпуску как можно быстрее (например, пользователи внутренней компании)
- Услуга, которая отправляет трафик только на последнюю/стабильную версию. Вы можете использовать сервис, если вы хотите сохранить несколько пользователей в старую версию как можно дольше (например, пользователей, которые вы не хотите, чтобы пострадали на всех странах Canary)
Вы можете легко установить оператор в свой кластер, следуя Инструкции Отказ
Вы можете найти пример приложения на https://github.com/codefresh-contrib/argo-rollout-canary-sampample-app Отказ Это простое приложение Golang, которое обнародует некоторые основные Метрики прометея и не имеет других зависимостей.
Прежде чем использовать пример, необходимый для установки входной или сервисной сетки в вашем кластере, который будет использоваться для разделения трафика. Rollouts Argo Поддерживает несколько решений в том числе SMI поддержка . Мы будем использовать LinkerD Для нашего примера.
Чтобы выполнить начальное развертывание, клонировать репозиторий Git локально и отредактируйте файл Canary-Manual - одобрение/разъединение. YAML
заменив Cf_short_revision
с любым доступным тегом из Dockerhub (например, C323C7B)
Сохраните файл, а затем выполните первое развертывание с
kubectl create ns canary kubectl apply -f ./canary-manual-approval -n canary
Вот начальное состояние, использующее Kubeview Graphical Tool Отказ
Приложение имеет 4 PODS и работает (показано в середине изображения). Есть 3 службы, которые указывают на них. Это «развертывание — канарцы-активное», «развертывание-канарное превью» и «развертывание — канарцы-все трафики». Ваш живой трафик должен использовать последний.
Если вы также хотите отслеживать вещи из командной строки, обязательно установите Rollouts Argo CLI и бежать
kubectl argo rollouts get rollout golang-sample-app-deployment --watch -n canary
Следующим шагом является создание новой версии приложения. Вы можете снова изменить тег изображения на манифесте (и снова запустить kubectl применить снова) или просто используйте ярлык, предлагаемый argo Rollouts
kubectl argo rollouts set image golang-sample-app-deployment spring-sample-app-container=kostiscodefresh/argo-rollouts-canary-sample-app:8c67194 -n canary
Тег изображения, которую вы используете, является произвольным. Это просто нужно отличаться от текущего. Как только Revouts ARGO обнаружит изменения, это сделает следующее:
- Создать совершенно новую реплику, установленную с указанными стручками для выпуска канаренного
- Перенаправить услугу «Предварительный просмотр» к новым стручкам
- Держите «активную» службу для старых стручков (существующая версия)
- Перенаправьте службу «все трафики» как активной и новой версии.
Вот как это выглядит в Kubeview:
CLI также сообщит о расщеплении трафика:
Вы также можете видеть в варианте «VetWeight», что канарцы получают только 10% трафика прямо сейчас.
Так что теперь только подмножество всех пользователей могут видеть новую версию. На данном этапе ваша обязанность решить, в порядке, в порядке. Может быть, вы хотите запустить несколько дымовых испытаний или посмотреть на ваши метрики для Canary (мы автоматизируем это в следующем разделе).
Как только вы будете довольны канареем, вы можете переместить больше живого трафика к этому, продвигая его.
kubectl argo rollouts promote golang-sample-app-deployment -n canary
Rollouts Argo создаст больше стручков для Canary Release и сдвигая больше трафика к нему:
На этом этапе 33% трафика отправляется на канарские стручки, как определено в Спецификация развертывания : С помощью этого объема трафика больше пользователей подвергаются воздействию новой версии, и любые немедленные проблемы должны быть проще заметить в ваших метриках или других механизмах мониторинга.
Предполагая, что все еще выглядит хорошо, вы можете продвигать канареться во второй раз:
kubectl argo rollouts promote golang-sample-app-deployment -n canary
Возлюбления ARGO теперь будут перенести весь трафик на канарские стручки и через некоторое время отказаться от предыдущей версии:
Теперь мы вернемся к исходному состоянию, где все 3 указывают на новую версию.
Новое развертывание повторит весь процесс.
Если по какой-то причине ваши дымовые тесты отказались, и вы не хотите продвигать новую версию, с которой вы можете прервать весь процесс с
kubectl argo rollouts abort golang-sample-app-deployment -n canary
Вы также можете вернуться к предыдущей версии с
kubectl argo rollouts undo golang-sample-app-deployment -n canary
Rollouts Argo имеет больше вариантов, которые позволяют вам выбрать количество версий, которые остаются позади, количество времени каждой версии сохраняется, какая версия возвращается и так далее.
Увидеть весь Спемент развертывания Больше подробностей.
Обратите внимание также, что для простоты причинами три службы в примере питаются приведенными в действие балансировщиками нагрузки. Проверьте цену вашего облачного провайдера перед запуском этого примера самостоятельно и обязательно убирайте все после завершения.
Автоматизация всего с Codefresh и Prometheus
Теперь, когда мы видели, как вы можете выполнять развертывание вручную канареести, пришло время автоматизировать процесс развертывания с помощью трубопроводов Codefresh.
Мы могли бы написать аналогичный трубопровод, как в нашем Синий/зеленый пример который делает паузу трубопровода на каждом шаге Канарея, а затем идет на следующий этап, ожидая Для ручного одобрения . Вы можете найти пример трубопровода в https://github.com/codefresh-contrib/argo-rollout-canary-sample-app/blob/main/canary-manual-appral/codefreash.yaml.yaml.
Однако помните, что весь точка автоматизации состоит в том, чтобы удалить столько же, сколько возможно ручные шаги. К счастью, Rollouts Argo имеет родную поддержку для нескольких метрических провайдеров. Оценивая метрики вашего приложения на всех канаревых этапах, мы можем полностью автоматизировать весь процесс, путем автоматического продвижения/демотации Canary Canary в соответствии с вашими метрическими критериями.
Вот трубопровод, который мы создадим:
Обратите внимание, насколько простым трубопровод. Откаты Argo автоматически позаботятся обо всех акциях позади сцен.
Наш пример уже предназначен для метрик PROMETHEUS. Мы добавим Анализ в нашем канереерном развертывании. Вы можете увидеть полную информацию в https://github.com/codefresh-contrib/argo-Rollout-canary-sampample-app/blob/main/canary-with-metrics/analysis.yaml.
{% raw %} apiVersion: argoproj.io/v1alpha1 kind: AnalysisTemplate metadata: name: success-rate spec: args: - name: service-name metrics: - name: success-rate interval: 2m count: 2 # NOTE: prometheus queries return results in the form of a vector. # So it is common to access the index 0 of the returned array to obtain the value successCondition: result[0] >= 0.95 provider: prometheus: address: http://prom-release-prometheus-server.prom.svc.cluster.local:80 query: {% endraw %}
Этот анализ определяет, что мы пойдем на следующий этап канарее, только если конкретный PROMQL Заявление (количество запросов, которые возвращает 2xx HTTP-статус, разделенные на все запросы), возвращается более 95% Если в любой точечной метрике падают ниже этого порога, канарейка будет прервана.
Вот весь трубопровод:
{% raw %} version: "1.0" stages: - prepare - build - deploy steps: clone: type: "git-clone" stage: prepare description: "Cloning main repository..." repo: '${{CF_REPO_OWNER}}/${{CF_REPO_NAME}}' revision: "${{CF_BRANCH}}" build_app_image: title: Building Docker Image type: build stage: build image_name: kostiscodefresh/argo-rollouts-canary-sample-app working_directory: "${{clone}}" tags: - "latest" - '${{CF_SHORT_REVISION}}' dockerfile: Dockerfile build_arguments: - git_hash=${{CF_SHORT_REVISION}} start_deployment: title: Start canary stage: deploy image: codefresh/cf-deploy-kubernetes:master working_directory: "${{clone}}" commands: - /cf-deploy-kubernetes ./canary-with-metrics/service.yaml - /cf-deploy-kubernetes ./canary-with-metrics/service-preview.yaml - /cf-deploy-kubernetes ./canary-with-metrics/service-all.yaml - /cf-deploy-kubernetes ./canary-with-metrics/analysis.yaml - /cf-deploy-kubernetes ./canary-with-metrics/rollout.yaml environment: - KUBECONTEXT=mydemoAkscluster@BizSpark Plus - KUBERNETES_NAMESPACE=canary {% endraw %}
Теперь у вас есть истинное непрерывное развертывание! Все развертывания полностью автоматически и «плохие» версии приложений (которые не проходят наши метрики), будут автоматически вернуться автоматически.
Для получения более подробной информации о развертывании Canary, а также пример с ручным одобрением см. Страница документации Отказ
Новичок в Codefresh? Создайте свой бесплатный аккаунт сегодня Действительно
Оригинал: «https://dev.to/codefreshio/recover-automatically-from-failed-deployments-with-argo-rollouts-and-prometheus-metrics-1oj4»