Server/Infra

Kubernetes untuk Pemula - Deploy Aplikasi dari Nol dengan Minikube di 2026

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.

Apa Itu Kubernetes dan Kenapa Kamu Butuh Ini?

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:

  • Scheduling - tentuin container jalan di server mana berdasarkan resource availability
  • Self-healing - kalau container crash, dia restart otomatis. Kalau server mati, dia pindahkan container ke server lain
  • Scaling - naikkan/turunkan jumlah container berdasarkan CPU/memory usage
  • Load balancing - distribusi traffic ke multiple container instances
  • Rolling updates - deploy versi baru tanpa downtime

Perusahaan kayak Google, Netflix, Spotify, dan Grab semuanya pakai Kubernetes di production. Tapi kamu nggak perlu jadi Google untuk mulai pakainya.

Install Kubernetes Lokal dengan Minikube

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.

Konsep Inti: Pod, Deployment, dan Service

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.

Deploy Aplikasi Pertama Kamu

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

Expose Aplikasi dengan Service

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.

Auto-Scaling: Karena Manual Itu Kuno

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.

Self-Healing di Action

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.

Rolling Update Tanpa Downtime

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.

Tips Praktis untuk Pemula

Setelah 2 tahun pakai Kubernetes di production, ini hal-hal yang saya pelajari keras cara:

  • Jangan mulai dengan production. Praktik di Minikube atau kind (Kubernetes in Docker) dulu. Gratis dan aman bikin salah.
  • Resource limits itu wajib. Tanpa limits, satu Pod bisa makan semua memory server dan crash semuanya. Selalu set requests dan limits.
  • Pakai namespace. Jangan campur dev, staging, dan production di namespace yang sama. kubectl create namespace dev dan set context biar nggak salah deploy.
  • Labels itu penting. Label adalah cara Kubernetes mengorganisir resource. app: nginx, env: production, tier: frontend - buat labeling yang konsisten dari awal.
  • Pakai Helm. Kalau mulai manage banyak YAML files, Helm chart bikin hidup lebih mudah. Think of it as package manager untuk Kubernetes.
  • Backup etcd. etcd adalah brain dari Kubernetes cluster. Kalau etcd corrupt, semua konfigurasi hilang. Backup rutin itu wajib.

Berapa Cost Kubernetes di Production?

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.

Kapan TIDAK Pakai Kubernetes?

Jujur, Kubernetes nggak selalu jawaban. Kalau aplikasi kamu:

  • Single service, traffic kecil (docker-compose cukup)
  • Butuh deploy cepat dan simple (PaaS kayak Vercel/Render lebih cocok)
  • Tim kecil tanpa DevOps engineer (overhead maintenance terlalu besar)

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.

Kesimpulan

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.


You may also like


0 Comments


Leave a Reply

Comments with links or spam keywords will be rejected.
Scroll to Top