Рубрики
Uncategorized

Рецепт Gitops для прогрессивной доставки с ISTIO

Это руководство, в котором вы получите практический опыт работы с Gitops и прогрессивной доставкой, используя Kub … Tagged с DevOps, тестирование, Kubernetes, Istio.

Это руководство, в котором вы получите практический опыт работы с 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 см. Документы Анкет

Получать помощь

Если у вас есть какие -либо вопросы о прогрессивной доставке:

Ваши отзывы всегда приветствуются!

Оригинал: «https://dev.to/stefanprodan/a-gitops-recipe-for-progressive-delivery-2pa3»