Setup Kubernetes Cluster Lokal dengan Minikube
Kamu baru selesai baca tutorial Docker, semangat mau coba Kubernetes, terus buka dokumentasi resminya — dan langsung disambut wall of text tentang control plane, etcd, kubelet, dan segala macam komponen yang bikin kepala pusing. Belum lagi kalau kamu coba setup cluster "beneran" di cloud, tagihan bisa langsung meledak sebelum kamu sempat deploy satu pod pun.
Solusinya: setup Kubernetes cluster lokal pakai Minikube. Kamu bisa punya cluster Kubernetes yang fully functional di laptop sendiri, gratis, dan bisa dihapus kapan saja kalau eksperimen kamu berantakan.
Artikel ini bakal kasih kamu setup yang benar-benar jalan — dari instalasi sampai deploy aplikasi pertama — plus catatan gotcha yang gue temuin sendiri waktu pertama kali nyoba.
Kenapa Minikube, Bukan yang Lain?
Ada beberapa pilihan untuk Kubernetes lokal: kind, k3s, MicroK8s, atau Minikube. Masing-masing punya trade-off.
- kind (Kubernetes in Docker) — bagus untuk CI pipeline, tapi setup-nya lebih verbose.
- k3s — ringan, cocok untuk Raspberry Pi atau VM, tapi kurang cocok untuk development lokal karena beberapa fitur Kubernetes standar di-strip.
- MicroK8s — bagus di Ubuntu, tapi kalau kamu pakai macOS atau Windows, pengalaman-nya bisa inconsistent.
- Minikube — paling mature untuk development lokal, dokumentasinya lengkap, dan punya built-in addons yang berguna seperti dashboard, ingress, dan metrics-server.
Untuk belajar dan development lokal, Minikube masih pilihan paling pragmatis.
Prerequisites Sebelum Mulai
Sebelum install Minikube, pastikan kamu punya:
- Docker sudah terinstall dan running. Minikube bakal pakai Docker sebagai driver-nya.
- kubectl — CLI untuk ngobrol sama Kubernetes cluster.
- RAM minimal 4GB yang bisa dialokasikan ke Minikube (rekomendasinya 6GB).
- CPU minimal 2 core.
Cek dulu Docker-nya jalan:
docker --version
# Docker version 24.0.7, build afdd53b
Kalau belum ada kubectl, install dulu:
# macOS
brew install kubectl
# Linux (Ubuntu/Debian)
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
# Verifikasi
kubectl version --client
Install Minikube
# macOS
brew install minikube
# Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# Windows (pakai PowerShell sebagai Administrator)
winget install Kubernetes.minikube
Verifikasi instalasi:
minikube version
# minikube version: v1.32.0
Start Cluster Pertama Kamu
Ini bagian yang paling sering bikin orang stuck karena default config-nya kadang nggak cocok sama environment lokal.
Gue rekomendasiin start dengan explicit config:
minikube start \
--driver=docker \
--cpus=2 \
--memory=4096 \
--disk-size=20g \
--kubernetes-version=stable
Flag --driver=docker penting kalau kamu mau pakai Docker sebagai runtime. Tanpa ini, Minikube kadang auto-detect driver yang salah dan hasilnya error yang membingungkan.
Output yang kamu harapkan:
😄 minikube v1.32.0 on Darwin 14.2.1
✨ Using the docker driver based on user configuration
📌 Using Docker Desktop driver with root privileges
👍 Starting control plane node minikube in cluster minikube
🚜 Pulling base image ...
🔥 Creating docker container (CPUs=2, Memory=4096MB) ...
🐳 Preparing Kubernetes v1.28.3 on Docker 24.0.7 ...
🔗 Configuring bridge CNI (Container Networking Interface) ...
🔎 Verifying Kubernetes components...
🌟 Enabled addons: storage-provisioner, default-storageclass
🏄 Done! kubectl is now configured to use "minikube" cluster
Kalau sudah done, cek status cluster:
minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
Dan cek node-nya via kubectl:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 2m v1.28.3
Deploy Aplikasi Pertama ke Cluster
Oke, cluster sudah jalan. Sekarang kita deploy sesuatu yang nyata. Kita pakai Nginx sebagai contoh — simpel tapi cukup untuk ngerti flow-nya.
Buat file nginx-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25-alpine
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
Satu hal yang sering dilupain pemula: selalu set resources.requests dan resources.limits di pod spec. Tanpa ini, Kubernetes nggak bisa schedule pod dengan efisien, dan di production ini bisa jadi masalah besar.
Apply manifest-nya:
kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
service/nginx-service created
Cek status deployment:
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-7d9c4b8f6-4xkp2 1/1 Running 0 45s
nginx-deployment-7d9c4b8f6-9mnt7 1/1 Running 0 45s
Akses service-nya:
minikube service nginx-service --url
Ini bakal kasih kamu URL yang bisa langsung dibuka di browser, misalnya http://127.0.0.1:52341. Buka URL itu dan kamu bakal lihat halaman default Nginx.
Enable Addons yang Berguna
Minikube punya addons yang bisa di-enable sesuai kebutuhan. Dua yang paling sering gue pakai:
Kubernetes Dashboard
minikube addons enable dashboard
minikube addons enable metrics-server
# Buka dashboard di browser
minikube dashboard
Dashboard ini berguna banget waktu debugging — kamu bisa lihat resource usage, log pod, dan status semua object dalam satu UI.
Ingress Controller
Kalau kamu mau simulate ingress routing (kayak di production):
minikube addons enable ingress
# Verifikasi ingress controller sudah jalan
kubectl get pods -n ingress-nginx
Setelah ingress enabled, kamu bisa bikin Ingress resource dan route traffic berdasarkan hostname atau path — persis kayak setup production dengan Nginx Ingress Controller.
Gotcha yang Sering Bikin Stuck
1. ImagePullBackOff karena Image Nggak Ketemu
Kalau kamu build Docker image lokal dan mau pakai di Minikube, image itu nggak otomatis tersedia di dalam cluster. Minikube punya Docker daemon sendiri yang terpisah dari Docker daemon di host kamu.
Solusinya:
# Point shell kamu ke Docker daemon minikube
eval $(minikube docker-env)
# Sekarang build image di sini
docker build -t my-app:local .
# Di deployment YAML, set imagePullPolicy: Never
# supaya Kubernetes nggak coba pull dari registry
Di deployment YAML-nya:
spec:
containers:
- name: my-app
image: my-app:local
imagePullPolicy: Never # <-- ini penting!
2. Minikube Start Gagal karena Port Conflict
Kalau kamu punya service lain yang pakai port yang sama (misalnya port 8443 untuk apiserver), Minikube bisa gagal start. Cek dengan:
sudo lsof -i :8443
Kalau ada yang pakai, matiin dulu service-nya atau restart Docker sebelum start Minikube.
3. Context kubectl Ke-reset
Kalau kamu punya beberapa cluster (misalnya juga connect ke cluster remote), pastiin kamu di context yang benar:
# Lihat semua context
kubectl config get-contexts
# Switch ke minikube
kubectl config use-context minikube
# Atau pakai alias biar gampang
alias kctx='kubectl config use-context'
4. Cluster Lambat setelah Laptop Sleep
Ini bug klasik — setelah laptop sleep, Minikube kadang jadi unresponsive. Command kubectl get pods hang terus.
Fix paling cepet:
minikube stop
minikube start
Jangan langsung minikube delete kecuali kamu memang mau reset semuanya. stop lalu start biasanya cukup.
Workflow Sehari-hari
Ini setup alias yang gue pakai di .zshrc / .bashrc biar workflow lebih cepet:
# Minikube shortcuts
alias mk='minikube'
alias mkstart='minikube start --driver=docker --cpus=2 --memory=4096'
alias mkstop='minikube stop'
alias mkstatus='minikube status'
# kubectl shortcuts
alias k='kubectl'
alias kgp='kubectl get pods'
alias kgs='kubectl get services'
alias kgd='kubectl get deployments'
alias klog='kubectl logs -f'
alias kdesc='kubectl describe'
# Lihat semua resource sekaligus
alias kall='kubectl get all'
Dan untuk ngeliat log pod dengan cepet:
# Lihat log pod terakhir yang match label
kubectl logs -f -l app=nginx --all-containers=true
Langkah Selanjutnya
Setup Kubernetes cluster lokal dengan Minikube ini baru permulaan. Yang gue lakuin setelah ini:
- Coba ConfigMap dan Secret — simulasi cara aplikasi baca environment variable dan credential di Kubernetes.
- Setup Persistent Volume — penting kalau kamu mau run database (PostgreSQL, MySQL) di cluster lokal.
- Eksperimen dengan Helm — package manager untuk Kubernetes. Install Helm dan coba deploy chart yang sudah ada, misalnya
helm install my-nginx nginx-stable/nginx-ingress. - Simulate rolling update — ubah image tag di deployment dan lihat bagaimana Kubernetes handle zero-downtime deployment.
- Belajar resource limits dan HPA (Horizontal Pod Autoscaler) — ini yang bikin perbedaan besar antara deployment yang proper dan yang asal jalan.
Minikube juga support multi-node cluster kalau kamu mau simulate scenario yang lebih realistis:
minikube start --nodes=3 --driver=docker
Ini bakal bikin satu control plane node dan dua worker node — persis seperti setup production minimal.
Kalau kamu udah comfortable dengan semua ini, langkah berikutnya adalah coba deploy ke managed Kubernetes yang sesungguhnya — entah itu GKE, EKS, atau DigitalOcean Kubernetes. Tapi skill yang kamu bangun di lokal dengan Minikube bakal langsung transferable ke sana.