Belajar Kubernetes - Episode 39 - Pengenalan dan Penjelasan Kustomize

Belajar Kubernetes - Episode 39 - Pengenalan dan Penjelasan Kustomize

Di episode ini kita akan coba bahas Kustomize untuk customize Kubernetes manifest tanpa templating. Kita akan mempelajari bagaimana gunakan overlay, patch, base, dan best practice untuk manage multiple environment.

Arman Dwi Pangestu
Arman Dwi PangestuApril 14, 2026
0 views
5 min read

Pendahuluan

Catatan

Untuk kalian yang ingin membaca episode sebelumnya, bisa click thumbnail episode 38 di bawah ini

Episode 38Episode 38

Di episode sebelumnya, kita menjelajahi Helm Charts, yang menyederhanakan packaging dan deploying aplikasi Kubernetes. Sekarang kita akan mendalami Kustomize, yang menyediakan alternative approach untuk customize Kubernetes manifest.

Catatan: Disini saya akan menggunakan Kubernetes Cluster yang di install melalui K3s.

Kustomize adalah native Kubernetes tool untuk customize YAML manifest. Tidak seperti Helm, Kustomize tidak menggunakan templating. Sebaliknya, ini menggunakan declarative approach dengan overlay dan patch. Pikirkan Kustomize seperti Git untuk Kubernetes manifest - ini memungkinkan Anda compose, customize, dan manage multiple version dari configuration Anda tanpa template syntax.

Memahami Kustomize

Kustomize memungkinkan Anda customize Kubernetes manifest dengan compose base configuration dengan overlay. Ini built-in ke kubectl, jadi Anda tidak perlu install apa pun tambahan.

Mengapa Kustomize Penting

1. No Templating Language

Gunakan plain YAML tanpa template syntax.

2. Declarative Approach

Deskripsikan apa yang Anda inginkan, bukan bagaimana mendapatkannya.

3. Reusability

Share base configuration di seluruh project.

4. Multiple Environment

Easily manage dev, staging, dan production.

5. Built-in ke kubectl

Tidak perlu tool tambahan.

6. Git-Friendly

Work well dengan version control.

Struktur Kustomize

Typical Kustomize project memiliki struktur ini:

plaintext
my-app/
├── base/
│   ├── kustomization.yaml
│   ├── deployment.yaml
│   ├── service.yaml
│   └── configmap.yaml
└── overlays/
    ├── dev/
    │   ├── kustomization.yaml
    │   └── patch-replicas.yaml
    ├── staging/
    │   ├── kustomization.yaml
    │   └── patch-replicas.yaml
    └── production/
        ├── kustomization.yaml
        ├── patch-replicas.yaml
        └── patch-resources.yaml

Base Configuration

Base directory berisi common Kubernetes manifest:

Kubernetesbase/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
resources:
  - deployment.yaml
  - service.yaml
  - configmap.yaml
 
commonLabels:
  app: my-app
  version: v1
 
commonAnnotations:
  managed-by: kustomize
Kubernetesbase/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: app
        image: myapp:1.0
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 512Mi
Kubernetesbase/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-app
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: my-app

Overlay Configuration

Overlay customize base configuration untuk specific environment:

Kubernetesoverlays/dev/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
bases:
  - ../../base
 
replicas:
  - name: my-app
    count: 1
 
patchesStrategicMerge:
  - patch-replicas.yaml
 
commonLabels:
  environment: dev
Kubernetesoverlays/dev/patch-replicas.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
Kubernetesoverlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
bases:
  - ../../base
 
replicas:
  - name: my-app
    count: 3
 
patchesStrategicMerge:
  - patch-replicas.yaml
  - patch-resources.yaml
 
commonLabels:
  environment: production
 
images:
  - name: myapp
    newTag: "2.0"
Kubernetesoverlays/production/patch-replicas.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
Kubernetesoverlays/production/patch-resources.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    spec:
      containers:
      - name: app
        resources:
          requests:
            cpu: 500m
            memory: 512Mi
          limits:
            cpu: 2000m
            memory: 2Gi

Menggunakan Kustomize

Build Kustomization

Kubernetesbash
kustomize build overlays/dev

Output customized YAML.

Apply dengan kubectl

Kubernetesbash
kubectl apply -k overlays/dev

Apply customized manifest ke cluster.

Dry Run

Kubernetesbash
kubectl apply -k overlays/dev --dry-run=client -o yaml

Menunjukkan apa yang akan di-apply tanpa actually deploy.

Diff

Kubernetesbash
kubectl diff -k overlays/dev

Menunjukkan perbedaan antara current dan desired state.

Fitur Kustomization

CommonLabels dan CommonAnnotations

KubernetesCommon Label dan Annotation
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
commonLabels:
  app: my-app
  version: v1
  managed-by: kustomize
 
commonAnnotations:
  description: "My application"
  team: platform

Replicas

KubernetesSet Replicas
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
replicas:
  - name: my-app
    count: 3
  - name: worker
    count: 5

Images

KubernetesUpdate Images
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
images:
  - name: myapp
    newName: myregistry.azurecr.io/myapp
    newTag: "2.0"
  - name: worker
    newTag: "1.5"

Patches

Strategic Merge Patch

KubernetesStrategic Merge Patch
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
patchesStrategicMerge:
  - patch-deployment.yaml

JSON Patch

KubernetesJSON Patch
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
patchesJson6902:
  - target:
      group: apps
      version: v1
      kind: Deployment
      name: my-app
    patch: |-
      - op: replace
        path: /spec/replicas
        value: 3

NamePrefix dan NameSuffix

KubernetesName Prefix dan Suffix
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
namePrefix: prod-
nameSuffix: -v1
 
resources:
  - deployment.yaml

Ini create resource bernama prod-my-app-v1.

Namespace

KubernetesSet Namespace
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
namespace: production
 
resources:
  - deployment.yaml

ConfigMap dan Secret Generator

KubernetesGenerate ConfigMap
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
configMapGenerator:
  - name: app-config
    literals:
      - LOG_LEVEL=info
      - DATABASE_HOST=db.example.com
    files:
      - config.yaml
 
secretGenerator:
  - name: app-secret
    literals:
      - DATABASE_PASSWORD=secret123
    files:
      - .env

Contoh Praktis

Multi-Environment Setup

Kubernetesbase/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
resources:
  - deployment.yaml
  - service.yaml
 
commonLabels:
  app: myapp
Kubernetesoverlays/dev/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
bases:
  - ../../base
 
namespace: dev
 
replicas:
  - name: myapp
    count: 1
 
images:
  - name: myapp
    newTag: "dev"
 
commonLabels:
  environment: dev
Kubernetesoverlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
bases:
  - ../../base
 
namespace: production
 
replicas:
  - name: myapp
    count: 3
 
images:
  - name: myapp
    newTag: "v1.0.0"
 
patchesStrategicMerge:
  - patch-resources.yaml
 
commonLabels:
  environment: production

Patch Example

Kubernetesoverlays/production/patch-resources.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  template:
    spec:
      containers:
      - name: app
        resources:
          requests:
            cpu: 500m
            memory: 512Mi
          limits:
            cpu: 2000m
            memory: 2Gi

Kesalahan dan Jebakan Umum

Kesalahan 1: Duplicating Base Configuration

Problem: Overlay duplicate base configuration daripada patch.

KubernetesKesalahan: Duplication
# JANGAN LAKUKAN INI - Duplicating entire deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  # ... entire spec duplicated

Solusi: Gunakan patch sebagai gantinya:

KubernetesCorrect: Patch
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3

Kesalahan 2: Not Using Base

Problem: Setiap overlay independent dan duplicate configuration.

Solusi: Selalu gunakan base untuk common configuration:

Kubernetesyaml
bases:
  - ../../base

Kesalahan 3: Incorrect Patch Syntax

Problem: Patch tidak apply dengan benar.

KubernetesKesalahan: Wrong Patch
# JANGAN LAKUKAN INI - Incomplete patch
spec:
  replicas: 3

Solusi: Include full metadata:

KubernetesCorrect: Full Patch
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3

Kesalahan 4: Mixing Templating dengan Kustomize

Problem: Menggunakan template syntax mengalahkan tujuan Kustomize.

Solusi: Gunakan pure YAML dengan Kustomize feature.

Kesalahan 5: Not Testing Build

Problem: Kustomization build gagal di production.

Solusi: Selalu test sebelum deploy:

Kubernetesbash
kustomize build overlays/production
kubectl apply -k overlays/production --dry-run=client

Praktik Terbaik

1. Organize by Environment

plaintext
overlays/
├── dev/
├── staging/
└── production/

2. Gunakan Descriptive Name

Kubernetesyaml
namePrefix: prod-
nameSuffix: -v1

3. Keep Base Simple

Base hanya berisi common configuration.

4. Gunakan Patch untuk Difference

Kubernetesyaml
patchesStrategicMerge:
  - patch-replicas.yaml
  - patch-resources.yaml

5. Document Overlay

Add comment menjelaskan apa yang setiap overlay lakukan:

Kubernetesyaml
# Production overlay
# - 3 replicas untuk high availability
# - Production image tag
# - Higher resource limit

6. Version Control

Keep Kustomize file di Git:

Kubernetesbash
git add base/ overlays/
git commit -m "Update kustomization untuk v2.0"

7. Gunakan ConfigMap Generator

Kubernetesyaml
configMapGenerator:
  - name: app-config
    literals:
      - LOG_LEVEL=info

Kustomize vs Helm

AspekKustomizeHelm
TemplatingTidakYa
Learning CurveLebih mudahLebih curam
FlexibilityBaikExcellent
Package ManagementTidakYa
Built-in ke kubectlYaTidak
Community ChartTidakYa
Use CaseConfiguration ManagementPackage Management

Advanced Feature

Vars

KubernetesGunakan Variable
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
vars:
  - name: REPLICAS
    objref:
      kind: Deployment
      name: my-app
      apiVersion: apps/v1
    fieldref:
      fieldpath: spec.replicas

Resources

KubernetesInclude Resource
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
resources:
  - deployment.yaml
  - service.yaml
  - ../other-app/base

Bases

KubernetesMultiple Base
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
bases:
  - ../../base
  - ../../common

Kesimpulan

Pada episode 39 ini, kita telah membahas Kustomize di Kubernetes secara mendalam. Kita sudah belajar bagaimana customize Kubernetes manifest menggunakan overlay, patch, dan base tanpa templating.

Key takeaway:

  • Kustomize customize Kubernetes manifest secara declarative
  • Base - Common configuration
  • Overlay - Environment-specific customization
  • Patch - Modify base configuration
  • CommonLabel - Add label ke semua resource
  • Replicas - Set replica count
  • Images - Update image tag
  • Namespace - Set namespace untuk resource
  • ConfigMapGenerator - Generate ConfigMap
  • SecretGenerator - Generate Secret
  • No templating - Gunakan pure YAML
  • Built-in ke kubectl - Tidak perlu tool tambahan
  • Git-friendly - Work well dengan version control
  • Multiple environment - Easy manage dev, staging, production
  • Declarative approach - Deskripsikan apa yang Anda inginkan

Kustomize menyediakan alternative yang lebih sederhana ke Helm untuk manage Kubernetes configuration di seluruh multiple environment.

Catatan

Untuk kalian yang ingin melanjutkan ke episode selanjutnya, bisa click thumbnail episode 40 di bawah ini

Episode 40Episode 40

Related Posts