CoursesArgo CDIntermediate

App-of-apps & ApplicationSets

Manage many apps/clusters.

Advanced14 min · lesson 7 of 12

Managing dozens of Applications one YAML at a time does not scale, so Argo CD has two patterns for managing apps at scale. App-of-apps is a single parent Application whose source is a Git directory full of Application manifests — Argo CD syncs the parent, which creates all the child apps, so one bootstrap app manages a whole platform. It is simple and powerful: your entire set of apps is declared in Git and rolled out by syncing one root.

TWO PATTERNS FOR MANY APPS
App-of-apps
Root Application
one bootstrap app
Sources a Git dir
folder of Application YAMLs
Syncing root
creates/manages every child app
ApplicationSet
Generator
list / cluster / Git / matrix
Template
one parameterized Application spec
Controller generates
one App per generated entry
Both declare many apps from one place — app-of-apps via a parent app, ApplicationSet via generator + template for fleet scale.
root app-of-apps
spec:
source:
repoURL: https://git.acme.internal/platform/apps.git
path: applications/ # a directory of Application YAMLs
destination: { server: https://kubernetes.default.svc, namespace: argocd }
syncPolicy: { automated: { prune: true, selfHeal: true } }
# syncing this one app creates/manages every child Application in the directory

ApplicationSets

ApplicationSets go further: a controller that generates Applications from a template plus a generator. The list generator makes one app per entry; the cluster generator makes one per registered cluster; the Git generator makes one per directory or file in a repo; the matrix/merge generators combine them. This is how you deploy the same app to twenty clusters, or every team’s app from a monorepo, from a single templated definition — the answer to fleet-scale GitOps.

applicationset.yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
spec:
generators:
- clusters: {} # one Application per registered cluster
template:
metadata: { name: "monitoring-{{name}}" }
spec:
source: { repoURL: ..., path: monitoring, targetRevision: v2.1.0 }
destination: { server: "{{server}}", namespace: monitoring }
syncPolicy: { automated: { selfHeal: true } }
A templated set change fans out to every generated app
An ApplicationSet or app-of-apps concentrates power: editing the template or the parent changes every generated child at once, across every cluster it targets. That is the point, and the risk — a bad template can roll a broken change fleet-wide. Review changes to these root/template definitions with extra care, pin targetRevisions, and consider progressive rollout (sync waves, or ApplicationSet progressive syncs) so a fleet-wide change lands gradually.