Kustomize #
Kustomize adalah tool konfigurasi Kubernetes yang dibangun langsung ke dalam kubectl — tidak perlu install tambahan. Ia menggunakan pendekatan overlay: kamu mendefinisikan konfigurasi dasar sekali (base), lalu setiap environment menambahkan atau mengganti bagian tertentu (overlay) tanpa menduplikasi seluruh manifest. Tidak ada templating, tidak ada sintaks baru — hanya YAML biasa yang di-patch.
Base dan Overlays #
Prinsip Kustomize:
base/ ← konfigurasi yang sama di semua environment
overlays/
dev/ ← perubahan untuk development
staging/ ← perubahan untuk staging
production/ ← perubahan untuk production
Deployment akhir = base + overlay patches
Tidak ada duplikasi: perubahan di base otomatis ter-inherit semua overlay
Struktur Direktori #
k8s/
├── base/
│ ├── kustomization.yaml
│ ├── deployment.yaml
│ ├── service.yaml
│ └── configmap.yaml
└── overlays/
├── development/
│ ├── kustomization.yaml
│ └── deployment-patch.yaml
├── staging/
│ ├── kustomization.yaml
│ └── deployment-patch.yaml
└── production/
├── kustomization.yaml
├── deployment-patch.yaml
└── hpa.yaml ← resource tambahan hanya di production
base/kustomization.yaml #
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
- configmap.yaml
# Label yang ditambahkan ke SEMUA resource
commonLabels:
app.kubernetes.io/managed-by: kustomize
# Annotation yang ditambahkan ke SEMUA resource
commonAnnotations:
owner: platform-team
# base/deployment.yaml — konfigurasi dasar
apiVersion: apps/v1
kind: Deployment
metadata:
name: api # nama "vanilla", tanpa prefix/suffix
spec:
replicas: 1
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: my-registry.io/api:latest
resources:
requests:
cpu: "100m"
memory: "128Mi"
overlays/production/kustomization.yaml #
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: production # override namespace untuk semua resource
bases:
- ../../base
resources:
- hpa.yaml # resource tambahan hanya di production
# Override image tag
images:
- name: my-registry.io/api
newTag: v2.1.0 # pin ke versi spesifik
# Patch strategic merge: override sebagian resource
patches:
- path: deployment-patch.yaml
target:
kind: Deployment
name: api
# Patch inline (alternatif dari file terpisah)
- target:
kind: Deployment
name: api
patch: |-
- op: replace
path: /spec/replicas
value: 5
# overlays/production/deployment-patch.yaml
# Strategic Merge Patch: hanya definisikan yang mau di-override
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
template:
spec:
containers:
- name: api
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "2000m"
memory: "2Gi"
env:
- name: APP_ENV
value: production
- name: LOG_LEVEL
value: warn
Dua Jenis Patch #
Strategic Merge Patch #
# Merge secara "cerdas" berdasarkan struktur Kubernetes
# Containers di-merge berdasarkan nama, bukan di-replace seluruhnya
spec:
template:
spec:
containers:
- name: api # ← match berdasarkan nama
env:
- name: NEW_VAR # ← tambah env var, tidak hapus yang lain
value: "new"
JSON Patch (RFC 6902) #
# Operasi eksplisit: add, remove, replace, move, copy, test
patches:
- target:
kind: Deployment
name: api
patch: |-
- op: replace
path: /spec/replicas
value: 5
- op: add
path: /spec/template/spec/containers/0/env/-
value:
name: NEW_ENV
value: "production"
- op: remove
path: /spec/template/spec/containers/0/livenessProbe
ConfigMap dan Secret Generator #
Kustomize bisa generate ConfigMap dan Secret dari file, dan otomatis membuat hash suffix di nama — sehingga setiap perubahan konfigurasi memicu rolling restart Deployment:
# kustomization.yaml
configMapGenerator:
- name: app-config
files:
- config/nginx.conf # key = nginx.conf, value = isi file
- config/app.yaml
literals:
- APP_ENV=production
- LOG_LEVEL=warn
secretGenerator:
- name: db-credentials
literals:
- username=appuser
- password=S3cur3P@ss
type: Opaque
Hasil generate:
ConfigMap: app-config-7hgk9m2x ← hash suffix otomatis
Secret: db-credentials-k8f2p1nq
Saat konfigurasi berubah:
ConfigMap baru: app-config-9x2k4p1m ← hash berbeda
→ Deployment yang referensi ConfigMap ini otomatis di-rolling restart
Transformers #
# Tambahkan prefix ke semua nama resource
namePrefix: prod-
# Deployment "api" → "prod-api"
# Tambahkan suffix
nameSuffix: -v2
# Tambahkan label ke semua resource
commonLabels:
env: production
team: backend
# Tambahkan annotation ke semua resource
commonAnnotations:
kubernetes.io/change-cause: "deploy v2.1.0"
Perintah Kustomize #
# Preview output akhir (tidak apply)
kubectl kustomize overlays/production
# Apply ke cluster
kubectl apply -k overlays/production
# Diff: perbedaan antara yang ada di cluster dan yang akan di-apply
kubectl diff -k overlays/production
# Kustomize standalone (lebih baru, lebih banyak fitur)
kustomize build overlays/production | kubectl apply -f -
Kustomize vs Helm: Kapan Mana? #
Pilih Kustomize jika:
✓ Ingin tetap pakai YAML plain tanpa templating
✓ Struktur aplikasi relatif simpel
✓ Tim tidak familiar dengan Go templating syntax Helm
✓ Sudah punya manifest yang ingin di-customize tanpa tulis ulang
✓ Ingin tool yang built-in kubectl tanpa install tambahan
✓ GitOps dengan Flux (Flux punya Kustomization CRD native)
Pilih Helm jika:
✓ Butuh logic yang lebih complex (if/else, loops, range)
✓ Ingin package dan distribute chart ke orang lain
✓ Perlu dependency management (chart yang pakai chart lain)
✓ Tim sudah familiar dengan Helm
✓ Ingin manfaatkan chart yang sudah ada (ArtifactHub)
✓ Butuh atomic upgrade dengan rollback otomatis
Bisa dikombinasikan:
Helm render template → output YAML → Kustomize overlay untuk adjustment
helm template my-app ./chart | kubectl kustomize - | kubectl apply -f -
Ringkasan #
- Kustomize built-in kubectl, tanpa install —
kubectl apply -ksudah tersedia di semua versi kubectl modern; tidak ada dependency tambahan.- Base + overlay, bukan copy-paste — perubahan di base otomatis ter-inherit semua overlay; tidak ada drift antar environment karena duplikasi.
- configMapGenerator dengan hash suffix — Kustomize otomatis tambah hash di nama ConfigMap; rolling restart terpicu saat konfigurasi berubah tanpa annotation manual.
- Strategic merge patch untuk perubahan parsial — tidak perlu definisikan ulang seluruh manifest; cukup definisikan bagian yang berubah, Kustomize merge sisanya dari base.
- JSON patch untuk operasi presisi —
add,remove,replacevia path eksplisit; untuk perubahan yang tidak bisa diekspresikan dengan strategic merge.- Kustomize untuk override, Helm untuk templating kompleks — keduanya bisa dikombinasikan; Helm generate manifest, Kustomize berikan final touch spesifik environment.