Panduan migrasi CloudLab dari Docker Compose ke Kubernetes.
| Aspek | Docker Compose | Kubernetes |
|---|---|---|
| Orkestrasi | Single host | Multi-node cluster |
| Penskalaan (Scaling) | Manual (docker compose scale) |
Otomatis (HPA) |
| Ketersediaan Tinggi | Terbatas | Built-in (replika, pemulihan mandiri) |
| Load Balancing | Dasar | Lanjutan (Services, Ingress) |
| Penyimpanan | Docker volumes | PersistentVolumes |
| Jaringan | Bridge network | Service mesh, Network Policies |
| Konfigurasi | Environment variables | ConfigMaps, Secrets |
| Deployment | docker compose up |
kubectl apply |
| Monitoring | Setup manual | Integrasi native |
Docker Compose:
services:
nodejs-app:
build: ./apps/demo-apps/nodejs-app
ports:
- "3001:3001"
environment:
- NODE_ENV=productionKubernetes:
# Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodejs-app
spec:
replicas: 3 # High Availability dengan multiple replicas
template:
spec:
containers:
- name: nodejs-app
image: cloudlab-nodejs-app:latest
env:
- name: NODE_ENV
value: production
---
# Service
apiVersion: v1
kind: Service
metadata:
name: nodejs-app
spec:
selector:
app: nodejs-app
ports:
- port: 3001
targetPort: 3001Docker Compose:
networks:
cloudlab-network:
driver: bridgeKubernetes:
- Services menyediakan penemuan layanan berbasis DNS
- Network Policies untuk kontrol lalu lintas (opsional)
- Pods dapat berkomunikasi melalui nama service
Docker Compose:
volumes:
prometheus-data:
driver: localKubernetes:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: prometheus-storage
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10GiDocker Compose:
depends_on:
- prometheusKubernetes:
- Readiness probes memastikan layanan siap menerima trafik
- Init containers untuk dependensi startup
- Service discovery menangani ketersediaan
-
Audit Setup Saat Ini
# List running services docker compose ps # Cek penggunaan resource docker stats # Ekspor konfigurasi docker compose config > docker-compose-backup.yml
-
Build dan Tag Images
# Build images dengan versioning cd apps/demo-apps/nodejs-app docker build -t cloudlab-nodejs-app:1.0.0 . docker tag cloudlab-nodejs-app:1.0.0 cloudlab-nodejs-app:latest cd ../python-app docker build -t cloudlab-python-app:1.0.0 . docker tag cloudlab-python-app:1.0.0 cloudlab-python-app:latest
-
Backup Data
# Backup Grafana data docker cp cloudlab-grafana:/var/lib/grafana ./backup/grafana # Backup Prometheus data docker cp cloudlab-prometheus:/prometheus ./backup/prometheus
-
Pilih Tipe Cluster
- Lokal: Minikube atau Kind
- Cloud: GKE, EKS, atau AKS
- On-premise: kubeadm atau k3s
-
Install Tools yang Dibutuhkan
# kubectl curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" sudo install kubectl /usr/local/bin/ # Minikube (untuk lokal) curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube
-
Mulai Cluster
# Minikube minikube start --cpus=4 --memory=8192 minikube addons enable ingress minikube addons enable metrics-server
-
Siapkan Images
# Untuk Minikube minikube image load cloudlab-nodejs-app:latest minikube image load cloudlab-python-app:latest # Untuk cluster lain, push ke registry # docker push your-registry/cloudlab-nodejs-app:latest
-
Generate Sertifikat SSL
# Generate self-signed cert openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /tmp/tls.key -out /tmp/tls.crt \ -subj "/C=ID/ST=Jakarta/L=Jakarta/O=CloudLab/OU=Dev/CN=cloudlab.local" # Update secret TLS_CRT=$(cat /tmp/tls.crt | base64 -w 0) TLS_KEY=$(cat /tmp/tls.key | base64 -w 0) sed -i "s|tls.crt:.*|tls.crt: $TLS_CRT|" k8s/base/secrets/ssl-certs.yaml sed -i "s|tls.key:.*|tls.key: $TLS_KEY|" k8s/base/secrets/ssl-certs.yaml
-
Deploy Resources
# Deploy dengan kustomize kubectl apply -k k8s/ # Tunggu rollout selesai kubectl rollout status deployment/nodejs-app -n cloudlab-apps kubectl rollout status deployment/python-app -n cloudlab-apps kubectl rollout status deployment/grafana -n cloudlab-monitoring kubectl rollout status statefulset/prometheus -n cloudlab-monitoring
-
Verifikasi Deployment
# Cek pods kubectl get pods -n cloudlab-apps kubectl get pods -n cloudlab-monitoring # Cek services kubectl get svc -n cloudlab-apps kubectl get svc -n cloudlab-monitoring # Cek ingress kubectl get ingress -A
-
Restore Data Grafana
# Copy backup ke pod kubectl cp ./backup/grafana grafana-<pod-id>:/var/lib/grafana -n cloudlab-monitoring # Restart Grafana kubectl rollout restart deployment/grafana -n cloudlab-monitoring
-
Restore Data Prometheus
# Copy backup ke pod kubectl cp ./backup/prometheus prometheus-0:/prometheus -n cloudlab-monitoring # Restart Prometheus kubectl rollout restart statefulset/prometheus -n cloudlab-monitoring
-
Pengujian Fungsional
# Port forward untuk testing kubectl port-forward svc/nodejs-app 3001:3001 -n cloudlab-apps & kubectl port-forward svc/python-app 5000:5000 -n cloudlab-apps & kubectl port-forward svc/grafana 3000:3000 -n cloudlab-monitoring & # Test endpoints curl http://localhost:3001/health curl http://localhost:5000/health curl http://localhost:3000/api/health
-
Pengujian Beban (Load Testing)
# Generate load kubectl run -it --rm load-generator --image=busybox -- /bin/sh while true; do wget -q -O- http://nodejs-app.cloudlab-apps.svc.cluster.local:3001; done # Watch autoscaling kubectl get hpa -n cloudlab-apps --watch
-
Pengujian Monitoring
# Cek target Prometheus kubectl port-forward svc/prometheus 9090:9090 -n cloudlab-monitoring # Buka http://localhost:9090/targets # Cek dashboard Grafana # Buka http://localhost:3000
-
Update DNS/Hosts
# Dapatkan IP Ingress kubectl get ingress -n cloudlab-apps # Update /etc/hosts echo "$(minikube ip) cloudlab.local grafana.cloudlab.local" | sudo tee -a /etc/hosts
-
Hentikan Docker Compose
# Hentikan services docker compose down # Simpan volumes untuk backup # docker compose down -v # Hanya jika ingin menghapus volumes
-
Verifikasi Trafik Produksi
# Test via Ingress curl https://cloudlab.local curl https://grafana.cloudlab.local
Jika terjadi masalah, rollback kembali ke Docker Compose:
# 1. Hapus deployment Kubernetes
kubectl delete -k k8s/
# 2. Jalankan Docker Compose
docker compose up -d
# 3. Verifikasi services
docker compose psMasalah: Kubernetes tidak bisa mengambil image.
Solusi:
# Untuk Minikube, load image langsung
minikube image load cloudlab-nodejs-app:latest
# Untuk cluster lain, push ke registry
docker tag cloudlab-nodejs-app:latest your-registry/cloudlab-nodejs-app:latest
docker push your-registry/cloudlab-nodejs-app:latest
# Update kustomization.yaml dengan registry URLMasalah: Pods tertahan di status Pending.
Solusi:
# Cek resource node
kubectl top nodes
# Cek event pod
kubectl describe pod <pod-name> -n cloudlab-apps
# Scale down jika resource tidak cukup
kubectl scale deployment nodejs-app --replicas=1 -n cloudlab-appsMasalah: Tidak bisa akses via Ingress.
Solusi:
# Cek Ingress controller
kubectl get pods -n ingress-nginx
# Untuk Minikube, enable ingress addon
minikube addons enable ingress
# Untuk Minikube, jalankan tunnel
minikube tunnelMasalah: PersistentVolumeClaim tertahan di status Pending.
Solusi:
# Cek storage class
kubectl get storageclass
# Untuk Minikube, enable storage provisioner
minikube addons enable storage-provisioner
# Cek event PVC
kubectl describe pvc grafana-storage -n cloudlab-monitoring| Metrik | Docker Compose | Kubernetes (3 replika) |
|---|---|---|
| Memori | ~2GB | ~4GB |
| CPU | ~1 core | ~2 cores |
| Waktu Startup | ~30s | ~60s |
| Skalabilitas | Manual | Otomatis (HPA) |
- High Availability: Multiple replicas dengan pemulihan mandiri
- Auto-scaling: HPA berdasarkan CPU/memory
- Rolling Updates: Deployment tanpa downtime
- Monitoring Lebih Baik: Integrasi native Prometheus
- Portabilitas Cloud: Deploy di mana saja
- Kesiapan Produksi: Orkestrasi kelas enterprise
- Setup CI/CD: Update GitHub Actions untuk deployment Kubernetes
- Implementasi GitOps: ArgoCD atau FluxCD untuk sinkronisasi otomatis
- Tambah Monitoring: Prometheus Operator, dashboard Grafana
- Penguatan Keamanan: Network Policies, RBAC, Pod Security
- Strategi Backup: Velero untuk backup cluster
- Service Mesh: Istio atau Linkerd untuk manajemen trafik tingkat lanjut
- Dokumentasi Kubernetes
- Docker Compose ke Kubernetes
- Kompose Tool - Konversi otomatis Compose ke K8s
- Kustomize
Migrasi Selesai! Selamat Datang di Kubernetes!