Перейти к содержанию

ArgoCD App of Apps pattern

Kubernetes · GitOps
Изучено

Проблема

На кластере — 30–50 приложений: ingress-nginx, cert-manager, prometheus, приложения продукта. Каждый Application ArgoCD создаётся вручную через kubectl apply или Helm, синхронизация непрозрачна, забыть про одно — легко. Онбординг нового кластера превращается в чек-лист из 40 kubectl apply.

Решение

Паттерн app-of-apps: один root-Application указывает на Git-директорию, в которой лежат манифесты других Application'ов. ArgoCD подхватывает root, ArgoCD подхватывает детей, дети подхватывают рабочие нагрузки. Состояние всего кластера описано в одном репозитории и разворачивается одним kubectl apply root-манифеста.

Пример

Структура репо argocd-apps/:

argocd-apps/
├── root.yaml                     # Единственный вход
└── apps/
    ├── ingress-nginx.yaml
    ├── cert-manager.yaml
    ├── prometheus.yaml
    └── app-product.yaml

root.yaml — единственный манифест, который нужно применить вручную:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: root
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/acme/argocd-apps.git
    targetRevision: HEAD
    path: apps
  destination:
    server: https://kubernetes.default.svc
    namespace: argocd
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

apps/ingress-nginx.yaml — типовой дочерний Application:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: ingress-nginx
  namespace: argocd
spec:
  project: default
  source:
    chart: ingress-nginx
    repoURL: https://kubernetes.github.io/ingress-nginx
    targetRevision: 4.11.3
    helm:
      valueFiles: [values.yaml]
  destination:
    server: https://kubernetes.default.svc
    namespace: ingress-nginx
  syncPolicy:
    automated: { prune: true, selfHeal: true }
    syncOptions: [CreateNamespace=true]

Онбординг нового кластера теперь:

kubectl apply -f root.yaml
# Всё. ArgoCD сам создаёт 40 оставшихся приложений.

Когда применять

  • Кластеров больше одного (staging + prod) и нужна воспроизводимость.
  • Приложений на кластере больше десяти.
  • Команда хочет смотреть состояние кластера через Git, а не kubectl get all.

Источник

Как применить у себя

  1. Завести отдельный репозиторий argocd-apps (или каталог в инфра-моно).
  2. Вынести туда все существующие Application'ы.
  3. Написать root.yaml, указать на каталог с детьми.
  4. Применить root вручную один раз.
  5. Удостовериться, что добавление нового приложения = один PR в репо, без ручного kubectl. После этого — статус Изучено.