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 installkubectl apply -k sudah 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 presisiadd, remove, replace via 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.

← Sebelumnya: Helm   Berikutnya: kubectl Tips →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact