kind: Application
metadata: { name: root }
spec:
source:
repoURL: https://github.com/org/gitops
path: apps # directory of child Application manifests
destination: { server: https://kubernetes.default.svc, namespace: argocd }
ArgoCD
Topics in this category
ArgoCD
App of Apps
App of Apps is a pattern where a single parent (root) Application deploys other Application resources instead of workloads. The parent points at a Git path containing child Application manifests, so syncing the parent creates/updates all the children. It bootstraps and manages many apps from one entry point.
Real-world example
A root app points at an 'apps/' directory; syncing it creates Applications for monitoring, ingress, and each service.
Applications
Multi-cluster
App of Apps
It centralizes bootstrapping: one root app installs and manages a whole platform or environment's set of applications, giving a single sync point, easy disaster recovery (recreate everything by applying the root), and organized structure. It's a simple way to manage many related apps declaratively before or instead of ApplicationSets.
Real-world example
To rebuild a cluster, the team applies just the root app and ArgoCD recreates every child Application automatically.
GitOps Principles
Multi-cluster
App of Apps
App of Apps stores an explicit Application manifest per child in Git (static list you maintain). ApplicationSets generate Applications dynamically from generators (clusters, Git dirs, PRs), reducing boilerplate and auto-updating as inputs change. App of Apps is simpler for a fixed set; ApplicationSets scale better for many/variable targets.
Real-world example
A fixed platform stack uses App of Apps, while deploying one app to N clusters uses an ApplicationSet cluster generator.
Applications
Multi-cluster
App of Apps
Annotate the child Application resources with sync waves so the parent applies them in order (e.g., infra/CRDs before workloads). Since the parent sync applies the Application CRs, waves on those CRs sequence when each child is created and begins syncing, letting prerequisites come up first.
# child Application manifest
metadata:
annotations:
argocd.argoproj.io/sync-wave: "0" # infra first, apps later
Real-world example
The ingress-controller child app (wave 0) is created before the services (wave 1) that depend on it.
Sync Waves & Hooks
Applications
App of Apps
Install ArgoCD, then apply a single root Application that references a Git directory of child apps covering platform components (ingress, monitoring, cert-manager, secrets) and workloads. Syncing the root cascades to create everything. This 'bootstrap app' is the one manual step; from there GitOps manages the cluster.
kubectl apply -n argocd -f root-app.yaml # the only manual step
Real-world example
A new cluster is fully provisioned by installing ArgoCD and applying one root app that pulls in the entire platform.
Multi-cluster
GitOps Principles
App of Apps
Risks: a broad blast radius (a bad parent change affects many apps), accidental pruning cascading deletes, and manually maintaining child manifests. Mitigate with careful prune settings and finalizers, PR review on the parent repo, splitting into scoped roots per domain, and using Projects to constrain what children can deploy.
Real-world example
The team splits one giant root into per-domain roots and disables prune on critical children to limit blast radius.
RBAC
Applications
App of Apps
Deleting the parent Application can delete its children (and their resources) if finalizers/prune are set for cascading deletion. The resources-finalizer on an Application causes ArgoCD to delete the app's managed resources when the app is removed. Understanding this prevents accidental teardown of whole environments.
metadata:
finalizers:
- resources-finalizer.argocd.argoproj.io
Real-world example
Removing the root app with the resources finalizer tears down every child app and its workloads—useful for env teardown, dangerous by accident.
Applications
Sync & Health
App of Apps
A common pattern is a root App of Apps that deploys one or more ApplicationSets, getting both a single bootstrap entry point and dynamic generation. The root manages a handful of ApplicationSets, each of which generates many Applications, combining simple bootstrapping with scalable, templated app creation.
Real-world example
The root app deploys an ApplicationSet per team; each set then generates that team's per-cluster applications automatically.
Multi-cluster
Applications
App of Apps
It points to a Git repo/path containing the child Application YAML files (or a Helm/Kustomize setup that renders them). When synced, ArgoCD applies those Application resources into the argocd namespace, and each child then syncs its own workloads from its own source.
Real-world example
The parent's path is 'clusters/prod/apps', a directory of Application manifests that become the prod cluster's apps.
Applications
GitOps Principles
App of Apps
Structure per-environment roots (dev/staging/prod), each pointing at env-specific child app configs pinned to revisions/tags. Promotion is a PR that updates the target env's config (e.g., bump the image tag or child app revision), which the env's root syncs. This keeps promotion auditable and environment-scoped.
Real-world example
Promoting a release is a PR bumping the tag in the prod root's child configs, which prod's ArgoCD then rolls out.
Multi-cluster
GitOps Principles
App of Apps