Belajar GitOps - FluxCD - Working with Kustomize
Episode 7 of 36

Belajar GitOps - FluxCD - Working with Kustomize

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

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

Pendahuluan

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.

Dasar-Dasar kustomization.yaml

Kustomize adalah tool yang me-merge manifest tanpa templating. Satu file kustomization.yaml mendeklarasikan resource dan transformasi:

kustomization.yaml dasar
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.3

Elemen 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.

ConfigMap dan Secret Generator

Daripada menulis ConfigMap secara manual, gunakan generator agar Flux selalu menyegarkan nilainya saat ada perubahan:

configMapGenerator dan secretGenerator
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.env

Patches

Patches mengubah manifest yang sudah ada tanpa menulis ulang. Ada dua gaya: strategic merge dan JSON patch:

Strategic merge 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
JSON patch untuk list-based merge
[
  {
    "op": "add",
    "path": "/spec/template/spec/containers/0/env",
    "value": [
      {
        "name": "FEATURE_X",
        "value": "true"
      }
    ]
  }
]

Kustomization CRD vs Binary Kustomize

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:

AspekBinary KustomizeCRD Kustomization Flux
Lokasi eksekusiClient (laptop/CI)In-cluster controller
RekonsiliasiTidak ada (one-shot)Terus-menerus sesuai interval
Health assessmentTidak adaBuilt-in: Deployment, Pod, Service, dll
DependencyTidak adadependsOn antar Kustomization
PruneTidak adaprune: true untuk GC
OutputFile YAMLLangsung di-apply ke cluster

Fitur Flux yang tidak ada di binary:

CRD Kustomization dengan fitur Flux
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: fleet
  • healthChecks — 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.

Pola Overlays

Cara paling umum mengelola banyak environment adalah pola base + overlays:

Struktur base dan overlays
apps/webapp/
├── base/
   ├── kustomization.yaml
   ├── deployment.yaml
   └── service.yaml
└── overlays/
    ├── dev/
   └── kustomization.yaml
    ├── staging/
   └── kustomization.yaml
    └── prod/
        └── kustomization.yaml

base berisi manifest netral, sementara tiap overlay mereferensikan base dan menimpa bagian yang spesifik environment:

overlays/prod/kustomization.yaml
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.0

Lalu buat Kustomization Flux per environment:

Kustomization per environment
flux create kustomization webapp-prod \
  --source=fleet \
  --path="./apps/webapp/overlays/prod" \
  --prune=true \
  --interval=5m

Note

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.

Post-Build Customization

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:

postBuild pada Kustomization
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
spec:
  path: ./apps/webapp/overlays/prod
  postBuild:
    substitute:
      cluster: production
    substituteFrom:
      - kind: ConfigMap
        name: cluster-vars

Nilai 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.

Fitur Lanjutan Kustomization

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.
Contoh penggunaan opsi lanjutan
flux create kustomization webapp-prod \
  --source=fleet \
  --path="./apps/webapp/overlays/prod" \
  --prune=true \
  --force=true \
  --wait=true \
  --interval=5m

Penutup

Kustomize bersama Flux adalah cara terbaik menjaga repository tetap ramping:

  • kustomization.yaml mengatur resources, generator, prefix/suffix, label, dan images.
  • CRD Kustomization Flux menambahkan rekonsiliasi, health check, dependency, dan prune.
  • Pola base + overlays memisahkan konfigurasi umum dari delta per environment.
  • Post-build substitution dan fitur lanjutan menutup celah yang tidak dimiliki binary Kustomize.

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!

Belajar GitOps - FluxCD - Working with Kustomize | Belajar FluxCD & GitOps