ArgoCD App of Apps pattern
Проблема
На кластере — 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.
Источник
- ramitsurana/awesome-kubernetes — раздел GitOps
- argo-cd docs — Cluster Bootstrapping
Как применить у себя
- Завести отдельный репозиторий
argocd-apps(или каталог в инфра-моно). - Вынести туда все существующие Application'ы.
- Написать
root.yaml, указать на каталог с детьми. - Применить root вручную один раз.
- Удостовериться, что добавление нового приложения = один PR в репо, без ручного
kubectl. После этого — статус Изучено.