Otomasi pembuatan Application dalam jumlah besar dengan ApplicationSet: tujuh tipe generator, template dinamis, dan use case nyata dari multi-cluster hingga PR preview environment.

Di episode 10 sebelumnya kita belajar membatasi akses dengan ArgoCD Projects. Tapi ada masalah praktis yang belum tersentuh: membuat Application itu sendiri masih manual. Untuk 3 aplikasi itu wajar; untuk 10 cluster dikali 5 tim dikali 4 aplikasi — itu 200 Application yang harus ditulis, dijaga, dan dihapus. Tidak realistis. Pada episode ini kita membahas ApplicationSet — sumber daya ArgoCD yang mendefinisikan templat Application dan mesin generator yang meledakkannya menjadi puluhan atau ratusan Application secara otomatis.
Mengapa ini penting? ApplicationSet adalah jawaban ArgoCD untuk skala. Dengan satu file YAML, kalian bisa menyebarkan aplikasi ke semua cluster sekaligus, mempromosikan environment dengan mengubah satu baris, atau menciptakan environment preview untuk setiap pull request. Inilah fitur yang membedakan setup "demo" dari setup "enterprise".
Tanpa ApplicationSet, kita menghadapi tiga masalah:
ApplicationSet menjawab dengan satu abstraksi: template (bentuk Application) + generator (sumber parameter yang menentukan berapa banyak dan seperti apa Application dihasilkan).
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: guestbook
namespace: argocd
spec:
goTemplate: true
generators:
- list:
elements:
- cluster: dev
url: https://kubernetes.default.svc
- cluster: prod
url: https://eks-prod.example.com
template:
metadata:
name: guestbook-{{.cluster}}
spec:
project: default
source:
repoURL: https://github.com/argoproj/argocd-example-apps.git
path: guestbook
destination:
server: '{{.url}}'
namespace: guestbookgenerators menentukan kumpulan parameter. Di sini, list menghasilkan dua elemen: cluster dev dan prod.template adalah kerangka Application; nilai seperti parameter cluster dan url diisi dari generator.guestbook-dev, guestbook-prod) dikelola penuh oleh ApplicationSet controller — jika parameter berubah, Application ikut diperbarui.Note
ApplicationSet mendukung dua mode templating: fasttemplate default (memakai cluster tanpa titik) dan Go template (goTemplate: true, memakai cluster dengan awalan titik). Go template lebih fleksibel untuk logika bersyarat — pakai itu sejak awal agar tidak perlu migrasi.
ApplicationSet menyediakan tujuh tipe generator:
| Generator | Sumber parameter | Use case khas |
|---|---|---|
| List | Daftar elemen statis | Kombinasi kecil yang sudah pasti |
| Cluster | Cluster yang terdaftar di ArgoCD | Deploy ke semua cluster |
| Git (files) | Konten file JSON/YAML di repo | Konfigurasi per-tenant |
| Git (directories) | Subdirektori repo | Monorepo, app per folder |
| Matrix | Produk kartesius dua generator | Kombinasi cluster x environment |
| Merge | Gabungan parameter generator | Override nilai per cluster |
| SCM Provider | Repos dari GitHub/GitLab org | Auto-discover repo aplikasi |
| Pull Request | PR/merge request yang terbuka | PR preview environment |
Paling sederhana — persis contoh di atas: daftar elemen statis yang masing-masing menjadi satu Application.
Membaca cluster yang terdaftar di ArgoCD (dari episode 9) dan menghasilkan Application untuk setiap cluster yang cocok dengan selector label:
spec:
generators:
- cluster:
selector:
matchLabels:
env: prod
template:
metadata:
name: '{{.name}}-guestbook'
spec:
source:
repoURL: https://github.com/devnull/gitops-repo.git
path: guestbook
destination:
server: '{{.server}}'
namespace: guestbookParameter name diambil dari nama cluster, server dari alamat API, dan label cluster bisa diakses lewat field metadata.labels. Menambah cluster baru yang diberi label env=prod langsung membuat Application baru secara otomatis — tanpa mengubah apa pun.
Membaca struktur repository Git:
path dan path.basename.tenant-a.json, ArgoCD menghasilkan Application untuk tenant-a.spec:
generators:
- git:
repoURL: https://github.com/devnull/gitops-repo.git
revision: main
directories:
- path: apps/*
template:
metadata:
name: '{{.path.basename}}'
spec:
source:
repoURL: https://github.com/devnull/gitops-repo.git
path: '{{.path}}'cluster x environment. Dua generator dalam satu matrix menghasilkan kombinasi semua parameter.spec:
generators:
- pullRequest:
github:
owner: devnull
repo: billing-api
labels: [preview]
template:
metadata:
name: 'billing-pr-{{.number}}'
spec:
source:
repoURL: https://github.com/devnull/billing-api.git
path: manifests/overlays/preview
targetRevision: '{{.head_sha}}'
destination:
namespace: 'billing-preview-{{.number}}'env=prod.apps/*.targetRevision per environment di matrix generator: dev memakai branch dev, prod memakai tag v1.2.3.Semua field template bisa diisi parameter generator — nama, path, namespace, bahkan project. Label dan annotation yang ditulis di template.metadata akan menyebar ke Application hasil generasi, sehingga bisa dipakai untuk filtering di UI dan integrasi dengan tool lain (misalnya tag monitoring per aplikasi). Jika ingin label dihasilkan dari parameter, gunakan templating pada nilai label juga.
goTemplate: true. Sintaks templat Go (parameter dengan awalan titik, seperti cluster) hanya valid saat Go template aktif; tanpa flag itu, gunakan notasi tanpa titik. Inkonsistensi keduanya sering bikin manifest tidak tergenerasi.argocd app list, lalu hapus dengan mengubah generator atau menghapus ApplicationSet.matchLabels kosong berarti semua cluster — termasuk yang masih eksperimen. Selalu beri label eksplisit.maxResources atau batasi jumlah PR yang diizinkan.Episode ini membuka kekuatan ApplicationSet: struktur template-plus-generator, ketujuh tipe generator (list, cluster, git files/directories, matrix, merge, SCM provider, pull request), use case dari multi-cluster sampai PR preview, serta cara parameter menggantikan bagian template Application.
Poin yang harus kalian bawa:
Semua aplikasi ini masih didefinisikan sebagai manifest yang disimpan di Git — dan di situlah masalah klasik GitOps muncul: bagaimana dengan secret? Di episode 12 selanjutnya kita membahas Secrets Management: perbandingan Sealed Secrets, External Secrets Operator, dan SOPS, plus praktik terbaik enkripsi, rotasi, dan RBAC untuk secret. Sampai jumpa di episode 12!