Belajar GitOps dengan ArgoCD - ApplicationSets - Advanced Application Management
Episode 11 of 36

Belajar GitOps dengan ArgoCD - ApplicationSets - Advanced Application Management

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

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

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".

Motivasi: Masalah yang Dipecahkan

Tanpa ApplicationSet, kita menghadapi tiga masalah:

  1. Repetisi — satu Application per kombinasi aplikasi x cluster x environment, hampir identik isinya.
  2. Ketertinggalan — menambah cluster berarti menulis ulang semua Application manual.
  3. Inkonsistensi — mudah salah ketik saat menyalin manifest berulang kali.

ApplicationSet menjawab dengan satu abstraksi: template (bentuk Application) + generator (sumber parameter yang menentukan berapa banyak dan seperti apa Application dihasilkan).

Struktur ApplicationSet

ArgoCDapplicationset-guestbook.yaml
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: guestbook
  • generators 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.
  • Application yang dihasilkan (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.

Generator Types

ApplicationSet menyediakan tujuh tipe generator:

GeneratorSumber parameterUse case khas
ListDaftar elemen statisKombinasi kecil yang sudah pasti
ClusterCluster yang terdaftar di ArgoCDDeploy ke semua cluster
Git (files)Konten file JSON/YAML di repoKonfigurasi per-tenant
Git (directories)Subdirektori repoMonorepo, app per folder
MatrixProduk kartesius dua generatorKombinasi cluster x environment
MergeGabungan parameter generatorOverride nilai per cluster
SCM ProviderRepos dari GitHub/GitLab orgAuto-discover repo aplikasi
Pull RequestPR/merge request yang terbukaPR preview environment

List Generator

Paling sederhana — persis contoh di atas: daftar elemen statis yang masing-masing menjadi satu Application.

Cluster Generator

Membaca cluster yang terdaftar di ArgoCD (dari episode 9) dan menghasilkan Application untuk setiap cluster yang cocok dengan selector label:

ArgoCDCluster generator dengan selector
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: guestbook

Parameter 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.

Git Generator

Membaca struktur repository Git:

  • Directories — setiap subdirektori yang cocok pola menjadi satu Application, dengan parameter path dan path.basename.
  • Files — membaca file JSON/YAML di repo; setiap key file menjadi parameter. Cocok untuk daftar tenant: buat file tenant-a.json, ArgoCD menghasilkan Application untuk tenant-a.
ArgoCDGit directories generator
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}}'

Matrix & Merge Generator

  • Matrix menghasilkan produk kartesius dua generator — misalnya semua kombinasi cluster x environment. Dua generator dalam satu matrix menghasilkan kombinasi semua parameter.
  • Merge menggabungkan parameter dua generator, dengan prioritas: parameter generator kedua menimpa yang pertama bila namanya sama.

SCM Provider & Pull Request Generator

  • SCM Provider mengkueri GitHub/GitLab organisasi dan menghasilkan satu parameter per repository — cara men-deploy setiap repo di organisasi tanpa mendaftar manual.
  • Pull Request menghasilkan satu Application per PR yang terbuka. Ini fondasi PR preview: setiap PR membangun environment sementara, dan Application-nya hilang otomatis saat PR ditutup.
ArgoCDPR generator untuk preview
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}}'

Use Case Nyata

  • Multi-cluster deployments — cluster generator menyebarkan aplikasi ke semua cluster bertanda label, misalnya env=prod.
  • Monorepo — git directories generator melahirkan satu Application per folder apps/*.
  • Environment promotion — ganti nilai targetRevision per environment di matrix generator: dev memakai branch dev, prod memakai tag v1.2.3.
  • Tenant provisioning — git files generator membaca daftar tenant dari file JSON; menambah tenant = menambah file.
  • PR preview — pull request generator membangun environment preview per PR dan membersihkannya saat PR ditutup.

Substitusi Parameter & Propagasi Label

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.

Kesalahan Umum (Common Pitfalls)

  1. Melupakan 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.
  2. Template tidak valid untuk sebagian kombinasi. Misalnya aplikasi yang membutuhkan nilai yang tidak ada di generator matrix — pastikan semua kombinasi menghasilkan manifest yang valid.
  3. Menghapus Application manual. Application hasil generator jangan dihapus manual — controller akan membuatnya lagi. Verifikasi dengan argocd app list, lalu hapus dengan mengubah generator atau menghapus ApplicationSet.
  4. Selector cluster terlalu lebar. matchLabels kosong berarti semua cluster — termasuk yang masih eksperimen. Selalu beri label eksplisit.
  5. Lupa resource limit PR preview. Environment preview per PR bisa menguras cluster. Pasang maxResources atau batasi jumlah PR yang diizinkan.

Penutup

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:

  • ApplicationSet = template Application + generator parameter, dikelola otomatis oleh controller.
  • Cluster generator dan Git generator adalah tulang punggung multi-cluster dan monorepo.
  • Matrix/merge memungkinkan kombinasi dan override parameter yang fleksibel.
  • PR generator membuka jalan untuk environment preview otomatis.
  • Application hasil generator tidak boleh dihapus manual.

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!

Belajar GitOps dengan ArgoCD - ApplicationSets - Advanced Application Management | Belajar GitOps dengan ArgoCD