Waktu itu saya deploy aplikasi pertama saya ke VPS. Semuanya berjalan lancar - sampai traffic naik dan server tiba-tiba down jam 2 pagi. Aplikasi crash, database kewalahan, dan saya harus SSH manual untuk restart semuanya. Itu momen saya sadar: kalau mau serius production, butuh sesuatu yang lebih dari sekadar node app.js di background.
Nah, di situ saya kenal Kubernetes. Awalnya kelihatan intimidating banget - istilah-istilah kayak Pod, Deployment, Service, Ingress, Cluster - bikin kepala pusing. Tapi setelah bener-bener dipraktikkan, ternyata konsepnya sederhana. Kubernetes itu ibib manager yang ngatur aplikasi kamu biar selalu hidup, bisa scale otomatis, dan recover sendiri kalau ada yang crash.
Di artikel ini saya mau ajak kamu dari nol - install Kubernetes lokal, deploy aplikasi sederhana, expose ke luar, sampai auto-scaling. Semua dipraktikkan langsung, bukan teori doang.
Bayangkan kamu punya 5 aplikasi yang jalan di 3 server berbeda. Tanpa Kubernetes, kamu harus manual manage mana app jalan di server mana, kalau server A down kamu harus pindahkan app manual ke server B, kalau traffic naik kamu harus deploy instance baru manual. Capek banget.
Kubernetes (alias k8s) solve semua itu. Dia adalah container orchestration platform yang otomatis:
Perusahaan kayak Google, Netflix, Spotify, dan Grab semuanya pakai Kubernetes di production. Tapi kamu nggak perlu jadi Google untuk mulai pakainya.
Cara termudah belajar Kubernetes adalah pakai Minikube - single-node cluster yang jalan di laptop kamu. Tapi sebelum itu, pastikan Docker sudah terinstall karena Minikube butuh container runtime.
# Install Docker (Ubuntu/Debian)
sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker
# Install Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# Install kubectl - CLI untuk interact dengan cluster
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# Start cluster
minikube start --driver=docker
# Verify
kubectl get nodes
# Output: minikube Ready control-plane,master
Perintah minikube start akan download image, setup control plane, dan configure kubectl. Tunggu 2-3 menit, setelah selesai kamu punya Kubernetes cluster 1-node yang siap dipakai.
Tiga konsep ini adalah fondasi Kubernetes. Pahami ini dan sisanya akan gampang.
Pod - unit terkecil di Kubernetes. Satu Pod berisi satu atau lebih container. Kalau kamu familiar dengan Docker, anggap Pod sebagai wrapper di sekitar container yang kasih extra metadata dan networking.
Deployment - blueprint untuk membuat Pod. Kamu bilang "saya mau 3 instance aplikasi ini jalan terus", dan Deployment memastikan itu terjadi. Kalau satu Pod mati, Deployment buat yang baru.
Service - cara untuk expose aplikasi ke network. Karena Pod itu ephemeral (bisa mati dan hidup kapan saja), IP addressnya berubah-ubah. Service kasih stable IP dan DNS name yang nggak berubah.
Saatnya praktik. Kita akan deploy aplikasi web sederhana - nginx web server. Buat file nginx-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
resources:
limits:
memory: "128Mi"
cpu: "250m"
requests:
memory: "64Mi"
cpu: "100m"
Penjelasan singkat: kita minta 3 replicas (3 Pod), masing-masing jalanin nginx, dengan resource limit 128MB RAM dan 0.25 CPU. requests adalah minimum resource yang dijamin Kubernetes kasih ke Pod.
# Apply deployment
kubectl apply -f nginx-deployment.yaml
# Lihat Pods yang jalan
kubectl get pods
# NAME READY STATUS RESTARTS AGE
# nginx-deployment-xxx-aaa 1/1 Running 0 10s
# nginx-deployment-xxx-bbb 1/1 Running 0 10s
# nginx-deployment-xxx-ccc 1/1 Running 0 10s
# Lihat detail Deployment
kubectl describe deployment nginx-deployment
Sekarang aplikasi jalan di dalam cluster, tapi belum bisa diakses dari luar. Kita butuh Service untuk expose nya:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
# Apply service
kubectl apply -f nginx-service.yaml
# Test akses
curl http://$(minikube ip):30080
# Should return nginx welcome page HTML
# Atau pakai minikube service command (auto-buka browser)
minikube service nginx-service
NodePort expose aplikasi di port 30080 di IP cluster. Untuk production, kamu biasanya pakai LoadBalancer (di cloud provider) atau Ingress untuk routing berdasarkan domain name.
Inilah fitur yang bikin Kubernetes worth it. Horizontal Pod Autoscaler (HPA) otomatis naikkan/turunkan jumlah Pod berdasarkan CPU usage:
# Enable metrics server (butuh untuk HPA)
minikube addons enable metrics-server
# Buat HPA - target CPU 50%, max 10 replicas
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=3 --max=10
# Lihat HPA status
kubectl get hpa
# NAME REFERENCE TARGETS MINPODS MAXPODS
# nginx-deployment Deployment/nginx-deployment 0%/50% 3 10
Sekarang kalau traffic naik dan CPU Pod mendekati 50%, Kubernetes otomatis tambah Pod baru (sampai max 10). Kalau traffic turun, Pod berlebih di-kill untuk hemat resource. Kamu bisa tidur nyenyak sambil Kubernetes kerja sendiri.
Mari buktikan bahwa Kubernetes benar-benar self-healing. Coba kill salah satu Pod:
# Lihat Pods
kubectl get pods -l app=nginx
# Delete salah satu
kubectl delete pod nginx-deployment-xxx-aaa
# Cek lagi - Pod baru otomatis dibuat!
kubectl get pods -l app=nginx
# NAME READY STATUS RESTARTS AGE
# nginx-deployment-xxx-aaa 1/1 Running 0 5s <-- NEW!
# nginx-deployment-xxx-bbb 1/1 Running 0 5m
# nginx-deployment-xxx-ccc 1/1 Running 0 5m
Itu baru kill 1 Pod. Bayangkan kalau 1 server mati mendadak - Kubernetes otomatis pindahkan semua Pod ke server lain dalam hitungan detik. No manual intervention needed.
Update aplikasi tanpa downtime itu dulu jadi mimpi buruk. Di Kubernetes, gampang banget:
# Update image ke versi baru
kubectl set image deployment/nginx-deployment nginx=nginx:1.25
# Lihat proses rolling update
kubectl rollout status deployment/nginx-deployment
# Waiting for rollout to finish: 2 out of 3 new replicas...
# deployment "nginx-deployment" successfully rolled out
# Kalau ada masalah, rollback dalam 1 detik
kubectl rollout undo deployment/nginx-deployment
Kubernetes update Pod satu per satu - kill yang lama, start yang baru, verify, lanjut ke berikutnya. Zero downtime guaranteed.
Setelah 2 tahun pakai Kubernetes di production, ini hal-hal yang saya pelajari keras cara:
requests dan limits.kubectl create namespace dev dan set context biar nggak salah deploy.app: nginx, env: production, tier: frontend - buat labeling yang konsisten dari awal.Kalau kamu deploy di cloud, ada 2 pilihan:
Managed Kubernetes (GKE, EKS, AKS) - cloud provider manage control plane, kamu hanya bayar worker nodes. Biaya control plane: $70-150/bulan tergantung provider. Worker nodes sesuai ukuran server yang kamu pilih.
Self-managed di VPS - install Kubernetes sendiri di VPS. Lebih murah tapi kamu yang handle maintenance, upgrade, dan security. Cocok kalau sudah comfortable dengan Linux administration.
Untuk pemula, saya recommend mulai dengan managed service dulu. GKE punya free tier yang lumayan generous - control plane gratis, dan kamu hanya bayar VM instances.
Jujur, Kubernetes nggak selalu jawaban. Kalau aplikasi kamu:
Kubernetes itu investasi - ada learning curve, ada operational overhead. Tapi kalau kamu punya multiple services, butuh high availability, dan scale dynamically, nggak ada yang ngalahin Kubernetes.
Kubernetes memang punya learning curve yang curam di awal. Tapi setelah paham konsep Pod-Deployment-Service, sisanya cuma repetition. Mulai dari Minikube, deploy app sederhana, main-main dengan auto-scaling dan self-healing. Setelah comfortable, baru explore Ingress, ConfigMap, Secret, PersistentVolume, dan topik yang lebih advanced.
Kuncinya satu: praktik langsung. Baca dokumentasi 10x nggak akan sebanding dengan deploy 1 aplikasi beneran. Jadi, buka terminal kamu sekarang, install Minikube, dan deploy aplikasi pertama kamu. Kalau ada error atau pertanyaan, tulis di komentar - saya bantu jawab.