Argo CD Application vs ApplicationSet: What’s the Difference?
By Joris Jamers
If you’ve just started exploring GitOps with Argo CD, you’ve probably come across two key concepts: Application and ApplicationSet. At first glance, they might seem similar—they both deploy apps using Git—but they serve very different purposes, especially as your infrastructure grows.
In this post, we’ll break down what each one is, how they differ, and when you should use one over the other.
What is an Argo CD Application?
An Application in Argo CD is the basic building block of GitOps. Think of it as a recipe that tells Argo CD what to deploy, where to deploy it, and how to keep it in sync with Git.
What does it define?
- A Git repository with your app configuration.
- A path inside that repo where your manifests live.
- A destination cluster and namespace.
- Optional sync settings to automate deployments.
Here’s a simple example:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
spec:
destination:
namespace: default
server: https://kubernetes.default.svc
source:
repoURL: https://github.com/example/repo
path: apps/my-app
project: default
syncPolicy:
automated: {}
This will deploy your app from the Git repo into a Kubernetes namespace and keep it updated if anything changes in Git.
What is an Argo CD ApplicationSet?
Now imagine you have 10 microservices. Or maybe you need to deploy the same app to multiple environments—like dev, staging, and prod—or even to multiple clusters.
Creating one Application
per deployment gets repetitive and hard to maintain.
This is where ApplicationSet comes in. It’s a higher-level controller that automatically generates multiple Applications based on a set of rules.
How does it work?
You define a generator (like a list of clusters or Git branches), and a template that tells Argo CD how to create Applications from that input.
Here’s an example using a list generator to deploy the same app to two clusters:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: my-appset
spec:
generators:
- list:
elements:
- cluster: dev
url: https://dev-cluster.example.com
- cluster: prod
url: https://prod-cluster.example.com
template:
metadata:
name: '{{cluster}}-my-app'
spec:
destination:
server: '{{url}}'
namespace: default
source:
repoURL: https://github.com/example/repo
path: apps/my-app
project: default
This will generate two Applications, one for each cluster, with names like dev-my-app
and prod-my-app
.
Key Differences
Here’s a side-by-side comparison to make things clearer:
Feature | Application | ApplicationSet |
Scope | One app, one environment | Many apps or environments |
Best For | Simple deployments | Scalable, multi-cluster/multi-env setups |
DRY (Don’t Repeat Yourself) | Manual, repetitive | Templated and reusable |
Dynamic Behavior | Static once created | Auto-generates apps based on changing input |
Supported Generators | N/A | Git, List, Matrix, SCM, Cluster, etc. |
Complexity | Beginner-friendly | Slightly more advanced, but powerful |
When Should You Use Each?
Use Application when:
- You’re deploying a small number of services.
- You want full control over each app.
- You’re just getting started with GitOps.
Use ApplicationSet when:
- You’re deploying the same app to multiple clusters or environments.
- You have many services and want to avoid copy-pasting YAML.
- You want to automate deployments based on Git branches, directories, or clusters.
Final Thoughts
Start simple with Argo CD Applications to get the feel of GitOps. As your projects grow and you need to scale out, ApplicationSets will become your best friend.
They help you stay organized, DRY, and make managing large environments much easier.
Next Steps
- Try creating your first
Application
with Argo CD. - Once you’re comfortable, experiment with an
ApplicationSet
using the list generator. - Read the official docs on ApplicationSet for more examples.