Setelah fondasi Kubernetes, produksi butuh pemaketan, keamanan akses, dan scaling; di episode ini kalian menguasai Helm, operator dan CRD, namespace, RBAC, serta Horizontal Pod Autoscaler, lalu men-deploy aplikasi dengan Helm chart dan autoscaling otomatis

Di episode 8 kalian men-deploy aplikasi dengan file YAML satu per satu. Itu cukup untuk satu aplikasi kecil. Sekarang bayangkan lima puluh aplikasi, masing-masing dengan sepuluh file YAML — menyalin dan mengedit nilai di tiap file menjadi tak terkelola. Di sinilah kalian butuh Helm, lalu mekanisme keamanan akses (RBAC) dan scaling otomatis (HPA).
Episode 13 membawa Kubernetes dari "bisa deploy" ke "siap produksi": memaketkan aplikasi kompleks yang bisa dikonfigurasi, membatasi akses antar-tim, men-scaling workload berdasarkan metrik nyata, dan memahami cara ekosistem Kubernetes tumbuh melalui operator.
Helm adalah "apt/yarn untuk Kubernetes". Satu unit paket disebut Chart: sekumpulan template YAML dengan nilai yang bisa diisi per deployment.
Struktur chart:
myapp/
├── Chart.yaml # metadata chart
├── values.yaml # nilai default
├── templates/
│ ├── deployment.yaml # template Deployment
│ ├── service.yaml # template Service
│ └── _helpers.tpl # fungsi pembantu namaTemplate Deployment yang nilainya diambil dari values.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ .Release.Name }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
resources:
limits:
cpu: {{ .Values.resources.limits.cpu }}
memory: {{ .Values.resources.limits.memory }}Dan values.yaml sebagai "tombol konfigurasi":
replicaCount: 3
image:
repository: ghcr.io/username/myapp
tag: "1.2.0"
resources:
limits:
cpu: "500m"
memory: "512Mi"Karena nilainya dipisah dari template, satu chart bisa di-deploy ke dev dengan replicaCount: 1 dan ke prod dengan replicaCount: 10:
helm create myapp
helm lint ./myapp
helm template myapp ./myapp # render tanpa deploy
helm install myapp ./myapp --namespace dev
helm upgrade myapp ./myapp --set replicaCount=10
helm rollback myapp 1Perhatikan alur lint → template → install: Helm mendukung pratinjau YAML tanpa menyentuh cluster — kebiasaan yang menjaga produksi tetap aman.
Di tim besar, banyak orang berbagi satu cluster. Namespace membagi cluster menjadi lingkungan logis, dan RBAC (Role-Based Access Control) mengatur siapa boleh melakukan apa di dalamnya.
kubectl create namespace team-billing
kubectl config set-context billing --namespace team-billingRBAC terdiri dari dua objek: Role/RoleBinding (terbatas namespace) dan ClusterRole/ClusterRoleBinding (berlaku seluruh cluster). Contoh: tim developer hanya bisa melihat dan me-restart Pod di namespace-nya:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: team-billing
name: app-viewer
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: team-billing
name: app-viewer-binding
subjects:
- kind: User
name: dev@company.com
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: app-viewer
apiGroup: rbac.authorization.k8s.ioPrinsipnya identik dengan IAM di episode 12: least privilege. Tidak ada alasan seorang developer aplikasi punya hak menghapus namespace atau membaca Secret namespace tim lain.
HPA men-scaling jumlah replica secara otomatis berdasarkan metrik — biasanya CPU, memori, atau metrik custom. Contoh: scale antara 1 dan 10 replica saat CPU rata-rata melewati 70%:
apiVersion: autoscaling.k8s.io/v2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70kubectl apply -f hpa.yaml
kubectl get hpa -w
kubectl describe hpa myapp-hpaImportant
HPA baru bekerja jika Deployment mendefinisikan resource request untuk CPU/memori — HPA mengukur request, bukan penggunaan mesin. Satu lagi alasan kenapa resource request selalu wajib di-set. Untuk scaling berbasis jumlah request, kuota per second, atau metrik bisnis, kalian butuh KEDA (Kubernetes Event-driven Autoscaling).
Ekosistem Kubernetes tumbuh melalui operator: pola di mana sebuah controller menjalankan logika domain aplikasi (misal backup database, failover, tuning) langsung di dalam cluster. Operator memperkenalkan Custom Resource Definition (CRD) — tipe resource baru buatan sendiri. Contoh dari dunia nyata: PostgresCluster (dari operator CloudNativePG) adalah sebuah objek yang, setelah di-apply, membuat seluruh statefulset, service, dan backup PostgreSQL secara otomatis.
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: mydb
spec:
instances: 3
storage:
size: 10GiDengan operator, kebutuhan operasional yang berulang — backup, upgrade, failover — diserahkan ke "robot" yang mengerti domain tersebut. Ini adalah jembatan menuju GitOps yang kalian pelajari di episode 14.
Service mesh menambahkan lapisan traffic dan keamanan antar-service tanpa mengubah kode aplikasi — melalui sidecar proxy di samping setiap Pod. Ini memungkinkan mTLS, canary berbasis traffic, dan retry otomatis. Kita akan membahasnya secara penuh di episode 19 — cukup catat sekarang bahwa ini adalah cara menangani traffic antar-service yang canggih di skala besar.
latest dan tanpa version pinning — install chart dengan versi eksplisit dan helm lock untuk reproducibility.cluster-admin yang dibagikan ke semua orang adalah kecelakaan yang menunggu terjadi.values.yaml dan masuk Git (fondasi GitOps).Inti yang harus dibawa pulang:
lint → template → install menjaga deploy aman.Di episode 14 selanjutnya kita belajar GitOps dengan Argo CD dan Flux — pola yang menjadikan Git sebagai satu-satunya sumber kebenaran untuk seluruh cluster. Deployment, nilai konfigurasi, dan bahkan controller itu sendiri dikelola melalui pull-based sync loop.