Belajar GitOps - FluxCD - Variable Substitution & Configuration
Episode 11 of 36

Belajar GitOps - FluxCD - Variable Substitution & Configuration

Konfigurasi tanpa duplikasi: sintaks variable substitution, postBuild dengan substitute dan substituteFrom, strategi konfigurasi per environment dan multi-cluster, integrasi SOPS dan operator secret.

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

Pendahuluan

Di episode 10 kalian sudah bisa mengatur urutan deploy. Satu masalah tersisa: bagaimana menjaga satu kumpulan manifest tetap berlaku untuk banyak cluster dan environment, tanpa menulis ulang YAML? Jawabannya adalah variable substitution.

Episode ini membahas sintaks variabel Flux, postBuild beserta substitute dan substituteFrom, strategi konfigurasi, integrasi secret management, dan praktik terbaiknya.

Variable Substitution

Flux menyediakan variabel yang bisa dipakai di dalam manifest yang dirender. Sintaksnya: tanda dollar, lalu nama variabel di antara kurung kurawal. Nilai variabel didefinisikan lewat blok postBuild pada Kustomization. Contoh penerapan dalam manifest:

Penggunaan variabel dalam manifest
apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp
  namespace: webapp
spec:
  replicas: ${replica_count}
  template:
    spec:
      containers:
        - name: webapp
          image: registry.internal.acme.com/webapp:${image_tag}
          env:
            - name: CLUSTER
              value: ${cluster_name}

Sumber nilai variabel:

SumberDi mana didefinisikanCara dipakai
InlinepostBuild.substituteLangsung di Kustomization
ConfigMappostBuild.substituteFromNilai publik dari ConfigMap
SecretpostBuild.substituteFromNilai rahasia dari Secret

Ada juga variabel bawaan yang otomatis tersedia: CLUSTER_NAME berisi nama cluster dari direktori clusters/ yang dipakai saat bootstrap, dan nilai lain yang kalian set ketika flux bootstrap --cluster-domain atau di blok substitute.

Tip

Karena nilai diganti sebelum diterapkan, variabel paling berguna untuk nilai yang berubah antar environment: jumlah replika, tag image, nama namespace, domain, dan kredensial non-rahasia. Jangan dipakai untuk mengubah struktur YAML.

Post-Build Variable Substitution

Penggantian variabel diaktifkan lewat blok postBuild pada Kustomization:

substitute dan substituteFrom
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: webapp
  namespace: flux-system
spec:
  interval: 10m
  path: ./apps/webapp/overlays/prod
  prune: true
  sourceRef:
    kind: GitRepository
    name: fleet
  postBuild:
    substitute:
      replica_count: "4"
      image_tag: "1.2.0"
      cluster_name: "prod-eks-a"
    substituteFrom:
      - kind: ConfigMap
        name: platform-vars
      - kind: Secret
        name: app-secrets

Urutan kerja postBuild:

  1. Kustomize merender manifest (merge, patch, generator).
  2. Variabel dari substitute diganti terlebih dahulu.
  3. Variabel dari substituteFrom diganti mengikuti urutan daftar.
  4. Hasil akhir diterapkan ke cluster.

Warning

Secret dan ConfigMap untuk substituteFrom harus berada di namespace yang sama dengan Kustomization (default flux-system). Jika sebuah variabel didefinisikan di dua sumber, yang muncul terakhir dalam urutan yang menang.

Proses Substitusi dengan Kubectl

Saat menulis file, kalian bisa menguji hasil substitusi tanpa cluster memakai kubectl kustomize:

Render kustomization di lokal
kubectl kustomize ./apps/webapp/overlays/prod

Dan untuk memeriksa hasil akhir setelah Flux menerapkannya:

Lihat hasil render di cluster
kubectl get deployment webapp -n webapp -o yaml | grep replicas

Note

Substitusi terjadi di sisi Flux, bukan di file. File di repo tetap berisi placeholder, jadi selalu buka output kubectl kustomize untuk memastikan placeholder sudah benar sebelum commit.

Strategi Konfigurasi

Variabel memberi kebebasan, tapi butuh disiplin. Empat strategi umum:

Environment-Specific

Satu overlays per environment (dev, staging, prod), masing-masing dengan substitute sendiri. Ini melanjutkan pola overlays dari episode 7 — variabel menambah fleksibilitas tanpa menambah file.

Multi-Cluster

Gunakan Kustomization yang sama untuk semua cluster, bedakan nilai lewat ConfigMap platform-vars yang dibuat per cluster:

ConfigMap variabel per cluster
apiVersion: v1
kind: ConfigMap
metadata:
  name: platform-vars
  namespace: flux-system
data:
  region: ap-southeast-1
  domain: cluster-a.internal.acme.com

Cluster yang berbeda cukup memilih nilai yang berbeda di substitute atau ConfigMap masing-masing.

Tenant-Specific

Untuk multi-tenancy, variabel per tenant disimpan di namespace tenant, dan Kustomization tenant memakai substituteFrom dengan ConfigMap di namespace-nya. Detail tenancy dibahas di episode 12.

Feature Flags

Variabel juga bisa menjadi flag: nilai true atau false untuk mengaktifkan fitur. Tetapkan nilai default di base, lalu timpa di overlays tertentu.

Feature flag via variabel
apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp
  namespace: webapp
spec:
  template:
    spec:
      containers:
        - name: webapp
          env:
            - name: NEW_PAYMENT
              value: ${enable_new_payment}

Integrasi Secret Management

Variabel bukan untuk rahasia sungguhan. Untuk itu, Flux bekerja sama dengan ekosistem secret management:

AlatCara kerja dengan Flux
SOPS (Mozilla)Encrypt nilai di dalam file manifest; Flux mendekripsi saat apply memakai age atau KMS
Sealed SecretsSecret di-encrypt jadi SealedSecret di Git; controller Bitnami mendekripsinya di cluster
External Secrets OperatorAmbil Secret dari AWS, GCP, Vault, atau HashiCorp, lalu sinkronkan ke cluster
VaultESO atau sidecar menyuntikkan nilai rahasia saat pod start

Contoh Kustomization Flux dengan decryption SOPS:

Kustomization dengan SOPS decryption
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: webapp
  namespace: flux-system
spec:
  interval: 10m
  path: ./apps/webapp/overlays/prod
  prune: true
  sourceRef:
    kind: GitRepository
    name: fleet
  decryption:
    provider: sops
    secretRef:
      name: sops-age

Important

Prinsip utamanya: rahasia jangan pernah ada dalam bentuk plaintext di Git. SOPS mengenkripsi file, Sealed Secrets mengenkripsi Secret, ESO memindahkan nilai langsung dari sumber. Pilih satu pola dan terapkan konsisten.

Praktik Terbaik

  • Minimal duplikasi — taruh nilai yang sama di satu tempat, biarkan overlays hanya menimpa delta.
  • Penamaan jelas — gunakan snake_case yang deskriptif seperti image_tag, replica_count, ingress_domain; hindari nama generik seperti value1.
  • Dokumentasi — buat daftar variabel per overlays, misal di README.md atau komentar di kustomization.yaml, supaya mudah dilacak.
  • Validasi — cek placeholder yang tidak tersubstitusi sebelum deploy; Flux melaporkan variabel yang tidak terdefinisi sebagai error rekonsiliasi.
Verifikasi variabel tidak tersisa
flux get kustomizations
kubectl get deployment webapp -n webapp -o jsonpath='{.spec.replicas}'

Tip

Pola yang sering dipakai tim mature: file kustomization.yaml di clusters/<cluster>/ berisi substitute khusus cluster, sementara substituteFrom menyimpan nilai bersama. Kombinasi keduanya menyeimbangkan konsistensi dan fleksibilitas.

Penutup

Konfigurasi kini fleksibel tanpa jadi berantakan:

  • Sintaks variabel memisahkan nilai dari struktur manifest.
  • postBuild dengan substitute dan substituteFrom mengatur sumber nilai secara deklaratif.
  • Strategi environment-specific, multi-cluster, tenant, dan feature flag menutupi hampir semua kebutuhan.
  • SOPS, Sealed Secrets, External Secrets Operator, dan Vault menjaga rahasia tetap aman.
  • Praktik terbaik menjaga repository tetap bisa dibaca dan di-audit.

Kalian sudah punya fondasi lengkap untuk GitOps single-cluster. Di episode 12 kita akan menerapkan multi-tenancy dengan Flux: model tenancy, flux create tenant, isolasi namespace, dan service account per tenant. Sampai jumpa!