Привет всем 👋 !! В этом блоге мы увидим, как реализовать прогрессивную доставку с помощью AWS Appmesh в EKS с помощью Flagger. Прежде чем глубоко погрузиться в блог, давайте посмотрим на некоторые концепции, стоящие за ним. — Непрерывная доставка В Непрерывное развертывание В Прогрессивная доставка Анкет
Концепции
Непрерывная доставка -Возможность снабжения артефактов, таких как двоичные файлы, изображения контейнеров, секреты или конфигурации времени выполнения в безопасном автоматизированном подходе.
Непрерывное развертывание — несколько создан, вытягивая указанные артефакты и запустив их в среде выполнения, такую как Kubernetes, Amazon ECS и т. Д. На момент публикации некоторые передовые практики, такие как неизменные артефакты и многоэтажное кэширование, были широко распространены и приняты.
Прогрессивная доставка
Прогрессивная доставка — это современная разработка программного обеспечения для постепенного развертывания новых функций, чтобы ограничить потенциальное негативное влияние и измерить метрики с помощью недавно развернутых функций. Прогрессивная доставка основывается на основе непрерывной доставки и расширяет практику, включающую развертывание функций, канарейку, A/B-тестирование, сине-зеленые развертывания.
Прогрессивная доставка делает процесс выпуска более устойчивым. Это снижает риск, внося дополнительные изменения, и на каждом шаге вы проверяете или делаете ручное одобрение, чтобы перейти на следующий этап. Используя это, вы можете доставлять чаще с уверенностью.
Флаггер
Флаггер это прогрессивный инструмент доставки, который автоматизирует процесс выпуска для приложений, работающих на Kubernetes. Это снижает риск введения новой версии программного обеспечения в производстве, постепенно перемещая трафик на новую версию при измерении метрик и проведении тестов на соответствие.
Flagger реализует несколько стратегий развертывания (Canary Leleases, A/B -тестирование, синее/зеленое зеркалирование), используя сервисную сетку (App Mesh, Istio, Linkerd) или контроллер Ingress (Contour, Gloo, Nginx, Skipper, Traefik) для маршрутизации трафика. Для анализа выпуска Flagger может запросить прометею, DataDog, New Relic, CloudWatch или графит, а для оповещения он использует Slack, MS Teams, Discord и Rocket. Flagger может быть настроен с помощью пользовательских ресурсов Kubernetes и совместим с любыми решениями CI/CD, сделанным для Kubernetes.
Изображение: флаггер
Начиная
Этот блог проводит вас через настройку Flagger и AWS Appmesh на EKS. Вы можете создать кластер Kubernetes, используя портал или EKSCTL. Здесь мы будем использовать инструмент командной строки EKSCTL — для создания или управления кластером EKS.
Создать кластер EKS
eksctl create cluster --name=eks-dev \ --region=us-east-1 \ --nodes 3 \ --appmesh-access
Эта команда создаст кластер EKS с приложенной политикой AppMesh IAM.
Установка AWS Appmesh
Добавить eks helm Repo
helm repo add eks https://aws.github.io/eks-charts
Установите Appmesh CRDS
kubectl apply -k [github.com/aws/eks-charts/stable/appmesh-controller//crds?ref=master](http://github.com/aws/eks-charts/stable/appmesh-controller//crds?ref=master)
Создайте пространство имен под названием приложение
kubectl create ns appmesh-system
Установите контроллер Appmesh
helm upgrade -i appmesh-controller eks/appmesh-controller \ --wait --namespace appmesh-system
Установите экземпляр Prometheus, чтобы собрать метрики сетки приложения для запуска канарского анализа.
helm upgrade -i appmesh-prometheus eks/appmesh-prometheus \ --wait --namespace appmesh-system
Установка флага
Добавить репозиторий шлема Flagger
helm repo add flagger https://flagger.app
Установите Canary CRDS Flagger
kubectl apply -f https://raw.githubusercontent.com/fluxcd/flagger/main/artifacts/flagger/crd.yaml
Развернуть флаггер в пространствах имен системы AppMesh. Пожалуйста, установите MeshProvider в AppMesh и MetricsServer на ваш адрес Prometheus.
helm upgrade -i flagger flagger/flagger \ --namespace=appmesh-system \ --set crd.create=false \ --set meshProvider=appmesh:v1beta2 \ --set metricsServer=http://appmesh-prometheus:9090
Давайте сделаем развертывание
Установите развертывание вашего POD, включая горизонтальный капсул Scaler. Здесь я использую один из популярных образцов — информация о капсулах. Обратите внимание, что мы не устанавливаем какие -либо объекты API -api, специфичные для AppMesh, здесь. Flagger будет создавать Appmesh VirtualRouter, VirtualService на основе канарского файла, который мы создадим.
kubectl apply -k https://github.com/fluxcd/flagger//kustomize/podinfo?ref=main
Развернуть стручок Loadtest для запуска нагрузочных тестов в развертывании Podinfo
helm upgrade -i flagger-loadtester flagger/loadtester \ --namespace=test \ --set appmesh.enabled=true \ --set "appmesh.backends[0]=podinfo" \ --set "appmesh.backends[1]=podinfo-canary"
Настройка канарейки
Создайте канарейское определение развертывания, которое мы создали. В этом YAML мы создаем Canary API, ориентируясь на конкретное развертывание. В конфигурации анализа мы инструктируем Канарский анализ выполнять каждый 1 млн интервал — и увеличивать вес до 5-50 в зависимости от порогов запроса, соскобаемых из метрик.
apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
name: podinfo
namespace: test
spec:
provider: appmesh:v1beta2
targetRef:
apiVersion: apps/v1
kind: Deployment
name: podinfo
service:
# container port
port: 9898
timeout: 15s
match:
- uri:
prefix: /
rewrite:
uri: /
# define the canary analysis timing and KPIs
analysis:
# schedule interval (default 60s)
interval: 1m
# max number of failed metric checks before rollback
threshold: 5
# max traffic percentage routed to canary
# percentage (0-100)
maxWeight: 50
# canary increment step
# percentage (0-100)
stepWeight: 5
# App Mesh Prometheus checks
metrics:
- name: request-success-rate
# minimum req success rate (non 5xx responses)
# percentage (0-100)
thresholdRange:
min: 99
interval: 1m
- name: request-duration
# maximum req duration P99
# milliseconds
thresholdRange:
max: 500
interval: 30s
Проверка проверки на прогрессирование
Кроме того, вы можете увидеть, как Webhooks настроены для выполнения принятия на предварительном развертывании и нагрузочных тестах, когда выполняется маршрутизация канарского трафика. Это запустит тест на загрузку на канарейском развертывании перед прогрессом этапов и вызовет предварительные веб -крючки перед маршрутизацией трафика в канарейку.
analysis:
....
webhooks: #optional
- name: acceptance-test
type: pre-rollout
url: http://flagger-loadtester.test/
timeout: 30s
metadata:
type: bash
cmd: "curl -sd 'test' http://podinfo-canary.test:9898/token | grep token"
- name: load-test
url: http://flagger-loadtester.test/
timeout: 5s
metadata:
cmd: "hey -z 1m -q 10 -c 2 http://podinfo-canary.test:9898/"
Успешные развертывания
Запустите развертывание канарейки, обновив версию изображения. Развертывание канарейки будет вызвано спецификациями развертывания, конфигурации и секретов.
kubectl -n test set image deployment/podinfo \ podinfod=stefanprodan/podinfo:3.1.1
Флаггер обнаруживает изменение версии контейнера и выполняет канарейский анализ.
kubectl -n test describe canary/podinfo Status: Canary Weight: 0 Failed Checks: 0 Phase: Succeeded Events: New revision detected! Scaling up podinfo.test Waiting for podinfo.test rollout to finish: 0 of 1 updated replicas are available Pre-rollout check acceptance-test passed Advance podinfo.test canary weight 5 Advance podinfo.test canary weight 10 Advance podinfo.test canary weight 15 Advance podinfo.test canary weight 20 Advance podinfo.test canary weight 25 Advance podinfo.test canary weight 30 Advance podinfo.test canary weight 35 Advance podinfo.test canary weight 40 Advance podinfo.test canary weight 45 Advance podinfo.test canary weight 50 Copying podinfo.test template spec to podinfo-primary.test Waiting for podinfo-primary.test rollout to finish: 1 of 2 updated replicas are available Routing all traffic to primary Promotion completed! Scaling down podinfo.test
Автоматический откат
Когда количество неудачных проверок достигает порога канарского анализа, трафик направляется обратно на первичную, канарейку масштабируется до нуля, а развертывание помечается как неудачный.
Вывод
Прогрессивная доставка открывает быстрые выбросы. Используя Flagger, теперь это проще, чтобы включить автоматизированные развертывания канарейки с вашей любимой сервисной сеткой, которую вы используете в своем кластере Kubernetes. Это даст вам полный контроль над процессом развертывания функций. Вы можете расширить процесс прогрессивной доставки, расширив проверку, ручное утверждение, уведомления команды Slack или MS и т. Д. Мы рассмотрим расширяемые настройки с утверждением и уведомлениями в предстоящих сообщениях в блоге.
Оригинал: «https://dev.to/aws-builders/progressive-delivery-with-aws-appmesh-in-eks-using-flagger-21fl»