В этом разделе описаны шаги, необходимые для запуска экземпляра Argo CD в кластере DKP:

Подготовка к запуску Argo CD

Прежде чем создавать экземпляры Argo CD, выполните следующие шаги:

  1. Включите модуль operator-argo.

  2. Дождитесь, пока модуль перейдёт в состояние Ready.

    Проверить состояние модуля можно в веб-интерфейсе DKP или с помощью команды:

    d8 k get module operator-argo -w
    

Подробная информация о настройках модуля приведена в документации модуля operator-argo.

После включения модуля operator-argo в кластере DKP станут доступны кастомные ресурсы Argo CD.

Чтобы запустить экземпляр Argo CD, необходимо создать объект ArgoCD. Работа с кастомными ресурсами, относящимися к области экземпляра Argo CD, описана в разделе «Использование».

Список кастомных ресурсов Argo CD, создаваемых модулем operator-argo...

CRD Область использования Назначение
argocds.argoproj.io Модуль operator-argo Кастомный ресурс, по которому модуль operator-argo настраивает и сопровождает экземпляр Argo CD в целевой среде. Через объект ArgoCD задаются параметры установки, состав компонентов, интеграции, политики доступа и другие настройки экземпляра.
appprojects.argoproj.io Экземпляр Argo CD Используется для логической сегментации приложений и задания политик: допустимых Git-репозиториев, целевых кластеров и неймспейсов, а также правил доступа и ограничений на использование ресурсов.
applications.argoproj.io Экземпляр Argo CD Основная прикладная CRD Argo CD для описания приложения, которое должно синхронизироваться из декларативного источника (Git, Helm, Kustomize и другие) в Kubernetes. Определяет источник, целевое окружение и параметры синхронизации.
applicationsets.argoproj.io Экземпляр Argo CD Используется для автоматизированного создания набора объектов Application по шаблону. Подходит для сценариев массового управления приложениями: в нескольких кластерах, окружениях, директориях, командах или ветках репозитория.
argocdexports.argoproj.io Экземпляр Argo CD Используется для декларативного экспорта данных, связанных с экземпляром Argo CD, во внешние системы или смежные компоненты DKP. Обычно применяется в интеграционных сценариях, где требуется формализованно публиковать сведения о конфигурации, статусе или доступах.
namespacemanagements.argoproj.io Экземпляр Argo CD Используется для управления жизненным циклом неймспейсов в рамках GitOps-процессов. Может автоматизировать создание, настройку и сопровождение неймспейсов, в которые затем выполняется развёртывание приложений.
notificationsconfigurations.argoproj.io Экземпляр Argo CD Используется для настройки механизма уведомлений Argo CD. Позволяет декларативно описывать каналы доставки и правила отправки событий, связанных с синхронизацией, ошибками развёртывания, изменением статуса приложений и другими операционными событиями.
imageupdaters.argocd-image-updater.argoproj.io Экземпляр Argo CD Используется для автоматического отслеживания новых версий контейнерных образов и обновления параметров приложений в соответствии с заданной стратегией версионирования и публикации.

Развёртывание экземпляра Argo CD

Параметры, доступные для конфигурации экземпляра Argo CD, приведены в документации модуля operator-argo.

Чтобы развернуть экземпляр Argo CD в неймспейсе argocd и опубликовать веб-интерфейс Argo CD через Ingress, используйте следующий пример (укажите собственные значения для <ARGOCD_DOMAIN> и <TLS_SECRET_NAME>):

apiVersion: v1
kind: Namespace
metadata:
  name: argocd
---
apiVersion: argoproj.io/v1beta1
kind: ArgoCD
metadata:
  name: argocd
  namespace: argocd
spec:
  server:
    host: <ARGOCD_DOMAIN>
    ingress:
      enabled: true
      tls:
        - hosts:
            - <ARGOCD_DOMAIN>
          secretName: <TLS_SECRET_NAME>
    insecure: true
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: argocd-ingress
  namespace: argocd
spec:
  dnsNames:
    - <ARGOCD_DOMAIN>
  issuerRef:
    kind: ClusterIssuer
    name: letsencrypt
  secretName: <TLS_SECRET_NAME>

Параметр spec.server.insecure: true в примере выше отключает внутренний TLS у API-сервера Argo CD. Это позволяет избежать циклических перенаправлений при публикации через Ingress.

После создания объекта ArgoCD в неймспейсе argocd будут запущены компоненты Argo CD:

d8 k -n argocd get pods
NAME                                  READY   STATUS    RESTARTS   AGE
argocd-application-controller-0       1/1     Running   0          35m
argocd-dex-server-759fff8444-zglp4    1/1     Running   0          2d23h
argocd-redis-568f5b889c-jg5dr         1/1     Running   0          4d
argocd-repo-server-78d9d6bcc6-9rwcm   1/1     Running   0          3d22h
argocd-server-76597597f9-kfqdl        1/1     Running   0          35m
podinfo-ccdb96645-zv5tm               1/1     Running   0          2d20h

Когда все компоненты перейдут в статус Running, веб-интерфейс экземпляра Argo CD станет доступен по адресу, указанному в параметре spec.server.ingress.tls.hosts (в примере — https://<ARGOCD_DOMAIN>). Настройка аутентификации и получения учётных данных описана в разделе «Настройка аутентификации и авторизации».

Доставка пользовательских приложений с помощью Argo CD описана в разделе «Использование».

Для работы с Argo CD можно использовать не только веб-интерфейс и кастомные ресурсы, но и CLI-утилиту argocd. Бинарный файл можно загрузить из раздела «Documentation» веб-интерфейса Argo CD. Инструкцию по работе с CLI-утилитой можно получить, выполнив argocd --help.

Развёртывание нескольких экземпляров Argo CD

Если в кластере требуется несколько экземпляров Argo CD, создайте для каждого из них отдельный неймспейс (или проект DKP) и отдельный объект ArgoCD.

Например, создайте:

  • отдельный экземпляр для production-окружения;
  • отдельный экземпляр для тестовых окружений;
  • отдельный экземпляр для конкретной команды или проекта.

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

В одном неймспейсе поддерживается создание не более одного объекта ArgoCD.

Расширенные настройки

Включение режима высокой доступности

Чтобы включить режим высокой доступности, установите параметр spec.ha.enabled: true в объекте ArgoCD.

Пример:

apiVersion: argoproj.io/v1beta1
kind: ArgoCD
metadata:
  name: argocd
  namespace: argocd
spec:
  ha:
    enabled: true
    resources:
      requests:
        cpu: "500m"
        memory: "512Mi"
      limits:
        cpu: "1"
        memory: "1Gi"

Режим высокой доступности обеспечивает высокую доступность только для хранилища состояния Redis с использованием HAProxy. Он не делает все компоненты Argo CD высокодоступными автоматически.

Для запуска Argo CD в режиме высокой доступности требуется не менее трёх узлов кластера из-за правил pod anti-affinity. Кластеры, работающие только с IPv6, не поддерживаются.

При включённом режиме высокой доступности изменения в .spec.redis.resources не применяются. Ограничения и запросы ресурсов для Redis настраивайте через параметр .spec.ha.resources.

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

По умолчанию экземпляр Argo CD получает привилегии только на неймспейс, в котором он запущен, и неймспейсы, помеченные лейблом argocd.argoproj.io/managed-by. Значение лейбла должно совпадать с названием неймспейса, в котором запущен экземпляр Argo CD.

Чтобы разрешить создание cluster-wide-ресурсов, укажите в параметре clusterConfigNamespaces настроек модуля operator-argo имя неймспейса, в котором запущен целевой экземпляр Argo CD.

Пример:

apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: operator-argo
spec:
  enabled: true
  settings:
    clusterConfigNamespaces: argocd
  version: 1

Если экземпляров Argo CD несколько, перечислите их в параметре clusterConfigNamespaces через запятую.

После внесения изменений в ModuleConfig автоматически будут созданы следующие кластерные роли (ClusterRole) и кластерные биндинги (ClusterRoleBinding):

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    argocds.argoproj.io/name: argocd
    argocds.argoproj.io/namespace: argocd
  labels:
    app.kubernetes.io/managed-by: argocd
    app.kubernetes.io/name: argocd
    app.kubernetes.io/part-of: argocd
  name: argocd-argocd-argocd-application-controller
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - ""
  resources:
  - serviceaccounts
  verbs:
  - impersonate
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  annotations:
    argocds.argoproj.io/name: argocd
    argocds.argoproj.io/namespace: argocd
  labels:
    app.kubernetes.io/managed-by: argocd
    app.kubernetes.io/name: argocd-application-controller
    app.kubernetes.io/part-of: argocd
  name: argocd-argocd-argocd-application-controller

roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: argocd-argocd-argocd-application-controller
subjects:
- kind: ServiceAccount
  name: argocd-argocd-application-controller
  namespace: argocd
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    argocds.argoproj.io/name: argocd
    argocds.argoproj.io/namespace: argocd
  labels:
    app.kubernetes.io/managed-by: argocd
    app.kubernetes.io/name: argocd
    app.kubernetes.io/part-of: argocd
  name: argocd-argocd-argocd-server
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - get
  - delete
  - patch
- apiGroups:
  - argoproj.io
  resources:
  - applications
  - applicationsets
  verbs:
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - events
  verbs:
  - list
- apiGroups:
  - batch
  resources:
  - jobs
  - cronjobs
  - cronjobs/finalizers
  verbs:
  - create
  - update
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  annotations:
    argocds.argoproj.io/name: argocd
    argocds.argoproj.io/namespace: argocd
  labels:
    app.kubernetes.io/managed-by: argocd
    app.kubernetes.io/name: argocd-server
    app.kubernetes.io/part-of: argocd
  name: argocd-argocd-argocd-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: argocd-argocd-argocd-server
subjects:
- kind: ServiceAccount
  name: argocd-argocd-server
  namespace: argocd

Если полномочия, описанные в кластерных ролях по умолчанию, избыточны, в настройках объекта ArgoCD укажите spec.defaultClusterScopedRoleDisabled: true. В этом случае кластерные роли не будут созданы автоматически, и вы сможете самостоятельно описать необходимый уровень привилегий для ServiceAccount, используемого экземпляром Argo CD.

При необходимости уровень доступа к кластерным ресурсам можно переопределить на уровне объекта AppProject, используя параметры spec.clusterResourceBlacklist и spec.clusterResourceWhitelist.

Использование собственного домена кластера

Если в кластере используется домен, отличный от cluster.local, укажите его в параметре spec.clusterDomain объекта ArgoCD.

Пример:

apiVersion: argoproj.io/v1beta1
kind: ArgoCD
metadata:
  name: argocd
  namespace: argocd
spec:
  clusterDomain: prod.local

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