Модуль operator-argo разворачивает Argo CD Operator в кластере Deckhouse Kubernetes Platform (DKP). Модуль позволяет установить Argo CD в кластере DKP с помощью ресурса ArgoCD.

Модуль работает со следующими кастомными ресурсами:

  • Application — описание развёртывания приложений и управление ими;
  • ApplicationSet — шаблонизация и массовое создание приложений по определённым правилам;
  • AppProject — определение набора приложений и политик доступа к приложениям;
  • ArgoCD — основной ресурс для развёртывания и настройки экземпляра Argo CD;
  • ArgoCDExport — экспорт настроек и состояния Argo CD для резервного копирования или миграции;
  • ImageUpdater — автоматическое обновление образов контейнеров приложений;
  • NamespaceManagement — определение правил управления неймспейсами для экземпляра Argo CD;
  • NotificationsConfiguration — определение параметров уведомлений о событиях в Argo CD и приложениях.

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

Архитектура модуля

Для упрощения схемы приняты следующие допущения:

  • На схеме показано, что контейнеры разных подов взаимодействуют друг с другом напрямую. Фактически они взаимодействуют через соответствующие сервисы Kubernetes (внутренние балансировщики). Названия сервисов не указываются, если они очевидны из контекста. В остальных случаях название сервиса указано над стрелкой.
  • Поды могут быть запущены в нескольких репликах, однако на схеме все поды изображены в одной реплике.
  • На схеме изображены только основные контейнеры каждого компонента.

Архитектура модуля operator-argo на уровне 2 модели C4 и его взаимодействие с другими компонентами DKP изображены на следующих диаграммах:

  • Основной оператор модуля:

    Архитектура оператора модуля operator-argo

  • Вариант развёртывания экземпляра Argo CD с базой данных Redis в неотказоустойчивой конфигурации:

    Архитектура модуля operator-argo с Redis non-HA

  • Вариант развёртывания экземпляра Argo CD с отказоустойчивой конфигурацией Redis (на диаграмме отражены только отличия от основного варианта развёртывания):

    Архитектура модуля operator-argo с Redis HA

  • Вариант развёртывания экземпляра Argo CD в управляющем кластере в мультикластерной конфигурации (на диаграмме отражены только отличия от основного варианта развёртывания):

    Архитектура модуля operator-argo с Principal

Компоненты модуля

Модуль состоит из следующих компонентов:

  1. Argocd-operator-controller-manager (Deployment) — реализация Argo CD Operator, позволяющая разворачивать экземпляры Argo CD в кластере DKP. Компонент работает со следующими кастомными ресурсами:
    • ArgoCD — основной ресурс для развёртывания и настройки экземпляра Argo CD;
    • ArgoCDExport — экспорт настроек и состояния Argo CD для резервного копирования или миграции. Оператор читает кастомный ресурс ArgoCDExport и создаёт Job/CronJob с именем, совпадающим с именем ресурса ArgoCDExport. Созданный Job/CronJob выполняет резервное копирование настроек экземпляра Argo CD;
    • NamespaceManagement — определение правил управления неймспейсами для экземпляра Argo CD. Оператор следит за кастомным ресурсом NamespaceManagement и соответствующим образом обновляет ConfigMap argocd-cmd-params-cm;
    • NotificationsConfiguration — определение параметров уведомлений о событиях в Argo CD и приложениях. Оператор читает кастомные ресурсы NotificationsConfiguration и на основе них обновляет конфигурацию в ConfigMap argocd-notifications-cm.

    Argocd-operator-controller-manager создаёт ресурсы Deployment, Secret, ConfigMap, StatefulSet и другие для каждого кастомного ресурса ArgoCD, добавляя имя этого ресурса в качестве префикса для создаваемых ресурсов.

    Состоит из следующих контейнеров:

    • manager — основной контейнер;
    • kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищённого доступа к метрикам manager.

    Следующие компоненты описывают ресурсы, которые создаёт argocd-operator-controller-manager на основе конфигурации, заданной в кастомном ресурсе ArgoCD. Для описания используется префикс <ArgoCD name>, который будет заменяться контроллером на имя ресурса ArgoCD.

  2. <ArgoCD name>-server (Deployment) — argocd-server, основной компонент взаимодействия с экземпляром Argo CD. Argocd-server предоставляет REST/gRPC API и пользовательский веб-интерфейс для управления Argo CD. Компонент позволяет управлять кастомными ресурсами Application, ApplicationSet и AppProject через предоставляемые интерфейсы (веб, API, CLI).

    Оператор создаёт компонент, если в параметре .spec.server.enabled кастомного ресурса ArgoCD задано значение true (значение по умолчанию — true).

    Состоит из следующих контейнеров:

    • argocd-server-init — опциональный набор init-контейнеров, задаваемых пользователем в параметре .spec.server.initContainers кастомного ресурса ArgoCD;
    • rollout-extension — опциональный init-контейнер, загружающий расширение UI для работы с кастомным ресурсом Rollout. Модуль не предоставляет контроллер, обрабатывающий этот кастомный ресурс. Контроллер должен быть установлен и настроен отдельно. Argocd-operator-controller-manager добавляет rollout-extension, если значение параметра .spec.server.enableRolloutsUI принимает значение true;
    • argocd-server — основной контейнер;
    • argocd-server-sidecar — опциональный набор сайдкар-контейнеров, задаваемых пользователем в параметре .spec.server.sidecarContainers кастомного ресурса ArgoCD.
  3. <ArgoCD name>-repo-server (Deployment) — argocd-repo-server, компонент, отвечающий за обработку шаблонов, генерацию манифестов приложений и работу с внешними репозиториями, используемыми в Argo CD. Argocd-repo-server отвечает за синхронизацию манифестов приложений из указанных репозиториев и передачу их в соответствующие компоненты для последующего развёртывания.

    Оператор создаёт компонент, если в параметре .spec.repo.enabled кастомного ресурса ArgoCD задано значение true (значение по умолчанию — true).

    Состоит из следующих контейнеров:

    • copyutil — init-контейнер, копирующий исполняемые файлы для использования из основного контейнера;
    • argocd-repo-server-init — опциональный набор init-контейнеров, настраиваемых через параметр .spec.repo.initContainers кастомного ресурса ArgoCD для подготовки окружения;
    • argocd-repo-server — основной контейнер, выполняющий операции по генерации и обработке манифестов, а также работу с удалёнными Git-репозиториями приложений;
    • argocd-repo-server-sidecar — опциональный набор сайдкар-контейнеров, задаваемых пользователем в параметре .spec.repo.sidecarContainers кастомного ресурса ArgoCD и позволяющих расширять функциональность repo-server.
  4. <ArgoCD name>-application-controller (StatefulSet) — argocd-application-controller, компонент, отвечающий за синхронизацию и управление состоянием приложений, определённых в Argo CD. Argocd-application-controller обеспечивает идемпотентное применение манифестов Kubernetes, управление процессом развёртывания, отката, автоматического восстановления, а также отслеживание состояния ресурсов в кластере.

    Оператор создаёт компонент, если в параметре .spec.controller.enabled кастомного ресурса ArgoCD задано значение true (значение по умолчанию — true).

    Состоит из следующих контейнеров:

    • application-controller-init — опциональный набор init-контейнеров, настраиваемых через параметр .spec.controller.initContainers кастомного ресурса ArgoCD для подготовки окружения;
    • argocd-application-controller — основной контейнер, реализующий логику синхронизации кастомных ресурсов Application и создаваемых на их основе ресурсов;
    • application-controller-sidecar — опциональный набор сайдкар-контейнеров, задаваемых пользователем в параметре .spec.controller.sidecarContainers кастомного ресурса ArgoCD, которые позволяют расширить стандартные возможности контроллера.
  5. <ArgoCD name>-applicationset-controller (Deployment) — argocd-applicationset-controller, опциональный компонент, состоящий из одного контейнера applicationset-controller и отвечающий за управление кастомным ресурсом ApplicationSet в Argo CD. Он позволяет автоматически создавать, обновлять или удалять ресурсы Application на основе заданных шаблонов и генераторов (например, генераторов Git, List, Matrix и Cluster). Это облегчает массовое управление похожими приложениями, которые должны быть развёрнуты в различных окружениях или кластерах.

    Оператор создаёт компонент, если в параметре .spec.applicationSet.enabled кастомного ресурса ArgoCD задано значение true (значение по умолчанию — true).

    Более подробную информацию о компоненте можно найти в документации applicationset-controller.

  6. <ArgoCD name>-argocd-image-updater-controller (Deployment) — argocd-image-updater-controller, опциональный компонент, состоящий из одного контейнера argocd-image-updater и предназначенный для автоматического обновления образов контейнеров в приложениях Argo CD при появлении новых версий в хранилищах образов. Компонент отслеживает изменения тегов образов и при обнаружении новой версии обновляет соответствующие ресурсы Application в Argo CD (например, значения тегов образов в манифестах или Helm values) через запрос на слияние (pull request) в Git-репозиторий либо напрямую, в зависимости от выбранного способа работы.

    Argocd-image-updater-controller выполняет следующие функции:

    • управляет кастомным ресурсом ImageUpdater, описывающим параметры для автоматического обновления образов контейнеров приложений;
    • периодически проверяет указанные в приложениях образы контейнеров в поддерживаемых реестрах (Docker Hub, Quay.io, Harbor и др.);
    • поддерживает фильтрацию тегов образов по шаблонам и стратегиям обновления (semver, latest и др.);
    • при обнаружении новой версии образа автоматически выполняет write-back (то есть записывает новое значение тега образа) в Argo CD Application или в Git-репозиторий в зависимости от настроенного метода.

    Для корректной работы компоненту требуются права доступа к Git-репозиториям и, при необходимости, к приватным хранилищам образов. Учётные данные для доступа к хранилищам образов можно хранить в секретах Kubernetes.

    Для включения компонента необходимо задать в параметре .spec.imageUpdater.enabled кастомного ресурса ArgoCD значение true.

    Более подробную информацию о компоненте можно найти в документации argocd-image-updater.

  7. <ArgoCD name>-notifications-controller (Deployment) — опциональный контроллер, состоящий из одного контейнера argocd-notifications-controller и реализующий отправку уведомлений о событиях в Argo CD (например, об успешной синхронизации приложения, ошибках развёртывания, изменениях статуса и др.) во внешние системы уведомлений, включая электронную почту, Slack, Microsoft Teams, Telegram, OpsGenie, вебхуки и другие.

    Основной оператор argocd-operator-controller-manager модуля формирует настройки для уведомлений на основе кастомных ресурсов NotificationsConfiguration и сохраняет их в ресурсах ConfigMap argocd-notifications-cm и Secret argocd-notifications-secret, которые используются контроллером для формирования и отправки уведомлений.

    Для включения компонента необходимо задать в параметре .spec.notifications.enabled кастомного ресурса ArgoCD значение true.

    Более подробную информацию о механизмах работы можно найти в документации по Argo CD Notifications.

  8. <ArgoCD name>-dex-server (Deployment) — argocd-dex-server, опциональный компонент для аутентификации пользователей в Argo CD, выступающий в роли OIDC-провайдера (OpenID Connect) на базе Dex. Компонент реализует возможность входа пользователей через различные внешние провайдеры аутентификации (LDAP, GitHub, GitLab, SAML, Azure AD и др.), а также поддерживает работу со статическими пользователями, определёнными в конфигурации Dex.

    Состоит из следующих контейнеров:

    • copyutil — init-контейнер, копирующий исполняемые файлы для использования из основного контейнера;
    • dex — основной контейнер.

    Для включения компонента необходимо задать параметры в разделе .spec.sso.dex кастомного ресурса ArgoCD.

    Для аутентификации пользователей Argo CD в DKP модуль operator-argo поддерживает интеграцию с модулем user-authn (встроенная аутентификация DKP). Другие внешние провайдеры через Dex в данной конфигурации не используются.

    Подробнее с примерами использования модуля operator-argo можно ознакомиться в разделе документации модуля.

  9. <ArgoCD name>-redis (Deployment) — argocd-redis, обязательный компонент, состоящий из одного контейнера redis и отвечающий за хранение данных об очередях задач и состоянии сессий в Argo CD. Argocd-redis реализует отдельный экземпляр базы данных Redis.

    Argocd-operator-controller-manager разворачивает этот компонент, если параметр .spec.ha.enabled кастомного ресурса ArgoCD принимает значение false.

  10. <ArgoCD name>-redis-ha-server (StatefulSet) — argocd-redis-ha-server, обязательный компонент для развёртывания Redis в режиме высокой доступности (HA) в составе Argo CD. Реализует отказоустойчивый кластер Redis с репликацией и автоматическим переключением (failover) с помощью механизма Redis Sentinel.

    Состоит из следующих контейнеров:

    • config-init — init-контейнер, подготавливающий конфигурацию для Redis и Sentinel перед запуском основных контейнеров;
    • redis — основной контейнер, реализующий экземпляр Redis-сервера;
    • sentinel — вспомогательный контейнер, запускающий Redis Sentinel для мониторинга состояния экземпляров Redis и автоматического переключения на реплику при отказе основного экземпляра.

    Argocd-operator-controller-manager разворачивает этот компонент, если параметр .spec.ha.enabled кастомного ресурса ArgoCD принимает значение true.

  11. <ArgoCD name>-redis-ha-haproxy (Deployment) — argocd-redis-ha-haproxy, дополнительный компонент для балансировки нагрузки и распределения трафика к экземплярам кластера Redis (redis-ha-server) на основе балансировщика нагрузки/обратного прокси-сервера HAProxy.

    Состоит из следующих контейнеров:

    • config-init — init-контейнер, подготавливающий конфигурацию для HAProxy перед запуском основного контейнера;
    • haproxy — контейнер, работающий в роли прокси-сервера и обеспечивающий прозрачную маршрутизацию запросов клиентов к доступным master/replica-экземплярам Redis, а также автоматизацию переключения между ними при failover.

    Argocd-operator-controller-manager разворачивает этот компонент, если параметр .spec.ha.enabled кастомного ресурса ArgoCD принимает значение true.

    Для реализации безопасного и масштабируемого мультикластера в Argo CD используются следующие компоненты:

    • Principal — это центральная точка управления: хранит состояние и раздает задания;
    • Agent — это исполнитель в каждом целевом кластере: применяет манифесты и возвращает результат обработки в Principal.

    Такой подход позволяет управлять множеством кластеров без прямого доступа с центрального Argo CD в Kubernetes API каждого кластера, что уменьшает требования к количеству открытых входящих доступов, обеспечивает изоляцию и отказоустойчивость.

  12. <ArgoCD name>-agent-agent (Deployment) — argocd-agent-agent, опциональный компонент, состоящий из одного контейнера <ArgoCD name>-agent-agent и отвечающий за выполнение операций над управляемыми ресурсами Kubernetes-кластера по заданию из Argo CD. Компонент устанавливает подключение к Argo CD Principal, синхронизирует приложения и управляет их состоянием на основе команд, поступающих от Argo CD Principal.

    Подробнее с архитектурой мультикластерной конфигурации Argo CD можно ознакомиться в документации Argo CD.

    Argocd-operator-controller-manager разворачивает этот компонент, если параметр .spec.argoCDAgent.agent.enabled кастомного ресурса ArgoCD принимает значение true. В одном ресурсе ArgoCD не допускается одновременное использование Argo CD Agent и Argo CD Principal.

  13. <ArgoCD name>-agent-principal (Deployment) — argocd-agent-principal, опциональный компонент, состоящий из одного контейнера <ArgoCD name>-agent-principal и обеспечивающий работу Argo CD в мультикластерной конфигурации.

    При включении этого компонента argocd-operator-controller-manager перенастраивает все компоненты, использующие подключение к базе Redis, на использование Redis-прокси. Компонент argocd-agent-principal реализует Redis-прокси и маршрутизирует запросы к базе данных на основе анализа ключей Redis: в зависимости от значения ключей запрос направляется или в локальный экземпляр Redis, или в один из удалённых Argo CD Agent.

    Argocd-operator-controller-manager разворачивает этот компонент, если параметр .spec.argoCDAgent.principal.enabled кастомного ресурса ArgoCD принимает значение true. В одном ресурсе ArgoCD не допускается одновременное использование Argo CD Agent и Argo CD Principal.

  14. <Export name> (Job/CronJob) — argocd-export, опциональный компонент, реализованный в виде Job или CronJob и создающий под из одного контейнера argocd-export. Компонент создаёт резервную копию настроек и состояния экземпляра Argo CD.

Взаимодействия модуля

Модуль взаимодействует со следующими компонентами:

  1. Внешние хранилища образов — получение списка образов.
  2. Внешние репозитории кода:
    • получение манифестов развёртывания приложения из репозиториев;
    • обновление параметров образа контейнера (поле image) в Helm-чарте.
  3. Внешний Argo CD Principal:
    • подключение к управляющему кластеру Argo CD;
    • получение запросов на обработку;
    • передача результатов выполнения запросов.
  4. Kube-apiserver:
    • управление кастомными ресурсами Application, ApplicationSet, AppProject, ArgoCD, ArgoCDExport, ImageUpdater, NamespaceManagement, NotificationsConfiguration, а также Secret, ConfigMap;
    • управление ресурсами, которые создаются при развёртывании пользовательского приложения, описанного в кастомном ресурсе Application;
    • авторизация запросов на получение метрик.
  5. Модуль user-authn — перенаправление пользователя для аутентификации.

С модулем взаимодействуют следующие внешние компоненты:

  1. Prometheus-main — сбор метрик, предоставляемых оператором и экземплярами Argo CD.
  2. Внешний Argo CD Agent:
    • подключение к управляющему кластеру Argo CD;
    • получение запросов на обработку;
    • передача результатов выполнения запросов.

Дополнительные ресурсы