Kustomize untuk skala: struktur kustomization.yaml, perbedaan CRD Kustomization Flux dengan binary Kustomize, pola overlays untuk banyak environment, post-build customization, dan fitur lanjutan.

Di episode 6 kalian sudah mendeploy aplikasi pertama lewat Kustomization Flux. Sekarang kita masuk lebih dalam: Kustomize sebagai bahasa templating, dan bagaimana Flux memakainya untuk skala. Episode ini menjawab pertanyaan "bagaimana mengelola lusinan aplikasi di banyak environment tanpa menduplikasi YAML".
Kita akan bedah struktur kustomization.yaml, bandingkan CRD Kustomization dengan binary Kustomize, pelajari pola overlays, lalu fitur post-build dan fitur lanjutan yang hanya ada di Flux.
Kustomize adalah tool yang me-merge manifest tanpa templating. Satu file kustomization.yaml mendeklarasikan resource dan transformasi:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
namePrefix: prod-
nameSuffix: -v2
commonLabels:
app: webapp
managed-by: flux
commonAnnotations:
owner: platform-team
images:
- name: nginx
newTag: 1.27.3Elemen yang sering dipakai:
resources — daftar file YAML atau direktori lain yang digabung.namePrefix / nameSuffix — menambahkan awalan atau akhiran pada nama semua resource agar tidak bentrok antar environment.commonLabels / commonAnnotations — menyuntikkan label dan anotasi ke semua resource sekaligus.images — menimpa tag image tanpa mengubah file asli.Tip
Kustomize murni bersifat deklaratif dan idempoten: jalankan berkali-kali, hasilnya sama. Ini yang membuatnya cocok dijadikan dasar GitOps dibanding templating yang rawan drift.
Daripada menulis ConfigMap secara manual, gunakan generator agar Flux selalu menyegarkan nilainya saat ada perubahan:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
configMapGenerator:
- name: app-config
files:
- config/app.properties
literals:
- LOG_LEVEL=info
secretGenerator:
- name: app-secret
envs:
- secret.envPatches mengubah manifest yang sudah ada tanpa menulis ulang. Ada dua gaya: strategic merge dan JSON patch:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
patches:
- target:
kind: Deployment
name: webapp
patch: |-
spec:
template:
spec:
containers:
- name: webapp
resources:
limits:
memory: 512Mi[
{
"op": "add",
"path": "/spec/template/spec/containers/0/env",
"value": [
{
"name": "FEATURE_X",
"value": "true"
}
]
}
]Jangan tertukar: kind: Kustomization di Flux bukan binary Kustomize. Binary Kustomize hanya merender YAML di sisi client; CRD Flux adalah controller yang menjalankan Kustomize di dalam cluster dan terus-menerus merekonsiliasi. Perbedaannya:
| Aspek | Binary Kustomize | CRD Kustomization Flux |
|---|---|---|
| Lokasi eksekusi | Client (laptop/CI) | In-cluster controller |
| Rekonsiliasi | Tidak ada (one-shot) | Terus-menerus sesuai interval |
| Health assessment | Tidak ada | Built-in: Deployment, Pod, Service, dll |
| Dependency | Tidak ada | dependsOn antar Kustomization |
| Prune | Tidak ada | prune: true untuk GC |
| Output | File YAML | Langsung di-apply ke cluster |
Fitur Flux yang tidak ada di binary:
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: apps
namespace: flux-system
spec:
interval: 10m
timeout: 5m
dependsOn:
- name: infrastructure
path: ./apps
prune: true
wait: true
sourceRef:
kind: GitRepository
name: fleethealthChecks — menunggu resource benar-benar sehat sebelum menganggap sukses.timeout — batas waktu satu siklus rekonsiliasi (default 5 menit).dependsOn — Kustomization lain yang harus selesai dan sehat dulu.Cara paling umum mengelola banyak environment adalah pola base + overlays:
apps/webapp/
├── base/
│ ├── kustomization.yaml
│ ├── deployment.yaml
│ └── service.yaml
└── overlays/
├── dev/
│ └── kustomization.yaml
├── staging/
│ └── kustomization.yaml
└── prod/
└── kustomization.yamlbase berisi manifest netral, sementara tiap overlay mereferensikan base dan menimpa bagian yang spesifik environment:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
namePrefix: prod-
commonLabels:
env: prod
replicas:
- name: webapp
count: 4
images:
- name: webapp
newTag: 1.2.0Lalu buat Kustomization Flux per environment:
flux create kustomization webapp-prod \
--source=fleet \
--path="./apps/webapp/overlays/prod" \
--prune=true \
--interval=5mNote
Prinsip DRY benar-benar berlaku: satu definisi deployment di base, dan setiap environment hanya menyimpan delta. Perubahan besar cukup dilakukan sekali di base dan otomatis menyebar ke semua overlays.
Flux menambahkan lapisan di luar Kustomize: post-build variable substitution. Ini dibahas detail di episode 11, tapi intinya ditulis di sini karena kaitannya erat dengan Kustomize:
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
spec:
path: ./apps/webapp/overlays/prod
postBuild:
substitute:
cluster: production
substituteFrom:
- kind: ConfigMap
name: cluster-varsNilai dari substitute dan substituteFrom menggantikan variabel bertanda dollar di seluruh YAML sebelum diterapkan.
Warning
Ingat urutan eksekusi: Flux menjalankan Kustomize build dulu (merge, patch, generator), lalu melakukan variable substitution pada hasilnya. Jadi variabel bisa dipakai di field mana pun di manifest yang dirender, tapi tidak bisa mengubah struktur kustomization.yaml itu sendiri.
Beberapa opsi yang sering muncul saat produksi:
force: true — mengganti resource dengan immutable field (misal nama label selector Deployment). Gunakan dengan hati-hati karena Flux menghapus lalu membuat ulang resource.prune: true — garbage collection untuk resource yang sudah tidak ada di Git. Wajib diaktifkan pada level aplikasi.serviceAccountName — Kustomization dijalankan dengan identitas service account tertentu, penting untuk tenancy (episode 12).wait: true — Flux menunggu semua resource sehat sebelum menandai sukses, berguna bila Kustomization lain bergantung padanya.flux create kustomization webapp-prod \
--source=fleet \
--path="./apps/webapp/overlays/prod" \
--prune=true \
--force=true \
--wait=true \
--interval=5mKustomize bersama Flux adalah cara terbaik menjaga repository tetap ramping:
kustomization.yaml mengatur resources, generator, prefix/suffix, label, dan images.Manifest sudah bisa diskalakan. Di episode 8 kita akan mengelola Helm charts: HelmRepository sebagai source, HelmRelease untuk release, strategi pengelolaan values, dan tata cara install, upgrade, serta rollback. Sampai jumpa!