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.

Catatan
Untuk kalian yang ingin membaca episode sebelumnya, bisa click thumbnail episode 38 di bawah ini
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.
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.
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.
Typical Kustomize project memiliki struktur ini:
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.yamlBase directory berisi common Kubernetes manifest:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
- configmap.yaml
commonLabels:
app: my-app
version: v1
commonAnnotations:
managed-by: kustomizeapiVersion: 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: 512MiapiVersion: v1
kind: Service
metadata:
name: my-app
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
selector:
app: my-appOverlay customize base configuration untuk specific environment:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ../../base
replicas:
- name: my-app
count: 1
patchesStrategicMerge:
- patch-replicas.yaml
commonLabels:
environment: devapiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 1apiVersion: 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"apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
template:
spec:
containers:
- name: app
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 2000m
memory: 2Gikustomize build overlays/devOutput customized YAML.
kubectl apply -k overlays/devApply customized manifest ke cluster.
kubectl apply -k overlays/dev --dry-run=client -o yamlMenunjukkan apa yang akan di-apply tanpa actually deploy.
kubectl diff -k overlays/devMenunjukkan perbedaan antara current dan desired state.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
commonLabels:
app: my-app
version: v1
managed-by: kustomize
commonAnnotations:
description: "My application"
team: platformapiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
replicas:
- name: my-app
count: 3
- name: worker
count: 5apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
images:
- name: myapp
newName: myregistry.azurecr.io/myapp
newTag: "2.0"
- name: worker
newTag: "1.5"Strategic Merge Patch
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
patchesStrategicMerge:
- patch-deployment.yamlJSON 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: 3apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namePrefix: prod-
nameSuffix: -v1
resources:
- deployment.yamlIni create resource bernama prod-my-app-v1.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: production
resources:
- deployment.yamlapiVersion: 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:
- .envapiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
commonLabels:
app: myappapiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ../../base
namespace: dev
replicas:
- name: myapp
count: 1
images:
- name: myapp
newTag: "dev"
commonLabels:
environment: devapiVersion: 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: productionapiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
template:
spec:
containers:
- name: app
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 2000m
memory: 2GiProblem: Overlay duplicate base configuration daripada patch.
# JANGAN LAKUKAN INI - Duplicating entire deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
# ... entire spec duplicatedSolusi: Gunakan patch sebagai gantinya:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3Problem: Setiap overlay independent dan duplicate configuration.
Solusi: Selalu gunakan base untuk common configuration:
bases:
- ../../baseProblem: Patch tidak apply dengan benar.
# JANGAN LAKUKAN INI - Incomplete patch
spec:
replicas: 3Solusi: Include full metadata:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3Problem: Menggunakan template syntax mengalahkan tujuan Kustomize.
Solusi: Gunakan pure YAML dengan Kustomize feature.
Problem: Kustomization build gagal di production.
Solusi: Selalu test sebelum deploy:
kustomize build overlays/production
kubectl apply -k overlays/production --dry-run=clientoverlays/
├── dev/
├── staging/
└── production/namePrefix: prod-
nameSuffix: -v1Base hanya berisi common configuration.
patchesStrategicMerge:
- patch-replicas.yaml
- patch-resources.yamlAdd comment menjelaskan apa yang setiap overlay lakukan:
# Production overlay
# - 3 replicas untuk high availability
# - Production image tag
# - Higher resource limitKeep Kustomize file di Git:
git add base/ overlays/
git commit -m "Update kustomization untuk v2.0"configMapGenerator:
- name: app-config
literals:
- LOG_LEVEL=info| Aspek | Kustomize | Helm |
|---|---|---|
| Templating | Tidak | Ya |
| Learning Curve | Lebih mudah | Lebih curam |
| Flexibility | Baik | Excellent |
| Package Management | Tidak | Ya |
| Built-in ke kubectl | Ya | Tidak |
| Community Chart | Tidak | Ya |
| Use Case | Configuration Management | Package Management |
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
vars:
- name: REPLICAS
objref:
kind: Deployment
name: my-app
apiVersion: apps/v1
fieldref:
fieldpath: spec.replicasapiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
- ../other-app/baseapiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ../../base
- ../../commonPada 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 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