Для улучшения работы сайта мы используем файлы cookies. Оставаясь на сайте, вы соглашаетесь с политикой обработки персональных данных.

Управление

1. Основные пользовательские ресурсы

Оператор вводит несколько ключевых Custom Resources (CR), с помощью которых задаётся желаемое состояние Argo CD.

  • ArgoCD. Описывает конфигурацию всего кластера Argo CD.

  • AppProject. Определяет проект — логическую группу приложений с ограничениями. Создаётся в том же пространстве имен, где развёрнут инстанс ArgoCD.

  • Application. Описывает конкретное GitOps‑приложение: откуда брать манифесты и куда выполнять развёртывание.

2. Интеграция со StarVault (SSO)

Для настройки единого входа через StarVault выполните шаги.

  1. После развертывания оператора в пространстве имен argocd-operator необходимо добавить label:

    kubectl label namespace argocd-operator nova-platform.io/trusted-ca-bundle=enabled

    Проверьте, что label добавился успешно с помощью команды:

    kubectl get namespace argocd-operator -o yaml | grep trusted-ca-bundle
  2. Перейдите в StarVault в раздел ДоступOIDC Провайдер. Нажмите + Создать приложение. Заполните обязательные поля.

    argo 1
    • Имя приложения: oidc-auth-argocd

    • Тип: confidential

    • URI перенаправления: https://<Имя ingress ArgoCD инстанса>/auth/callback

    • Под заголовком Назначить доступ выберите Ограничить доступ выбранным пользователям и в поле Название назначения укажите необходимое назначение (например, kubeadmins-assignment)

  3. Нажмите Создать.

  4. Перейдите на страницу ДоступOIDC ПровайдерПровайдерыnovaРедактировать провайдера и добавьте созданное приложение в список разрешённых.

  5. Перейдите в веб-интерфейс Nova на вкладку ОператорыУстановленные операторы. Настроить ArgoCD можно двумя способами:

    • С помощью манифеста.

      Ниже представлен пример манифеста Argo CD:

      Пример манифеста
      apiVersion: argoproj.io/v1beta1
      kind: ArgoCD
      metadata:
        name: argocd-sample
        namespace: argocd-operator
      spec:
        controller:
          respectRBAC: strict
          resources:
            limits:
              cpu: 2000m
              memory: 2048Mi
            requests:
              cpu: 250m
              memory: 1024Mi
        ha:
          enabled: false
          resources:
            limits:
              cpu: 500m
              memory: 256Mi
            requests:
              cpu: 250m
              memory: 128Mi
        redis:
          resources:
            limits:
              cpu: 500m
              memory: 256Mi
            requests:
              cpu: 250m
              memory: 128Mi
        repo:
          resources:
            limits:
              cpu: 1000m
              memory: 512Mi
            requests:
              cpu: 250m
              memory: 256Mi
        server:
        insecure: true
        trustedCA:
          volumes:
           - configMap:
               name: trusted-ca-bundle
             name: cluster-trusted-ca
          volumeMounts:
           - mountPath: /etc/ssl/certs/ca-certificates.crt
             name: cluster-trusted-ca
             subPath: ca-certificates.pem
          resources:
            limits:
              cpu: 500m
              memory: 256Mi
            requests:
              cpu: 125m
              memory: 128Mi
          host: argocd.apps.example.platform
          ingress:
            enabled: true
            ingressClassName: nginx-public
            tls:
              - hosts:
                  - argocd.apps.example.platform
                secretName: default-ingress-certificate
      
        # Настройка SSO через StarVault (OIDC)
        oidcConfig: |
          name: Nova OAuth (1)
          issuer: https://<FQDN_StarVault>/v1/identity/oidc/provider/nova (2)
          clientID: <id> (3)
          clientSecret: <secret> (4)
          requestedScopes: (5)
            - openid
            - profile
            - email
            - groups
          requestedIDTokenClaims: (6)
            groups:
              essential: true
      
        # Настройка RBAC
        rbac:
          defaultPolicy: 'role:readonly' (7)
          policy: | (8)
            g, kubeadmins, role:admin
            p, role:tester, applications, sync, my-project/*, allow
            g, qa-team, role:tester
          policyMatcherMode: glob (9)
          scopes: '[email,groups]' (10)
      1 name — отображаемое имя метода авторизации (задаётся произвольно).
      2 issuer — URL OIDC‑провайдера в StarVault (формат: https://<FQDN_StarVault>/v1/identity/oidc/provider/nova).
      3 clientID — идентификатор приложения, созданного в StarVault для ArgoCD.
      4 clientSecret — секрет приложения, созданного в StarVault для ArgoCD.
      5 requestedScopes — запрашиваемые OAuth‑скопы: openid, profile, email, groups.
      6 requestedIDTokenClaims — дополнительные требования к ID‑токену. Здесь указано, что клейм groups является обязательным.
      7 defaultPolicy — роль, назначаемая пользователям по умолчанию (здесь — role:readonly).
      8 policy — правила RBAC в формате Casbin:
      • g, <subject>, <inherited-subject> — привязка группы к роли.

      • p, <subject>, <resource>, <action>, <object>, <effect> — определение кастомной роли. ---

      9 policyMatcherMode: glob — режим сопоставления шаблонов в политиках (glob‑маски).
      10 scopes: '[email,groups]' — список скопов, которые будут передаваться в политиках RBAC (используются для матчинга групп).
    • С помощью формы. Заполните обязательные поля формы и после заполнения нажмите Создать.

      argo 2

Параметры clientID и clientSecret берутся из созданного в StarVault Application.

3. Настройка веб-интерфейса для Rollout Extension

Для добавления расширения Rollout в веб-интерфейсе Argo CD необходимо предварительно установить само расширение.

Перейдите к ОператорыУстановленные операторы. Нажмите на Argo CD. Перейдите ко вкладке Argo CD и нажмите на созданный экземпляр. Перейдите на вкладку YAML или нажмите по кнопке действия на Редактировать ArgoCD.

argo 4

В манифест CR ArgoCD в секцию spec.server добавьте следующие строки:

initContainers:
  - env:
      - name: EXTENSION_URL
        value: >-
          https://s3.ru-msk.k2.cloud/downloads-nova-platform-io/community-operators/argoproj-labs/rollout-extension/releases/download/v0.3.6/extension.tar
    image: >-
      hub.nova-platform.io/registry/community-operators/argoprojlabs/argocd-extension-installer:v0.0.8
    name: rollout-extension
    securityContext:
      allowPrivilegeEscalation: false
    volumeMounts:
      - mountPath: /tmp/extensions/
        name: extensions

Также в spec добавьте:

volumes:
  - emptyDir: {}
    name: extensions

volumesMounts:
  - mountPath: /tmp/extensions/
    name: extensions

Для инсталляций, использующих Universe необходимо использовать ссылку для параметра EXTENSION_URL: https://repo.universe.mycompany/packages/community-operators/argoproj-labs/rollout-extension/releases/download/v0.3.6/extension.tar, где universe.mycompany — пользовательский домен Universe.

4. Настройка секрета с учётными данными для подключения к репозиторию (для CR Application)

В пространстве имен, где развёрнут экземпляр Argo CD, создайте секрет с произвольным именем, содержащий необходимые ключи. Обязательно добавьте label argocd.argoproj.io/secret-type.

Пример для конкретного git-репозитория
apiVersion: v1
kind: Secret
metadata:
  name: secret-git-repo
  namespace: argocd-operator
  labels:
    argocd.argoproj.io/secret-type: repository
data:
  url: https://git.local/project/argo-demo.git
  username: git-user
  password: git-password
Пример для нескольких git-репозиториев
apiVersion: v1
kind: Secret
metadata:
  name: secret-git-repo
  namespace: argocd-operator
  labels:
    argocd.argoproj.io/secret-type: repo-creds
data:
  url: https://git.local/project/   (1)
  username: git-user
  password: git-password
1 Все репозитории внутри project
Пример с использованием SSH-ключа
apiVersion: v1
kind: Secret
metadata:
  name: nova-git-ssh-creds
  namespace: argocd-operator
  labels:
    argocd.argoproj.io/secret-type: repo-creds
stringData:
  url: ssh://git.local/project/
  sshPrivateKey: |
    -----BEGIN OPENSSH PRIVATE KEY-----
    ...
    -----END OPENSSH PRIVATE KEY-----

5. Добавление сертификатов для доверия к внешним git-репозиториям

Для подключения к репозиториям, использующим самоподписанные или корпоративные сертификаты, добавьте в манифест CR ArgoCD параметры:

Добавьте в spec.repo следующие строки:

systemCATrust:
  configMaps:
    - name: trusted-ca-bundle (1)
      optional: true (2)
      items:
        - key: ca-certificates.pem (3)
          path: nova-ca-bundle.crt (4)

  secrets:
    - name: fallback-ca-secret
      items:
        - key: ca.crt
          path: fallback-ca.crt
1 Имя CM
2 Необязательный параметр, позволяет игнорировать ошибки в случае отсутствия указанной CM/Secret
3 Ключ внутри CM
4 Имя файла, под которым оператор запишет содержимое в директорию с сертификатами внутри контейнера - обязательно в формате .crt

6. Получение пароля учётной записи администратора

При создании экземпляра Argo CD оператор генерирует пароль локальной учётной записи admin и сохраняет его в секрете <имя_argocd_инстанса>-cluster в том же пространстве имён, где развёрнут экземпляр. Пароль хранится в ключе admin.password.

6.1. Получение пароля с помощью kubectl

kubectl -n argocd-operator get secret argocd-sample-cluster \
  -o jsonpath='{.data.admin\.password}' | base64 -d; echo

Здесь argocd-sample — имя CR ArgoCD (metadata.name). Список секретов экземпляра можно получить командой:

kubectl -n argocd-operator get secrets -l app.kubernetes.io/part-of=argocd
Пример вывода:
NAME                         TYPE                 DATA   AGE
argocd-sample-ca             kubernetes.io/tls    3      5d
argocd-sample-cluster        Opaque               1      5d
argocd-sample-default-cluster-config   Opaque     5      5d
argocd-sample-tls            kubernetes.io/tls    2      5d

6.2. Получение пароля через Nova Console

  1. Перейдите в раздел РесурсыSecrets пространства имён, где развёрнут экземпляр Argo CD (по умолчанию argocd-operator).

    argo 5
  2. Выберите секрет <имя_argocd_инстанса>-cluster.

  3. В блоке Данные нажмите Показать значения и скопируйте значение ключа admin.password.

    argo 6

6.3. Вход и смена пароля

Для входа в веб-интерфейс используйте логин admin и полученный пароль. Кнопка входа по логину и паролю доступна на странице авторизации вместе с кнопкой входа через SSO.

Сменить пароль можно двумя способами:

  • из интерфейса или CLI Argo CD:

    argocd login <Имя ingress ArgoCD инстанса> --username admin --password <текущий пароль>
    argocd account update-password
  • изменив значение ключа admin.password в секрете <имя_argocd_инстанса>-cluster. Оператор отследит изменение, пересчитает bcrypt-хэш и обновит секрет argocd-secret, после чего новый пароль вступит в силу.

Если локальная учётная запись администратора не требуется (например, используется только SSO через StarVault), отключите её параметром spec.disableAdmin: true в CR ArgoCD. Секрет <имя_argocd_инстанса>-cluster при этом остаётся, но вход по паролю запрещён.

7. Настройка Source Hydrator

Source Hydrator (гидратор манифестов) реализует паттерн rendered manifests: Argo CD самостоятельно рендерит Helm-, Kustomize- или Jsonnet-источник, коммитит полученные Kubernetes-манифесты в отдельную ветку git-репозитория и синхронизирует кластер уже из неё. Это позволяет видеть и хранить в git фактические манифесты, применяемые к кластеру, а также использовать ветки как границы окружений (dev/stage/prod).

Оператор Argo CD не управляет гидратором: в CR ArgoCD отсутствуют параметры для включения этой возможности и для развёртывания компонента commit server. При этом версия Argo CD, поставляемая с оператором argocd-operator.v0.18.0 (v3.3.10), функциональность поддерживает. Поэтому настройка выполняется в полуручном режиме: часть параметров задаётся в CR ArgoCD, ресурсы commit server создаются отдельными манифестами.

Ограничения, которые следует учитывать перед включением:

  • в состав манифестов, попадающих в git, не должны подставляться секреты (плагины типа SOPS или Vault-плагин использовать нельзя — значения окажутся в репозитории в открытом виде);

  • параметр syncSource.path не может указывать на корень репозитория;

  • одна и та же ветка не должна использоваться для гидрации несколькими экземплярами Argo CD;

  • начиная с Argo CD v3.3 гидратор не удаляет из целевого каталога файлы, отсутствующие в текущем результате рендеринга — устаревшие файлы удаляются вручную.

7.1. Включение гидратора в CR ArgoCD

Добавьте в манифест CR ArgoCD переменную окружения ARGOCD_HYDRATOR_ENABLED:

spec:
  repo:
    env:
      - name: ARGOCD_HYDRATOR_ENABLED
        value: 'true'
  controller:                        (1)
    env:
      - name: ARGOCD_HYDRATOR_ENABLED
        value: 'true'
1 spec.controller — обязательный параметр, включает контроллер гидратора, который выполняет рендеринг и обращается к commit server.

После сохранения CR оператор автоматически перезапускает соответствующие компоненты Argo CD, дополнительных действий не требуется.

7.2. Создание секрета с правом записи в репозиторий

Гидратор выполняет push в целевую ветку, поэтому обычного секрета с меткой argocd.argoproj.io/secret-type: repository (см. раздел 5) недостаточно. Создайте отдельный секрет с меткой argocd.argoproj.io/secret-type: repository-write и учётными данными сервисной учётной записи, имеющей право записи в репозиторий.

apiVersion: v1
kind: Secret
metadata:
  name: git-write-creds
  namespace: argocd-operator
  labels:
    argocd.argoproj.io/secret-type: repository-write
stringData:
  url: https://git.local/project/argo-demo.git
  username: <username>
  password: <token>

7.3. Создание ресурсов commit server

Компонент commit server не создаётся оператором. Примените приведённый ниже манифест в пространстве имён, где развёрнут экземпляр Argo CD.

Пример манифеста
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/component: commit-server
    app.kubernetes.io/name: argocd-commit-server
    app.kubernetes.io/part-of: argocd
  name: argocd-commit-server
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: commit-server
    app.kubernetes.io/name: argocd-commit-server
    app.kubernetes.io/part-of: argocd
  name: argocd-commit-server            (1)
spec:
  ports:
    - name: server
      port: 8086
      protocol: TCP
      targetPort: 8086
    - name: metrics
      port: 8087
      protocol: TCP
      targetPort: 8087
  selector:
    app.kubernetes.io/name: argocd-commit-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/component: commit-server
    app.kubernetes.io/name: argocd-commit-server
    app.kubernetes.io/part-of: argocd
  name: argocd-commit-server
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-commit-server
  template:
    metadata:
      labels:
        app.kubernetes.io/name: argocd-commit-server
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - podAffinityTerm:
                labelSelector:
                  matchLabels:
                    app.kubernetes.io/name: argocd-commit-server
                topologyKey: kubernetes.io/hostname
              weight: 100
            - podAffinityTerm:
                labelSelector:
                  matchLabels:
                    app.kubernetes.io/part-of: argocd
                topologyKey: kubernetes.io/hostname
              weight: 5
      automountServiceAccountToken: false
      containers:
        - args:
            - /usr/local/bin/argocd-commit-server
          env:
            - name: ARGOCD_COMMIT_SERVER_LISTEN_ADDRESS
              valueFrom:
                configMapKeyRef:
                  key: commitserver.listen.address
                  name: argocd-cmd-params-cm
                  optional: true
            - name: ARGOCD_COMMIT_SERVER_METRICS_LISTEN_ADDRESS
              valueFrom:
                configMapKeyRef:
                  key: commitserver.metrics.listen.address
                  name: argocd-cmd-params-cm
                  optional: true
            - name: ARGOCD_COMMIT_SERVER_LOGFORMAT
              valueFrom:
                configMapKeyRef:
                  key: commitserver.log.format
                  name: argocd-cmd-params-cm
                  optional: true
            - name: ARGOCD_COMMIT_SERVER_LOGLEVEL
              valueFrom:
                configMapKeyRef:
                  key: commitserver.log.level
                  name: argocd-cmd-params-cm
                  optional: true
            - name: ARGOCD_LOG_FORMAT_TIMESTAMP
              valueFrom:
                configMapKeyRef:
                  key: log.format.timestamp
                  name: argocd-cmd-params-cm
                  optional: true
          image: hub.nova-platform.io/registry/community-operators/argoproj/argocd:v3.3.10   (2)
          imagePullPolicy: Always
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz?full=true
              port: 8087
            initialDelaySeconds: 30
            periodSeconds: 30
            timeoutSeconds: 5
          name: argocd-commit-server
          ports:
            - containerPort: 8086
            - containerPort: 8087
          readinessProbe:
            httpGet:
              path: /healthz
              port: 8087
            initialDelaySeconds: 5
            periodSeconds: 10
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop:
                - ALL
            readOnlyRootFilesystem: true
            runAsNonRoot: true
            seccompProfile:
              type: RuntimeDefault
          volumeMounts:
            - mountPath: /app/config/ssh
              name: ssh-known-hosts
            - mountPath: /app/config/tls
              name: tls-certs
            - mountPath: /app/config/gpg/source
              name: gpg-keys
            - mountPath: /app/config/gpg/keys
              name: gpg-keyring
            - mountPath: /tmp                     (3)
              name: tmp
      serviceAccountName: argocd-commit-server
      volumes:
        - configMap:
            name: argocd-ssh-known-hosts-cm       (4)
          name: ssh-known-hosts
        - configMap:
            name: argocd-tls-certs-cm
          name: tls-certs
        - configMap:
            name: argocd-gpg-keys-cm
          name: gpg-keys
        - emptyDir: {}
          name: gpg-keyring
        - emptyDir: {}
          name: tmp
        - name: argocd-commit-server-tls
          secret:
            items:
              - key: tls.crt
                path: tls.crt
              - key: tls.key
                path: tls.key
              - key: ca.crt
                path: ca.crt
            optional: true
            secretName: argocd-commit-server-tls
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  labels:
    app.kubernetes.io/component: commit-server
    app.kubernetes.io/name: argocd-commit-server
    app.kubernetes.io/part-of: argocd
  name: argocd-commit-server-network-policy
spec:
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app.kubernetes.io/name: <имя_argocd_инстанса>-application-controller   (5)
      ports:
        - port: 8086
          protocol: TCP
    - from:
        - namespaceSelector: {}
      ports:
        - port: 8087
  podSelector:
    matchLabels:
      app.kubernetes.io/name: argocd-commit-server
  policyTypes:
    - Ingress
1 Имя сервиса должно быть именно argocd-commit-server — контроллер обращается к commit server по адресу по умолчанию argocd-commit-server:8086 независимо от имени экземпляра Argo CD. Если сервис требуется назвать иначе, добавьте в CR ArgoCD параметр spec.controller.env с переменной ARGOCD_APPLICATION_CONTROLLER_COMMIT_SERVER и укажите фактический адрес в формате <имя_сервиса>:8086.
2 Версия образа должна совпадать с версией Argo CD, поставляемой оператором. Проверить используемую версию можно командой:
kubectl -n argocd-operator get deploy <имя_argocd_инстанса>-repo-server -o jsonpath='{..image}'
3 Каталог /tmp монтируется обязательно: при readOnlyRootFilesystem: true он необходим для служебного сокета askpass.
4 ConfigMap argocd-ssh-known-hosts-cm, argocd-tls-certs-cm и argocd-gpg-keys-cm создаются оператором при развёртывании экземпляра Argo CD, создавать их не требуется.
5 В метке необходимо указать имя экземпляра Argo CD, заданное в metadata.name CR ArgoCD. Например, для экземпляра argocd-sample значение будет argocd-sample-application-controller. Фактическое значение метки можно получить командой:
kubectl -n argocd-operator get pods -l app.kubernetes.io/part-of=argocd --show-labels

7.4. Создание Application с использованием гидратора

В CR Application вместо секции spec.source указывается секция spec.sourceHydrator. Одновременное использование spec.source и spec.sourceHydrator не допускается.

Пример манифеста
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: argo-demo
  namespace: argocd-operator
spec:
  destination:
    namespace: default
    server: 'https://kubernetes.default.svc'
  project: default
  sourceHydrator:
    drySource:                                   (1)
      path: helm-guestbook
      repoURL: >-
        https://git.local/project/argo-demo.git
      targetRevision: hydro
    syncSource:                                  (2)
      path: manifests
      targetBranch: env/dev
      hydrateTo:                                 (3)
        targetBranch: env/dev-next
1 drySource — источник исходных манифестов: репозиторий, ветка или тег (targetRevision) и каталог с Helm-чартом либо Kustomize-конфигурацией.
2 syncSource — ветка (targetBranch) и каталог (path), в которые Argo CD записывает отрендеренные манифесты и из которых выполняет синхронизацию с кластером. Значение path не может быть корнем репозитория.
3 hydrateTo — необязательный параметр. Если он задан, отрендеренные манифесты записываются в указанную промежуточную ветку, а перенос изменений в ветку syncSource выполняется внешним процессом (например, через merge request). Такой режим применяется для согласования изменений перед выкаткой.

7.5. Проверка настройки

  1. Убедитесь, что под commit server запущен:

    kubectl -n argocd-operator get deploy argocd-commit-server
  2. Убедитесь, что гидратор включён в контроллере:

    kubectl -n argocd-operator get statefulset <имя_argocd_инстанса>-application-controller \
      -o jsonpath='{.spec.template.spec.containers[0].env[?(@.name=="ARGOCD_HYDRATOR_ENABLED")].value}'; echo
  3. Проверьте состояние гидрации приложения:

    kubectl -n argocd-operator get application argo-demo -o jsonpath='{.status.sourceHydrator}'; echo

    В поле status.sourceHydrator.lastSuccessfulOperation отображаются идентификаторы исходного (drySHA) и отрендеренного (hydratedSHA) коммитов. В целевой ветке репозитория должны появиться отрендеренные манифесты.

При обновлении оператора Argo CD ресурсы commit server не обновляются автоматически. После обновления приведите версию образа в манифесте commit server в соответствие с новой версией Argo CD см. примечание. Также обратите внимание, что ресурсы, созданные вручную, не удаляются при удалении CR ArgoCD — их необходимо удалить отдельно см. раздел Удаление с помощью OperatorHUB

8. Удаление с помощью OperatorHUB

Для полного удаления Argo CD из кластера Nova выполните следующие шаги.

  1. Перейдите в раздел OperatorsУстановленные операторы. Выберите Argo CD.

  2. Перейдите на вкладку Argo CD.

  3. По кнопке действия выберите Удалить ArgoCD.

    argo 3