Это руководство, в котором вы получите практический опыт работы с Gitops и прогрессивной доставкой, используя Kubernetes и Istio.
Вступление
Что такое житопы?
Gitops — это способ выполнять непрерывную доставку, он работает, используя GIT в качестве источника истины для декларативной инфраструктуры и рабочих нагрузок. Для Kubernetes это означает использование git push
вместо Kubectl Apply/Delete
или Helm Install/Upgrade
Анкет
На этом семинаре вы будете использовать GitHub для размещения репозитория конфигурации и Поток как раствор по доставке в Gitops.
Flux-это решение для непрерывной доставки с мультитенантом для Kubernetes. Поток построен с Gitops Toolkit , набор композиционных API и специализированных инструментов для поддержания кластеров Kubernetes в синхронизации с источниками конфигурации (например, репозиториев GIT & Helm), и автоматизация обновлений для конфигурации, когда есть новый код для развертывания.
Для кого поток?
Поток создан для:
- кластерные операторы Кто автоматизирует предоставление и конфигурацию кластеров
- Инженеры платформы кто строит непрерывную доставку для команд разработчиков
- Разработчики приложений кто полагается на постоянную доставку, чтобы получить свой код в прямом эфире
Что такое прогрессивная доставка?
Прогрессивная доставка является зонтичным термином для передовых моделей развертывания, таких как Canaries, Fult Flags и A/B -тестирование. Методы прогрессивной доставки используются для снижения риска введения новой версии программного обеспечения в производстве путем предоставления разработчикам приложений и командам SRE в мелкозернистый контроль над радиусом взрыва.
В этом семинаре вы будете использовать Флаггер Для управления канарейскими выпусками и A/B тестирование для ваших приложений.
Flagger автоматизирует процесс выпуска, используя маршрутизацию ISTIO для переключения трафика и метрики Прометея для Канарского анализа. Он поставляется с декларативной моделью для отделения развертывания приложений из процесса выпуска.
Предварительные условия
Вам понадобится кластер Kubernetes v1.16 или новее с LoadBalancer
поддерживать. В целях тестирования вы можете использовать Minikube с 2 процессорами и 4 ГБ памяти.
Установите поток
CLI с Homebrew:
brew install fluxcd/tap/flux
Двоичные файлы для MacOS AMD64/ARM64, Linux AMD64/ARM и Windows доступны для загрузки на Страница выпуска Flux2 .
Убедитесь, что ваш кластер удовлетворяет предпосылкам:
flux check --pre
Установить jq
и yq
С Homebrew:
brew install jq yq
Вилка gitops-istio Репозиторий и клонировать его:
git clone https://github.com//gitops-istio cd gitops-istio
Кластерная начальная загрузка
С Flux Bootstrap
Команда вы можете установить поток на кластере Kubernetes и настроить его для управления собой из репозитория GIT. Если компоненты потока присутствуют в кластере, команда Bootstrap при необходимости выполнит обновление.
Поток Bootstrap, указав URL -адрес github репозитория:
flux bootstrap git \ --author-email=\ --url=ssh://git@github.com/ /gitops-istio \ --branch=main \ --path=clusters/my-cluster
Приведенная выше команда требует SSH-Agent, если вы используете Windows, см. Flux Boostrap GitHub документация.
В Bootstrap Flux генерирует ключ SSH и печатает открытый ключ. Чтобы синхронизировать состояние кластера с GIT, вам нужно скопировать открытый ключ и создать ключ развертывания с доступом к записи в вашем репозитории GitHub. На GitHub перейти к Настройки> Развертывание ключей Нажмите на Добавить ключ развертывания , проверить Разрешить доступ к записи Вставьте общедоступный ключ Flux и нажмите Добавить ключ Анкет
Когда Flux имеет доступ к вашему репозитории, он сделает следующее:
- Устанавливает оператор ISTIO
- ждет, пока самолет управления ISTIO будет готов
- Устанавливает флаггер, Prometheus и Grafana
- Создает общественный шлюз Istio
- Создает
Prod
Пространство имен - Устанавливает демонстрационные приложения
При загрузке кластера с Istio важно определить порядок установки. Для инъекции приложений вводится шпильки ISTIO, плоскость управления ISTIO должна быть запущена и работает перед приложениями.
С Flux V2 вы можете указать порядок выполнения, определив зависимости между объектами. Например, в кластеры/my-cluster/apps.yaml Мы говорим Flux, что Приложения
Примирение зависит от Истио-система
один:
apiVersion: kustomize.toolkit.fluxcd.io/v1beta1 kind: Kustomization metadata: name: apps namespace: flux-system spec: interval: 30m0s dependsOn: - name: istio-system sourceRef: kind: GitRepository name: flux-system path: ./apps
Сначала смотрите Flux, установите ISTIO, затем демонстрационные приложения:
watch flux get kustomizations
Вы можете заверить журналы примирения Flux с:
flux logs --all-namespaces --follow --tail=10
Настройки и обновления ISTIO
Вы можете настроить установку ISTIO с помощью Истиоператор
Ресурс, расположенный в istio/system/profile.yaml :
apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: name: istio-default namespace: istio-system spec: profile: demo components: pilot: k8s: resources: requests: cpu: 10m memory: 100Mi
После изменения настроек ISTIO вы можете подтолкнуть изменение в GIT, и поток применит его на кластере. Оператор ISTIO будет перенастроить плоскость управления ISTIO в соответствии с вашими изменениями.
Когда доступна новая версия Istio, Обновление-ISTIO
GitHub Workflow Откроет запрос на тягу с манифестными обновлениями, необходимыми для обновления оператора ISTIO. Новая версия Istio тестируется на Kubernetes wind с помощью e2e
рабочий процесс И когда PR объединен в основную ветвь, Flux обновит ISTIO на вашем кластере.
Приложение начальная загрузка
Когда Flux синхронизирует репозиторий GIT с вашим кластером, он создает развертывание Frontend/Backend, HPA и Canary Object. Flagger использует Канарское определение для создания ряда объектов: развертывания Kubernetes, Clusterip Services, Istio Destination Rules и виртуальные сервисы. Эти объекты разоблачают приложение на сетке и управляют канарейским анализом и продвижением.
# applied by Flux deployment.apps/frontend horizontalpodautoscaler.autoscaling/frontend canary.flagger.app/frontend # generated by Flagger deployment.apps/frontend-primary horizontalpodautoscaler.autoscaling/frontend-primary service/frontend service/frontend-canary service/frontend-primary destinationrule.networking.istio.io/frontend-canary destinationrule.networking.istio.io/frontend-primary virtualservice.networking.istio.io/frontend
Проверьте, успешно ли флаггер инициализировал Канарские острова:
kubectl -n prod get canaries NAME STATUS WEIGHT backend Initialized 0 frontend Initialized 0
Когда Frontend-Primary
Развертывание приходит в Интернет, Flagger будет направлять весь трафик к основным стручкам и масштабировать, чтобы нулевать фронт
развертывание.
Найдите адрес шлюза Istio Ingress Gateway с:
kubectl -n istio-system get svc istio-ingressgateway -ojson | jq .status.loadBalancer.ingress
Откройте браузер и перейдите по адресу Ingress, вы увидите пользовательский интерфейс Frontend.
Канарские релизы
Flagger реализует цикл управления, который постепенно смещает трафик к канарейке, измеряя ключевые показатели производительности, такие как HTTP -запросы, показатель успеха, запрашивает среднюю продолжительность и здоровье POD. Основываясь на анализе KPI, канарейка продвигается или прервана, и результат анализа опубликован в Slack.
Канарский анализ запускается изменениями в любом из следующих объектов:
- Развертывание Podspec (изображение контейнера, команда, порты, эвина и т. Д.)
- Configmaps и секреты, установленные в виде объемов или отображаются с переменными среды
Для рабочих нагрузок, которые не получают постоянный флаггон трафика, можно настроить с помощью веб -крючка, когда при вызове запускают тест нагрузку для целевой рабочей нагрузки. Конфигурацию канарского происхождения можно найти в Приложения/Backend/Canary.yaml Анкет
Вытащите изменения от GitHub:
git pull origin main
Чтобы вызвать развертывание канарейки для приложения Backend, нажмите изображение контейнера:
yq e -i ./apps/backend/kustomization.yaml
Совершать и продвигать изменения:
git add -A && \ git commit -m "backend 5.0.1" && \ git push origin main
Обратите внимание, что Flux может обновить тег изображения контейнера автоматизированным образом, для получения более подробной информации см. Автоматизация обновлений изображений в GIT с Flux v2 Анкет
Скажите Flux, чтобы вытащить изменения или подождать одну минуту, пока Flux, чтобы обнаружить изменения самостоятельно:
flux reconcile source git flux-system
Смотрите Flux, примиряя ваш кластер с последним коммитом:
watch flux get kustomizations
Через пару секунд флаггер обнаруживает, что пересмотр развертывания изменился и начинает новое развертывание:
$ kubectl -n prod describe canary backend Events: New revision detected! Scaling up backend.prod Starting canary analysis for backend.prod Pre-rollout check conformance-test passed Advance backend.prod canary weight 5 ... Advance backend.prod canary weight 50 Copying backend.prod template spec to backend-primary.prod Promotion completed! Scaling down backend.prod
Во время анализа прогресс в Канарских островах можно контролировать с помощью Grafana. Вы можете получить доступ к панели панели с помощью пересылки портов:
kubectl -n istio-system port-forward svc/flagger-grafana 3000:80
URL -адрес приборной панели ISTIO — это http://localhost: 3000/d/flagger-istio/istio-canary? refresh = 10s & orgid = 1 & var-namespace = prod & var-primary = backend-primary & var-canary = backend
Анкет
Обратите внимание, что если новые изменения применяются к развертыванию во время канарского анализа, флаггер перезагрузит этап анализа.
A/B -тестирование
Помимо взвешенной маршрутизации, флаггер может быть настроен для маршрутизации трафика в канарейку в зависимости от условий соответствия HTTP. В сценарии A/B тестирование вы будете использовать HTTP -заголовки или файлы cookie для нацеливания на определенный сегмент ваших пользователей. Это особенно полезно для фронтальных приложений, которые требуют сродства сеанса.
Вы можете включить A/B -тестирование, указав условия соответствия HTTP и количество итераций:
analysis: # schedule interval (default 60s) interval: 10s # max number of failed metric checks before rollback threshold: 10 # total number of iterations iterations: 12 # canary match condition match: - headers: user-agent: regex: ".*Firefox.*" - headers: cookie: regex: "^(.*?;)?(type=insider)(;.*)?$"
Вышеуказанная конфигурация будет запущена в течение двух минут, нацеленных на пользователей Firefox и тех, у кого есть инсайдерский файл cookie. Конфигурацию фронта можно найти в Приложения/Frontend/Canary.yaml Анкет
Запустите развертывание, обновив изображение контейнера Frontend:
yq e -i ./apps/frontend/kustomization.yaml git add -A && \ git commit -m "frontend 5.0.1" && \ git push origin main flux reconcile source git flux-system
Флаггер обнаруживает, что пересмотр развертывания изменился и запускает A/B -тестирование:
$ kubectl -n istio-system logs deploy/flagger -f | jq .msg New revision detected! Scaling up frontend.prod Waiting for frontend.prod rollout to finish: 0 of 1 updated replicas are available Pre-rollout check conformance-test passed Advance frontend.prod canary iteration 1/10 ... Advance frontend.prod canary iteration 10/10 Copying frontend.prod template spec to frontend-primary.prod Waiting for frontend-primary.prod rollout to finish: 1 of 2 updated replicas are available Promotion completed! Scaling down frontend.prod
Вы можете следить за всеми канарцами с:
$ watch kubectl get canaries --all-namespaces NAMESPACE NAME STATUS WEIGHT prod frontend Progressing 100 prod backend Succeeded 0
Откат на основе метрик ISTIO
Flagger использует метрики, предоставленные iStio Telemetry для проверки рабочей нагрузки Канарского. Приложение Frontend Анализ Определяет две метрические проверки:
metrics: - name: error-rate templateRef: name: error-rate namespace: istio-system thresholdRange: max: 1 interval: 30s - name: latency templateRef: name: latency namespace: istio-system thresholdRange: max: 500 interval: 30s
Запросы Прометея, используемые для проверки частоты ошибок и задержки, расположены по адресу flagger-metrics.yaml Анкет
Во время канарского анализа вы можете генерировать ошибки HTTP 500 и высокую задержку для тестирования отката флаггера.
Генерировать ошибки HTTP 500:
watch curl -b 'type=insider' http:///status/500
Генерировать задержку:
watch curl -b 'type=insider' http:///delay/1
Когда количество неудачных проверок достигает порога канарского анализа, трафик направляется обратно на первичную, канарейку масштабируется до нуля, а развертывание помечается как неудачный.
$ kubectl -n istio-system logs deploy/flagger -f | jq .msg New revision detected! Scaling up frontend.prod Pre-rollout check conformance-test passed Advance frontend.prod canary iteration 1/10 Halt frontend.prod advancement error-rate 31 > 1 Halt frontend.prod advancement latency 2000 > 500 ... Rolling back frontend.prod failed checks threshold reached 10 Canary failed! Scaling down frontend.prod
Вы можете расширить анализ с помощью пользовательских показателей метрических проверок Прометей , DataDog и Amazon CloudWatch Анкет
Для настройки предупреждения о канарейском анализе для Slack, MS Teams, Discord или Rocket см. Документы Анкет
Получать помощь
Если у вас есть какие -либо вопросы о прогрессивной доставке:
- Пригласить себя в CNCF Community Slack и присоединяйтесь к #flux и #flager каналы.
- Проверьте Раздел переговоров по потоку и увидеть список онлайн-разговоров, практических тренировок и встреч.
Ваши отзывы всегда приветствуются!
Оригинал: «https://dev.to/stefanprodan/a-gitops-recipe-for-progressive-delivery-2pa3»