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

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.
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:
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:
| Sumber | Di mana didefinisikan | Cara dipakai |
|---|---|---|
| Inline | postBuild.substitute | Langsung di Kustomization |
| ConfigMap | postBuild.substituteFrom | Nilai publik dari ConfigMap |
| Secret | postBuild.substituteFrom | Nilai 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.
Penggantian variabel diaktifkan lewat blok postBuild pada Kustomization:
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-secretsUrutan kerja postBuild:
substitute diganti terlebih dahulu.substituteFrom diganti mengikuti urutan daftar.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.
Saat menulis file, kalian bisa menguji hasil substitusi tanpa cluster memakai kubectl kustomize:
kubectl kustomize ./apps/webapp/overlays/prodDan untuk memeriksa hasil akhir setelah Flux menerapkannya:
kubectl get deployment webapp -n webapp -o yaml | grep replicasNote
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.
Variabel memberi kebebasan, tapi butuh disiplin. Empat strategi umum:
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.
Gunakan Kustomization yang sama untuk semua cluster, bedakan nilai lewat ConfigMap platform-vars yang dibuat per cluster:
apiVersion: v1
kind: ConfigMap
metadata:
name: platform-vars
namespace: flux-system
data:
region: ap-southeast-1
domain: cluster-a.internal.acme.comCluster yang berbeda cukup memilih nilai yang berbeda di substitute atau ConfigMap masing-masing.
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.
Variabel juga bisa menjadi flag: nilai true atau false untuk mengaktifkan fitur. Tetapkan nilai default di base, lalu timpa di overlays tertentu.
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
namespace: webapp
spec:
template:
spec:
containers:
- name: webapp
env:
- name: NEW_PAYMENT
value: ${enable_new_payment}Variabel bukan untuk rahasia sungguhan. Untuk itu, Flux bekerja sama dengan ekosistem secret management:
| Alat | Cara kerja dengan Flux |
|---|---|
| SOPS (Mozilla) | Encrypt nilai di dalam file manifest; Flux mendekripsi saat apply memakai age atau KMS |
| Sealed Secrets | Secret di-encrypt jadi SealedSecret di Git; controller Bitnami mendekripsinya di cluster |
| External Secrets Operator | Ambil Secret dari AWS, GCP, Vault, atau HashiCorp, lalu sinkronkan ke cluster |
| Vault | ESO atau sidecar menyuntikkan nilai rahasia saat pod start |
Contoh Kustomization Flux dengan decryption SOPS:
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-ageImportant
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.
snake_case yang deskriptif seperti image_tag, replica_count, ingress_domain; hindari nama generik seperti value1.README.md atau komentar di kustomization.yaml, supaya mudah dilacak.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.
Konfigurasi kini fleksibel tanpa jadi berantakan:
postBuild dengan substitute dan substituteFrom mengatur sumber nilai secara deklaratif.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!