Argo-rollouts#

Argo-rollouts — Kubernetes-контроллер и набор CRD, предоставляющий продвинутые возможности для реализации постепенной доставки (progressive delivery) приложений в кластере. Он позволяет более гибко управлять процессом развертывания, обеспечивая безопасное и контролируемое обновление сервисов.

Основные задачи и возможности
  • Поддержка стратегий развертывания: Позволяет использовать такие методы как canary (канареечный), blue-green (сине-зеленое) развертывание, а также A/B тестирование и эксперименты с трафиком.

  • Канареечный анализ и автоматизация: Поддерживает автоматический анализ состояния новых версий приложений на основе метрик (например, из Prometheus), позволяя либо продолжить, либо откатить обновление в случае проблем.

  • Гибкая маршрутизация трафика: Интегрируется с Istio, Linkerd, Kong и другими service mesh или ingress-решениями для постепенного переключения трафика между версиями приложения.

  • Интеграция с GitOps-подходом: Может использоваться вместе с Argocd, что позволяет объединить управление конфигурацией и стратегией развертывания в едином декларативном процессе.

  • Визуализация и мониторинг: Предоставляет удобный веб-интерфейс для отслеживания статуса развертывания, анализа ошибок и выполнения.

Примечание

Argo-rollouts является инструментом по умолчанию в составе «Devops» и устанавливается с ним автоматически.

Конфигурация values#

Значения можно переопределить через редактирование инструмента с именем argo-rollouts и указанием нужных values в spec.values. Общее описание конфигурации values для инструментов описано в разделе «Конфигурации инструментов дополнительных компонентов».

installCRDs – установка и обновление Custom Resource Definition#

Параметр

Описание

Значение по умолчанию

installCRDs

Установка и обновление CRD при установке или обновлении чарта

true

keepCRDs – сохранение CRD при удалении#

Параметр

Описание

Значение по умолчанию

keepCRDs

Сохранение CRD при удалении Helm-релиза

true

clusterInstall – режим установки контроллера#

Параметр

Описание

Значение по умолчанию

clusterInstall

При значении false запускает контроллер в режиме пространства имен (не требует cluster RBAC)

true

createClusterAggregateRoles – создание агрегированных ролей#

Параметр

Описание

Значение по умолчанию

createClusterAggregateRoles

Создание агрегированных ClusterRole (требует cluster RBAC)

true

nameOverride – переопределение имени чарта#

Параметр

Описание

Значение по умолчанию

nameOverride

Переопределение базового имени ресурсов чарта

~

fullnameOverride – полное переопределение имени чарта#

Параметр

Описание

Значение по умолчанию

fullnameOverride

Полное переопределение имени для всех создаваемых ресурсов

~

namespaceOverride – переопределение пространства имен#

Параметр

Описание

Значение по умолчанию

namespaceOverride

Переопределение пространства имен

""

apiVersionOverrides – переопределение версий API#

Параметр

Описание

Значение по умолчанию

apiVersionOverrides.ingress

Переопределение apiVersion для Ingress-ресурсов

""

kubeVersionOverride – переопределение версии Kubernetes#

Параметр

Описание

Значение по умолчанию

kubeVersionOverride

Переопределение версии Kubernetes, используемой при вычислении условных манифестов чарта

""

extraObjects – дополнительные объекты Helm-чарта#

Параметр

Описание

Значение по умолчанию

extraObjects

Добавление дополнительных динамических объектов в Helm-чарте.
Пример конфигурации:

- apiVersion: v1
  kind: Secret
  metadata:
    name: datadog
  type: Opaque
  data:
    address: https://api.datadoghq.com
    api-key: <datadog-api-key>
    app-key: <datadog-app-key>

[]

controller – настройки контроллера#

Параметр

Описание

Значение по умолчанию

controller.component

Значение метки app.kubernetes.io/component для контроллера

rollouts-controller

controller.deploymentAnnotations

Дополнительные аннотации для Deployment контроллера

{}

controller.deploymentLabels

Дополнительные метки для Deployment контроллера

{}

controller.podAnnotations

Дополнительные аннотации для pod контроллера

{}

controller.podLabels

Дополнительные метки для pod контроллера

{}

controller.nodeSelector

Селектор узлов для планирования pod

{}

controller.tolerations

Toleration для размещения pod на узлах с ограничениями (taints)

[]

controller.affinity

Настройки правила привязки (affinity и anti-affinity) pod к узлам

{}

controller.logging.level

Уровень логирования контроллера.
Возможные значения: debug, info, warn, error

info

controller.logging.kloglevel

Уровень klog-логирования для контроллера

"0"

controller.logging.format

Формат логов контроллера.
Возможные значения: text, json

"text"

controller.topologySpreadConstraints

Ограничения топологии для равномерного распределения pod по зонам доступности и узлам.
Пример конфигурации:

- maxSkew: 1
  topologyKey: topology.kubernetes.io/zone
  whenUnsatisfiable: DoNotSchedule

[]

controller.terminationGracePeriodSeconds

Время, отведенное на корректное завершение работы pod

30

controller.lifecycle

Параметры lifecycle для контейнера контроллера

{}

controller.priorityClassName

Имя PriorityClass для pod

""

controller.replicas

Количество реплик pod; при значении 1 выключается выбор лидера (leader election)

2

controller.image.registry

Реестр контейнерного образа контроллера

'{{ .Values.global.image.registry }}'

controller.image.repository

Репозиторий контейнерного образа контроллера

'{{ .Values.global.image.repository }}/{{ .Values.global.dappVersion }}/dapp-argo-rollouts/argo-rollouts'

controller.image.tag

Тег образа контейнера контроллера

"v1.9.0"

controller.image.pullPolicy

Политика загрузки контейнерного образа контроллера

IfNotPresent

controller.awsVerifyTargetGroup

Проверка AWS-целевой группы перед прохождением шагов (требует прав AWS)

false

controller.awsTargetGroupBindingAPIVersion

Версия API AWS TargetGroupBinding (например, elbv2.k8s.aws/v1beta1 для стандартного EKS, eks.amazonaws.com/v1 для EKS Auto Mode)

""

controller.albTagKeyResourceID

Ключ тега ALB для идентификатора ресурса (например, ingress.k8s.aws/resource для стандартного EKS, ingress.eks.amazonaws.com для EKS Auto Mode)

""

controller.selfServiceNotification

Поддержка уведомлений в режиме самообслуживания, позволяющая контроллеру получать конфигурацию уведомлений из пространства имен развертывания

false

controller.pprofAddress

Включение pprof-профилирования на контроллере путем указания адреса прослушивания (например, :6060 или localhost:6060)

""

controller.extraArgs

Дополнительные аргументы командной строки для контроллера развертываний

[]

controller.extraEnv

Дополнительные переменные окружения для контроллера развертываний.
Пример конфигурации:

- name: AWS_REGION
  value: us-east-1

[]

controller.extraContainers

Дополнительные контейнеры для pod контроллера

[]

controller.initContainers

Список init-контейнеров, запускаемых перед основными.
Пример конфигурации:

- name: download-tools
  image: alpine:3.8
  command: [sh, -c]
  args:
    -  ls

[]

controller.resources

Запросы и ограничения ресурсов для pod.
Пример конфигурации:

limits:
  cpu: 100m
  memory: 128Mi
  ephemeral-storage: 1Gi
requests:
  cpu: 50m
  memory: 64Mi

{}

controller.createClusterRole

Создание ClusterRole для контроллера (требует cluster RBAC)

true

controller.containerPorts.metrics

Порт контейнера для экспорта метрик

8090

controller.containerPorts.healthz

Порт контейнера для healthz

8080

controller.metrics.enabled

Создание Service метрик для контроллера

true

controller.metrics.service.portName

Имя порта для Service метрик

metrics

controller.metrics.service.port

Порт Service метрик

8090

controller.metrics.service.annotations

Аннотации Service метрик контроллера

{}

controller.metrics.service.labels

Метки Service метрик контроллера

{}

controller.metrics.serviceMonitor.enabled

Создание ServiceMonitor Prometheus для контроллера

false

controller.metrics.serviceMonitor.namespace

Пространство имен ServiceMonitor

""

controller.metrics.serviceMonitor.additionalLabels

Дополнительные метки для ServiceMonitor

{}

controller.metrics.serviceMonitor.relabelings

Правила фильтрации и преобразования меток, применяемые к целям сбора до начала сбора метрик в ServiceMonitor

[]

controller.metrics.serviceMonitor.metricRelabelings

Правила фильтрации и преобразования меток, применяемые к собранным метрикам в ServiceMonitor

[]

controller.metrics.serviceMonitor.tlsConfig

TLS-конфигурация ServiceMonitor, при заполнении используется схема https.
Пример конфигурации:

caFile: /etc/istio-certs/root-cert.pem
certFile: /etc/istio-certs/cert-chain.pem
insecureSkipVerify: true
keyFile: /etc/istio-certs/key.pem

{}

controller.livenessProbe.httpGet.path

Путь HTTP для проверки работоспособности контейнера контроллера

/healthz

controller.livenessProbe.httpGet.port

Порт HTTP для проверки работоспособности контейнера контроллера

healthz

controller.livenessProbe.initialDelaySeconds

Задержка перед первой проверкой работоспособности контейнера контроллера в секундах

30

controller.livenessProbe.periodSeconds

Период проверки работоспособности контейнера контроллера в секундах

20

controller.livenessProbe.failureThreshold

Количество неудачных попыток проверки работоспособности контейнера контроллера

3

controller.livenessProbe.successThreshold

Количество успешных проверок для подтверждения работоспособности контейнера контроллера

1

controller.livenessProbe.timeoutSeconds

Тайм-аут проверки работоспособности контейнера контроллера

10

controller.readinessProbe.httpGet.path

Путь HTTP для проверки готовности контейнера контроллера

/metrics

controller.readinessProbe.httpGet.port

Порт HTTP для проверки готовности контейнера контроллера

metrics

controller.readinessProbe.initialDelaySeconds

Задержка перед первой проверкой готовности контейнера контроллера в секундах

15

controller.readinessProbe.periodSeconds

Период проверки готовности контейнера контроллера в секундах

5

controller.readinessProbe.failureThreshold

Количество неудачных попыток до перевода контейнера контроллера в статус NotReady

3

controller.readinessProbe.successThreshold

Количество успешных попыток для подтверждения готовности контейнера контроллера

1

controller.readinessProbe.timeoutSeconds

Тайм-аут проверки готовности контейнера контроллера в секундах

4

controller.pdb.enabled

Создание PodDisruptionBudget для контроллера

false

controller.pdb.labels

Метки для PodDisruptionBudget контроллера

{}

controller.pdb.annotations

Аннотации для PodDisruptionBudget контроллера

{}

controller.pdb.minAvailable

Минимальное количество или процент pod, которые должны оставаться доступными

~

controller.pdb.maxUnavailable

Максимальное количество или процент pod, которые могут быть недоступны одновременно

~

controller.volumes

Дополнительные тома (Volume) для pod контроллера

[]

controller.volumeMounts

Дополнительные точки монтирования томов (VolumeMount) для основного контейнера контроллера

[]

controller.metricProviderPlugins

Плагины сторонних провайдеров метрик для контроллера.
Пример конфигурации:

- name: "argoproj-labs/sample-prometheus"
  location: "file://./my-custom-plugin"

[]

controller.stepPlugins

Сторонние плагины для настройки шагов в canary-стратегиях развертывания.
Пример конфигурации:

- name: "argoproj-labs/step-exec"
  location: "file://./my-custom-plugin"

[]

controller.trafficRouterPlugins

Настройка плагинов маршрутизации стороннего трафика для контроллера.
Пример конфигурации:

- name: "argoproj-labs/sample-nginx"
  location: "file://./my-custom-plugin"

[]

controller.createConfigmap

Автоматическое создание ConfigMap argo-rollouts-config. Может быть отключено при запуске нескольких экземпляров контроллера в одном пространстве имен для избежания конфликтов владения между Helm-чартами

true

serviceAccount – настройки сервисного аккаунта#

Параметр

Описание

Значение по умолчанию

serviceAccount.create

Создание нового ServiceAccount; при значении false в serviceAccount.name указывается существующий

true

serviceAccount.annotations

Дополнительные аннотации для ServiceAccount

{}

serviceAccount.name

Имя ServiceAccount; при пустом значении и create: true имя генерируется автоматически

""

crdAnnotations – аннотации для CRD#

Параметр

Описание

Значение по умолчанию

crdAnnotations

Аннотации, добавляемые ко всем CRD

{}

podAnnotations – аннотации pod#

Параметр

Описание

Значение по умолчанию

podAnnotations

Аннотации для всех развертываемых pod

{}

podSecurityContext – параметры контекста безопасности pod#

Параметр

Описание

Значение по умолчанию

podSecurityContext.runAsNonRoot

Запуск pod от имени пользователя без административных полномочий

true

containerSecurityContext – параметры контекста безопасности контейнера#

Параметр

Описание

Значение по умолчанию

containerSecurityContext.allowPrivilegeEscalation

Разрешение повышения привилегий в контейнере

false

containerSecurityContext.capabilities.drop

Список capabilities для удаления

- ALL

containerSecurityContext.readOnlyRootFilesystem

Монтирование корневой файловой системы в режиме «только для чтения»

true

containerSecurityContext.seccompProfile.type

Профиль seccomp для контейнера

RuntimeDefault

serviceAnnotations – аннотации Service#

Параметр

Описание

Значение по умолчанию

serviceAnnotations

Дополнительные аннотации для Service развертывания

{}

podLabels – метки pod#

Параметр

Описание

Значение по умолчанию

podLabels

Метки для pod

{}

imagePullSecrets – Secret для загрузки образов#

Параметр

Описание

Значение по умолчанию

imagePullSecrets

Список Secret для загрузки образа контейнера из приватных реестров.
Пример конфигурации:

- name: argo-pull-secret

[]

providerRBAC – RBAC-правила для провайдеров#

Параметр

Описание

Значение по умолчанию

providerRBAC.enabled

Включение добавления специфических RBAC-правил для провайдера в Role и ClusterRole контроллера

true

providerRBAC.providers.istio

Добавление RBAC-правил для провайдера Istio

true

providerRBAC.providers.smi

Добавление RBAC-правил для провайдера SMI

true

providerRBAC.providers.ambassador

Добавление RBAC-правил для провайдера Ambassador

true

providerRBAC.providers.awsLoadBalancerController

Добавление RBAC-правил для AWS Load Balancer Controller

true

providerRBAC.providers.awsAppMesh

Добавление RBAC-правил для AWS App Mesh

true

providerRBAC.providers.traefik

Добавление RBAC-правил для провайдера Traefik

true

providerRBAC.providers.apisix

Добавление RBAC-правил для провайдера Apisix

true

providerRBAC.providers.contour

Добавление RBAC-правил для провайдера Contour

true

providerRBAC.providers.glooPlatform

Добавление RBAC-правил для провайдера Gloo Platform

true

providerRBAC.providers.gatewayAPI

Добавление RBAC-правил для провайдера Gateway API

true

providerRBAC.additionalRules

Дополнительные RBAC-правила для прочих провайдеров

[]

dashboard – настройки дашборда сервера#

Параметр

Описание

Значение по умолчанию

dashboard.enabled

Включение развертывания дашборда сервера

false

dashboard.readonly

Перевод дашборда в режим «только для чтения»

false

dashboard.component

Значение метки app.kubernetes.io/component для дашборда

rollouts-dashboard

dashboard.deploymentAnnotations

Дополнительные аннотации для Deployment дашборда

{}

dashboard.deploymentLabels

Дополнительные метки для Deployment дашборда

{}

dashboard.podAnnotations

Дополнительные аннотации для pod дашборда

{}

dashboard.podLabels

Дополнительные метки для pod дашборда

{}

dashboard.nodeSelector

Метки узлов для размещения pod дашборда

{}

dashboard.tolerations

Tolerations для размещения pod дашборда на узлах с ограничениями

[]

dashboard.affinity

Правила для размещения pod дашборда

{}

dashboard.logging.level

Уровень логирования дашборда.
Возможные значения: debug, info, warn, error

info

dashboard.logging.kloglevel

Уровень klog-логирования для дашборда

"0"

dashboard.topologySpreadConstraints

Ограничения топологии для равномерного распределения pod по зонам доступности и узлам.
Пример конфигурации:

- maxSkew: 1
  topologyKey: topology.kubernetes.io/zone
  whenUnsatisfiable: DoNotSchedule

[]

dashboard.priorityClassName

Имя PriorityClass для pod дашборда

""

dashboard.createClusterRole

Создание ClusterRole для дашборда (требует cluster RBAC)

true

dashboard.replicas

Количество реплик pod дашборда

1

dashboard.image.registry

Реестр контейнерного образа дашборда

quay.io

dashboard.image.repository

Репозиторий контейнерного образа дашборда

argoproj/kubectl-argo-rollouts

dashboard.image.tag

Тег образа контейнера дашборда. Если параметр не задан, используется чарт appVersion

""

dashboard.image.pullPolicy

Политика загрузки контейнерного образа дашборда

IfNotPresent

dashboard.rootPath

Корневой путь дашборда (например, /rollouts). Используется при размещении за обратным прокси с префиксом пути

""

dashboard.extraArgs

Дополнительные аргументы командной строки для дашборда

[]

dashboard.extraEnv

Дополнительные переменные окружения для дашборда.
Пример конфигурации:

- name: FOO
  value: "bar"

[]

dashboard.resources

Запросы и ограничения ресурсов для pod.
Пример конфигурации:

limits:
  cpu: 500m
  memory: 512Mi
requests:
  cpu: 250m
  memory: 256Mi

{}

dashboard.podSecurityContext.runAsNonRoot

Запуск pod дашборда от имени пользователя без административных полномочий

true

dashboard.containerSecurityContext

Контекст безопасности контейнера дашборда

{}

dashboard.service.type

Тип Service для дашборда.
Возможные значения: ClusterIP, NodePort, LoadBalancer, ExternalName

ClusterIP

dashboard.service.loadBalancerClass

Класс балансировщика нагрузки для Service типа LoadBalancer

""

dashboard.service.loadBalancerIP

Статический IP-адрес для Service типа LoadBalancer

""

dashboard.service.loadBalancerSourceRanges

Список CIDR-диапазонов, которым разрешен доступ к Service

[]

dashboard.service.externalIPs

Список внешних IP-адресов Service дашборда

[]

dashboard.service.annotations

Дополнительные аннотации для Service дашборда

{}

dashboard.service.labels

Дополнительные метки для Service дашборда

{}

dashboard.service.portName

Имя порта Service дашборда

dashboard

dashboard.service.port

Порт Service дашборда

3100

dashboard.service.targetPort

Целевой порт контейнера для Service дашборда

3100

dashboard.service.nodePort

Фиксированный NodePort для Service при service.type: NodePort

~

dashboard.serviceAccount.create

Создание нового ServiceAccount; при значении false в serviceAccount.name указывается существующий

true

dashboard.serviceAccount.annotations

Дополнительные аннотации для ServiceAccount

{}

dashboard.serviceAccount.name

Имя ServiceAccount; при пустом значении и create: true имя генерируется автоматически

""

dashboard.pdb.labels

Метки для PodDisruptionBudget дашборда

{}

dashboard.pdb.annotations

Аннотации для PodDisruptionBudget дашборда

{}

dashboard.pdb.enabled

Создание PodDisruptionBudget для дашборда

false

dashboard.pdb.minAvailable

Минимальное количество или процент pod дашборда, которые должны оставаться доступными

~

dashboard.pdb.maxUnavailable

Максимальное количество или процент pod дашборда, которые могут быть недоступны одновременно

~

dashboard.ingress.enabled

Включение Ingress-контроллера для публикации дашборда

true

dashboard.ingress.annotations

Аннотации для Ingress-контроллера.
Пример конфигурации:

annotations:
  kubernetes.io/ingress.class: "nginx"
  nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
  nginx.ingress.kubernetes.io/ssl-redirect: "true"

{}

dashboard.ingress.labels

Дополнительные метки для метаданных Ingress

{}

dashboard.ingress.ingressClassName

Класс Ingress.

nginx

dashboard.ingress.hosts

Основной хост для ресурсов Ingress дашборда

- 'argorollouts.{{ include "ingress.domain" . }}'

dashboard.ingress.paths

Список путей Ingress дашборда

- /

dashboard.ingress.pathType

Тип пути Ingress.

Prefix

dashboard.ingress.extraPaths

Дополнительные пути для Ingress дашборда.
Пример конфигурации:

- path: /*
  backend:
    serviceName: ssl-redirect
    servicePort: use-annotation

[]

dashboard.ingress.tls

Включение TLS-конфигурации для Ingress дашборда

- secretName: ingress-tls
  hosts:
    - 'argorollouts.{{ include "ingress.domain" . }}'

dashboard.httproute.enabled

Включение ресурса HTTPRoute для дашборда (Gateway API)

false

dashboard.httproute.labels

Дополнительные метки для HTTPRoute

{}

dashboard.httproute.annotations

Дополнительные аннотации для HTTPRoute

{}

dashboard.httproute.parentRefs

Ссылки на родительские Gateway для HTTPRoute.
Пример конфигурации:

- name: example-gateway
  namespace: example-gateway-namespace
  sectionName: https

[]

dashboard.httproute.hostnames

Список имен хостов для HTTPRoute.
Пример конфигурации:

- argorollouts.example.com

[]

dashboard.httproute.rules

Правила HTTPRoute.
Пример конфигурации:

   filters: []
     - type: RequestHeaderModifier
       requestHeaderModifier:
         add:
           - name: X-Custom-Header
             value: custom-value
   timeouts: {}
- matches:
    - path:
        type: PathPrefix
        value: /

dashboard.volumes

Дополнительные тома (Volume) для pod дашборда.
Пример конфигурации:

volumes:
  - name: ""
    configMap:
      name: ""
  - name: ""
    emptyDir: {}

[]

dashboard.volumeMounts

Дополнительные точки монтирования томов (VolumeMount) для основного контейнера дашборда

[]

notifications – настройки уведомлений#

Параметр

Описание

Значение по умолчанию

notifications.configmap.create

Создание ConfigMap для уведомлений

true

notifications.secret.create

Создание Secret для уведомлений. При ручном создании необходимо добавить корректную метку app.kubernetes.io/component

false

notifications.secret.items

Пары «ключ-значение» для вставки в Secret уведомлений.
Пример конфигурации:

slack-token:

{}

notifications.secret.annotations

Дополнительные аннотации для Secret уведомлений

{}

notifications.notifiers

Настройка служб уведомлений.
Пример конфигурации:

service.slack: |
  token: $slack-token

{}

notifications.templates

Шаблоны уведомлений.
Пример конфигурации:

template.my-purple-template: |
  message: |
    Rollout {{.rollout.metadata.name}} has purple image
  slack:
      attachments: |
          [{
            "title": "{{ .rollout.metadata.name}}",
            "color": "#800080"
          }]

{}

notifications.triggers

Триггеры, определяющие условия отправки уведомлений.
Пример конфигурации:

trigger.on-purple: |
  - send: [my-purple-template]
    when: rollout.spec.template.spec.containers[0].image == 'argoproj/rollouts-demo:purple'

{}

notifications.subscriptions

Подписки на триггеры общим способом для всех развертываний.
Пример конфигурации:

- recipients:
  - slack:<channel>
  triggers:
  - on-rollout-completed
  - on-rollout-aborted

[]