Membahas strategi containerization untuk aplikasi lama maupun baru, kapan Kubernetes layak diambil dan kapan justru overkill, memilih antara managed service dan self-hosted platform, serta mendesain deployment K8s yang siap produksi dengan resource guardrail

Setelah di episode 13 kalian bisa menimbang serverless dengan matematika biaya dan merancang rantai event yang idempotent, sekarang kita bahas pasangan sekaligus pesaingnya dalam hampir setiap diskusi arsitektur modern: container dan Kubernetes. Hampir setiap brief solusi hari ini menyebut salah satunya — dan tugas SA adalah menjawab pertanyaan yang lebih mendasar dulu: apakah ini masalah yang butuh K8s?
Mengapa penting menimbang? Karena K8s adalah investasi besar: bukan hanya biaya infrastruktur, melainkan kurva belajar tim, kompleksitas operasional, dan kecepatan delivery awal. K8s yang diambil tanpa kebutuhan nyata menghasilkan platform mahal yang dipakai seperti VPS biasa — pemborosan berlapis.
Sebelum bicara orkestrator, container sendiri sudah memberi nilai independen:
Untuk migrasi aplikasi lama (lanjutan strangler pattern episode 12), strategi bertahapnya:
/healthz dan log ke stdout agar cocok dengan pola orchestrator.Contoh Dockerfile produksi multi-stage yang menjaga image tetap kecil:
FROM node:22-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
FROM node:22-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/src ./src
USER node
EXPOSE 3000
HEALTHCHECK CMD wget -qO- http://localhost:3000/healthz || exit 1
CMD ["node", "src/server.js"]Detail USER node dan non-root adalah bagian dari security baseline episode 8 — image yang jalan sebagai root adalah temuan audit klasik.
Keputusan paling bernilai di episode ini adalah tabel keputusan ini:
| Sinyal | Rekomendasi |
|---|---|
| Tim ≤ 5 engineer, 2-5 aplikasi | Managed container sederhana (ECS Fargate, Cloud Run, ACA) |
| Banyak layanan, rilis harian, tim platform ada | K8s layak |
| Butuh portabilitas lintas cloud/on-prem ketat | K8s layak (standar de facto) |
| Workload ML/GPU scheduling kompleks | K8s kuat |
| Satu monolith + cron | Overkill — pakai PaaS/FaaS |
Poin yang sering luput: container tanpa K8s itu sah. Cloud Run atau Fargate memberi scaling, health check, dan zero server management dengan operasional sepersepuluh K8s. Jika requirement kalian tercapai di sana, berhentilah di sana — simplicity first (episode 2).
Jika memutuskan K8s, pilih managed control plane (EKS/GKE/AKS) — jangan pernah self-host control plane di production kecuali kalian vendor K8s. Pertanyaan lanjutannya: node pool managed vs serverless nodes (Fargate/KEDA-style), dan apakah data plane juga dikelola.
Inti desain platform K8s untuk tim aplikasi adalah manifest yang mengandung guardrail. Contoh deployment dengan praktik wajib:
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
labels: { app: order-service, env: prod }
spec:
replicas: 3
selector:
matchLabels: { app: order-service }
template:
metadata:
labels: { app: order-service }
spec:
containers:
- name: api
image: registry.internal/order-service:1.42.0
ports:
- containerPort: 3000
resources:
requests: { cpu: "250m", memory: "512Mi" }
limits: { cpu: "500m", memory: "768Mi" }
readinessProbe:
httpGet: { path: /healthz/ready, port: 3000 }
initialDelaySeconds: 5
livenessProbe:
httpGet: { path: /healthz/live, port: 3000 }
periodSeconds: 10
securityContext:
runAsNonRoot: true
allowPrivilegeEscalation: false
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels: { app: order-service }Perhatikan empat hal yang membuat manifest ini "siap review SA":
resources.requests/limits — dasar kapasitas dan proteksi noisy neighbor; angka ini juga input estimasi biaya episode 9.securityContext non-root — kelanjutan baseline Dockerfile tadi.topologySpreadConstraints — pod disebar lintas AZ, menerjemahkan aturan multi-AZ episode 5 ke dunia K8s.Di atas level manifest, keputusan platform lain yang harus tertulis di ADR:
kubectl apply manual dari laptop.Kesalahan organisasi paling umum di adopsi K8s: semua engineer dipaksa jadi ahli K8s. Desain yang sehat memisahkan dua lapisan:
| Lapisan | Tanggung Jawab | Artefak |
|---|---|---|
| Platform | Klaster, ingress, monitoring, policy, upgrade | Helm chart base, modul Terraform, runbook |
| Aplikasi | Kode, manifest instance, business logic | Values file, CI pipeline per repo |
Tim aplikasi mengonsumsi platform lewat template (Helm chart terkurasi) sehingga deploy layanan baru butuh jam, bukan pekan riset. Inilah nilai sebenarnya dari K8s: platform self-service — dan SA yang mendesain kontrak antara kedua tim ini.
Warning
Upgrade klaster adalah beban rutin yang sering diremehkan: versi K8s kedaluwarsa tiap ±14 bulan. Tanpa disiplin upgrade berkala (canary node pool, add-on version pinning), kalian akan menghadapi migrasi besar-besar paksa di masa depan. Masukkan ke rencana operasi sejak hari pertama.
Menutup lingkaran dengan episode 9: container memberi granularitas biaya yang lebih baik jika diukur benar:
Inti yang harus dibawa pulang:
Di episode 15 selanjutnya kita akan membahas resilience & DR solutions — high availability versus disaster recovery, RTO/RPO sebagai kontrak desain, topologi DR dari backup-and-restore sampai active-active, serta strategi backup yang benar-benar bisa di-restorasi. Sampai jumpa di episode 15!