Argo CD Explained
Argo CD is the part of this platform that keeps Kubernetes in sync with Git.
The short answer to your question is:
- ApplicationSet is the blueprint or factory
- Application is the generated deploy object for one app
- One ApplicationSet can create many Applications
- Each generated Application can point to a different app folder, namespace, image tag, and host
So Argo CD does not need one separate controller definition for every deployed app. It needs:
- one bootstrap Application
- one ApplicationSet
- many generated Applications created from Git
Easy way to explain it to a client
Think of it like this:
- ApplicationSet = a factory template
- Application = one finished product made by the factory
- Git repo = the source file the factory reads
- Kubernetes = the place where the finished product is delivered
When a new app folder appears in Git, the factory produces a new Argo CD Application automatically. When an app folder changes, the factory updates that Application. When an app folder is removed, the factory removes that Application too.
How it works in this platform
The platform uses the app-of-apps pattern:
- A bootstrap Argo CD Application is applied first.
- That bootstrap Application points to the bootstrap folder in
plateform-gitops. - Inside that folder is the
ApplicationSetmanifest. - The
ApplicationSetscans the Git repo for app folders. - For every matching folder, it creates a separate Argo CD Application.
- Each Application deploys one tenant app into its own namespace.
Workflow diagram
flowchart LR
GitRepo["plateform-gitops Git repo"]
Bootstrap["Bootstrap Argo CD Application"]
AppSet["ApplicationSet"]
AppA["Generated Application A"]
AppB["Generated Application B"]
AppC["Generated Application C"]
NSA["Namespace for App A"]
NSB["Namespace for App B"]
NSC["Namespace for App C"]
K8s["Kubernetes Cluster"]
GitRepo -->|bootstrap manifests| Bootstrap
Bootstrap -->|sync bootstrap folder| AppSet
GitRepo -->|app folders like apps/*/*/*/Chart.yaml| AppSet
AppSet -->|creates one Application per match| AppA
AppSet -->|creates one Application per match| AppB
AppSet -->|creates one Application per match| AppC
AppA --> NSA
AppB --> NSB
AppC --> NSC
NSA --> K8s
NSB --> K8s
NSC --> K8s
Why one ApplicationSet can generate many Applications
The key idea is that the ApplicationSet does not describe a single app. It describes a pattern.
In this platform, the pattern is something like:
- find every
Chart.yamlunder the tenant app folders - read the folder path
- use the path to build:
- Application name
- namespace
- project label
- image values
- host/domain values
So if Git contains 1 app folder, Argo CD creates 1 Application. If Git contains 20 app folders, Argo CD creates 20 Applications.
That is why the UI may show one ApplicationSet, but you see many generated apps underneath it.
Object map
| Argo CD object | What it means | In this platform |
|---|---|---|
| Application | One deployable unit | One tenant app, one namespace, one Helm release |
| ApplicationSet | Generator for Applications | Scans Git and creates one Application per app folder |
| AppProject | Permission boundary | Controls which repo and cluster destination the app can use |
| Bootstrap Application | Starter app | Installs the bootstrap manifests from Git |
What changes when a new app is deployed
When Jenkins writes a new app folder into plateform-gitops:
- Argo CD notices the Git commit changed.
- The ApplicationSet scans the repo again.
- It finds the new app folder.
- It creates a new Argo CD Application for that app.
- That Application renders the Helm chart.
- Kubernetes gets the new Deployment, Service, Ingress, and Namespace.
What changes when an app is updated
If Jenkins updates only the image tag or host in the values file:
- The same Application still exists.
- Argo CD compares live cluster state with Git state.
- It sees the new image tag or values.
- It applies only the difference.
What changes when an app is removed
If the folder disappears from Git:
- The ApplicationSet no longer finds a match.
- The generated Application is removed.
- The live resources can be pruned if pruning is enabled.
Simple mental model
If you need a very short client explanation, use this:
We keep one Argo CD ApplicationSet as a factory.
The factory reads Git and creates one Argo CD Application per deployed app.
Each Application deploys one tenant into its own namespace, so the platform can host many apps from one GitOps repo.
Where this shows up in your repo
- Bootstrap manifests live in
plateform-gitops/bootstrap/ - Tenant app folders live under
plateform-gitops/apps/ - Jenkins writes the tenant app values and then Argo CD syncs them