- Deploy Kubernetes ด้วย Minikube: คู่มือฉบับใช้งานจริงสำหรับ Local Development
- 3. สิ่งที่ต้องเตรียม
- 4. ติดตั้ง Minikube
- 5. ติดตั้ง kubectl
- 6. สร้าง Kubernetes Cluster ด้วย Minikube
- 7. ตรวจสอบ Kubernetes Cluster
- 8. วิธีที่ 1: Deploy Application ด้วย kubectl
- 9. สร้าง Service
- 10. เปิด Application
- 11. ใช้ Port Forward
- 12. Deploy ด้วย YAML Manifest
- 13. Deployment และ Service ทำงานร่วมกันอย่างไร
- 14. Scale Application
- 15. ทดสอบ Self-Healing
- 16. Update Application
- 17. Rollback
- 18. ดู Log
- 19. เข้าไปใน Container
- 20. เปิด Kubernetes Dashboard
- 21. ใช้ LoadBalancer บน Minikube
- 22. เปิดใช้งาน Ingress
- 23. ตัวอย่าง Ingress
- 24. Addons ที่น่าสนใจ
- 25. Deploy Local Docker Image เข้า Minikube
- 26. ตรวจสอบ Resource
- 27. Debug เมื่อ Pod ไม่ทำงาน
- 28. Pause และ Resume Cluster
- 29. ลบ Cluster
- 30. Command Cheat Sheet
- 31. Workflow สำหรับ Development
- 32. Minikube เหมาะกับอะไร
- 33. Minikube vs kind
- 34. จาก Minikube ไป Production
- 35. สรุป
#Deploy Kubernetes ด้วย Minikube: คู่มือฉบับใช้งานจริงสำหรับ Local Development
Kubernetes หรือ K8s เป็นระบบสำหรับจัดการ Container แบบอัตโนมัติ เช่น การ Deploy, Scale, Load Balancing, Self-Healing และ Rolling Update แต่การเรียน Kubernetes โดยเริ่มจาก Cloud Provider เช่น Amazon EKS, Google Kubernetes Engine หรือ Azure Kubernetes Service อาจมีความซับซ้อนและมีค่าใช้จ่าย
Minikube จึงเป็นเครื่องมือที่เหมาะสำหรับการเรียนรู้และพัฒนา Kubernetes บนเครื่อง Local เพราะสามารถสร้าง Kubernetes Cluster ขนาดเล็กบน Windows, macOS และ Linux ได้โดยตรง
บทความนี้จะพา Deploy Web Application ตั้งแต่การสร้าง Cluster จนถึงการเข้าถึง Application ผ่าน Service รวมถึงคำสั่งที่ใช้บ่อย เช่น Scale, Update, Rollback, Dashboard และ Ingress
#1. Minikube คืออะไร
Minikube เป็นเครื่องมือสำหรับสร้าง Kubernetes Cluster บนเครื่อง Local โดย Cluster สามารถทำงานผ่าน Container หรือ Virtual Machine Driver เช่น
- Docker
- Podman
- Hyper-V
- VirtualBox
- KVM
- VMware
- QEMU
เหมาะกับงานประเภท:
- เรียนรู้ Kubernetes
- พัฒนา Application ก่อน Deploy ขึ้น Production
- ทดลอง Kubernetes Manifest
- ทดลอง Deployment / Service / ConfigMap / Secret
- ทดลอง Ingress
- ทดลอง Helm Chart
- ทดสอบ CI/CD Pipeline
- Workshop และ Lab สำหรับผู้เรียน
Minikube เหมาะกับ Development และ Learning Environment ไม่ใช่ตัวเลือกหลักสำหรับ Production Cluster
#2. Architecture เบื้องต้น
Workflow ที่เราจะใช้ในบทความนี้คือ
Developer
|
| kubectl apply
v
+-----------------------------+
| Minikube Cluster |
| |
| +-----------------------+ |
| | Deployment | |
| | | |
| | +-----+ +-----+ | |
| | | Pod | | Pod | | |
| | +-----+ +-----+ | |
| +-----------+-----------+ |
| | |
| +----v----+ |
| | Service | |
| +----+----+ |
+--------------|--------------+
|
v
Browser
องค์ประกอบหลักประกอบด้วย:
| Component | หน้าที่ |
|---|---|
| Minikube | สร้าง Kubernetes Cluster บนเครื่อง Local |
| kubectl | CLI สำหรับสั่งงาน Kubernetes API |
| Deployment | กำหนดและควบคุมจำนวน Pod |
| Pod | หน่วยทำงานพื้นฐานที่รัน Container |
| Service | สร้าง Endpoint ที่เสถียรสำหรับเข้าถึง Pod |
| Ingress | กำหนด HTTP/HTTPS Routing จากภายนอกเข้าสู่ Service |
#3. สิ่งที่ต้องเตรียม
ตามคำแนะนำของ Minikube ควรมีอย่างน้อย:
- CPU 2 Core ขึ้นไป
- RAM ว่างอย่างน้อย 2 GB
- Disk ว่างประมาณ 20 GB
- Internet
- Container Runtime หรือ VM Manager เช่น Docker
ตรวจสอบ Docker:
docker --version
ตัวอย่างผลลัพธ์:
Docker version 28.x.x
#4. ติดตั้ง Minikube
#macOS
ถ้าใช้ Homebrew:
brew install minikube
ตรวจสอบ:
minikube version
#Windows
ติดตั้งผ่าน Winget:
winget install Kubernetes.minikube
หรือติดตั้งผ่าน Chocolatey:
choco install minikube
ตรวจสอบ:
minikube version
#Linux
ตัวอย่างสำหรับ x86-64:
curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
rm minikube-linux-amd64
ตรวจสอบ:
minikube version
#5. ติดตั้ง kubectl
kubectl คือ Command Line Tool สำหรับติดต่อ Kubernetes API Server
#macOS
brew install kubectl
#Windows
winget install -e --id Kubernetes.kubectl
#Linux
ดาวน์โหลด binary รุ่นล่าสุด:
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
ตรวจสอบ:
kubectl version --client
โดยทั่วไปควรใช้
kubectlที่มี Minor Version ต่างจาก Kubernetes Cluster ไม่เกิน 1 รุ่น
#6. สร้าง Kubernetes Cluster ด้วย Minikube
ถ้าใช้ Docker เป็น Driver:
minikube start --driver=docker
หรือให้ Minikube เลือก Driver ที่เหมาะสม:
minikube start
ตรวจสอบสถานะ:
minikube status
ตัวอย่าง:
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
#7. ตรวจสอบ Kubernetes Cluster
ดู Node:
kubectl get nodes
ตัวอย่าง:
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 1m v1.xx.x
ดูข้อมูล Cluster:
kubectl cluster-info
ดู Resource ทั้งหมดในทุก Namespace:
kubectl get all -A
#8. วิธีที่ 1: Deploy Application ด้วย kubectl
เราจะใช้ Echo Server เป็นตัวอย่าง
สร้าง Deployment:
kubectl create deployment hello-minikube \
--image=kicbase/echo-server:1.0
ตรวจสอบ Deployment:
kubectl get deployments
ตรวจสอบ Pod:
kubectl get pods
ดูรายละเอียด:
kubectl describe deployment hello-minikube
#9. สร้าง Service
Pod มี IP ที่เปลี่ยนแปลงได้เมื่อ Pod ถูกสร้างใหม่ ดังนั้น Client ไม่ควรเชื่อมต่อ Pod โดยตรง
Kubernetes จึงมี Service เพื่อสร้าง Endpoint ที่เสถียรสำหรับกลุ่ม Pod
สร้าง NodePort Service:
kubectl expose deployment hello-minikube \
--type=NodePort \
--port=8080
ตรวจสอบ:
kubectl get services
หรือแบบย่อ:
kubectl get svc
#10. เปิด Application
Minikube มีคำสั่งช่วยเปิด Service โดยตรง:
minikube service hello-minikube
ถ้าต้องการเฉพาะ URL:
minikube service hello-minikube --url
ตัวอย่าง:
http://127.0.0.1:52341
เปิด URL นี้ผ่าน Browser หรือทดสอบด้วย:
curl http://127.0.0.1:52341
เมื่อใช้ Docker Driver บางระบบ โดยเฉพาะ macOS/Windows Terminal ที่รัน
minikube service ... --urlอาจต้องเปิดค้างไว้เพื่อทำ Tunnel ระหว่าง Host กับ Cluster
#11. ใช้ Port Forward
อีกวิธีที่สะดวกในการเข้าถึง Service คือ kubectl port-forward
kubectl port-forward service/hello-minikube 7080:8080
จากนั้นเปิด:
http://localhost:7080
หรือ:
curl http://localhost:7080
#12. Deploy ด้วย YAML Manifest
การใช้คำสั่ง kubectl create เหมาะกับการทดลอง แต่ในการพัฒนาจริงนิยมใช้ YAML เพื่อให้ Infrastructure สามารถ Version Control ได้
สร้างไฟล์:
k8s/
├── deployment.yaml
└── service.yaml
#deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 2
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web-app
image: nginx:alpine
ports:
- containerPort: 80
Deploy:
kubectl apply -f k8s/deployment.yaml
ตรวจสอบ:
kubectl get deployment
kubectl get pods
#service.yaml
apiVersion: v1
kind: Service
metadata:
name: web-app-service
spec:
selector:
app: web-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
Deploy:
kubectl apply -f k8s/service.yaml
ตรวจสอบ:
kubectl get svc
เปิด Application:
minikube service web-app-service
#13. Deployment และ Service ทำงานร่วมกันอย่างไร
จุดสำคัญคือ Label / Selector
ใน Deployment:
template:
metadata:
labels:
app: web-app
ใน Service:
selector:
app: web-app
ดังนั้น Service จะค้นหา Pod ที่มี:
app=web-app
ตรวจสอบได้ด้วย:
kubectl get pods -l app=web-app
#14. Scale Application
เพิ่มจาก 2 Pod เป็น 5 Pod:
kubectl scale deployment web-app --replicas=5
ตรวจสอบ:
kubectl get pods
หรือแก้ใน YAML:
spec:
replicas: 5
แล้ว Apply ใหม่:
kubectl apply -f k8s/deployment.yaml
Kubernetes จะพยายามรักษา Desired State ให้มีจำนวน Pod ตามที่กำหนด
#15. ทดสอบ Self-Healing
ดู Pod:
kubectl get pods
เลือก Pod หนึ่งตัวแล้วลบ:
kubectl delete pod <pod-name>
ตรวจสอบใหม่:
kubectl get pods
ถ้า Deployment กำหนด:
replicas: 2
Kubernetes จะสร้าง Pod ใหม่เพื่อให้จำนวนกลับมาเป็น 2
นี่คือแนวคิด Self-Healing
#16. Update Application
สมมติเปลี่ยน Image:
kubectl set image deployment/web-app \
web-app=nginx:1.27-alpine
ตรวจสอบ Rolling Update:
kubectl rollout status deployment/web-app
ดูประวัติ:
kubectl rollout history deployment/web-app
#17. Rollback
หาก Version ใหม่มีปัญหา:
kubectl rollout undo deployment/web-app
ตรวจสอบ:
kubectl rollout status deployment/web-app
Kubernetes สามารถย้อนกลับไป ReplicaSet ก่อนหน้าได้
#18. ดู Log
ดูชื่อ Pod:
kubectl get pods
ดู Log:
kubectl logs <pod-name>
ดู Log แบบต่อเนื่อง:
kubectl logs -f <pod-name>
ถ้า Pod มีหลาย Container:
kubectl logs <pod-name> -c <container-name>
#19. เข้าไปใน Container
kubectl exec -it <pod-name> -- sh
เช่น:
kubectl exec -it web-app-xxxx -- sh
เหมาะสำหรับตรวจสอบ:
- Environment Variables
- Files
- Network
- DNS
- Configuration
#20. เปิด Kubernetes Dashboard
Minikube มี Dashboard สำหรับดู Cluster ผ่าน Web UI
minikube dashboard
หรือขอ URL:
minikube dashboard --url
Dashboard ช่วยดู:
- Nodes
- Deployments
- Pods
- Services
- ReplicaSets
- ConfigMaps
- Secrets
- Logs
#21. ใช้ LoadBalancer บน Minikube
สร้าง Service แบบ LoadBalancer:
kubectl expose deployment web-app \
--name=web-app-lb \
--type=LoadBalancer \
--port=80
ดู Service:
kubectl get svc
จากนั้นเปิด Terminal อีกหน้าต่าง:
minikube tunnel
ตรวจสอบ:
kubectl get svc web-app-lb
เมื่อมี EXTERNAL-IP แล้วจึงเข้าถึง Service ผ่าน IP ดังกล่าวได้
minikube tunnelจำลองพฤติกรรมของ LoadBalancer สำหรับ Local Cluster
#22. เปิดใช้งาน Ingress
Minikube มี Ingress Addon
เปิด:
minikube addons enable ingress
ตรวจสอบ:
minikube addons list
ดู Ingress Controller:
kubectl get pods -n ingress-nginx
#23. ตัวอย่าง Ingress
สมมติเรามี Service:
web-app-service
สร้าง ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-app-ingress
spec:
rules:
- host: web.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-app-service
port:
number: 80
Apply:
kubectl apply -f k8s/ingress.yaml
ดู Ingress:
kubectl get ingress
ดู IP ของ Minikube:
minikube ip
สมมติได้:
192.168.49.2
เพิ่มใน /etc/hosts:
192.168.49.2 web.local
จากนั้นทดลอง:
curl http://web.local
ถ้าใช้ Docker Desktop และ Ingress เข้าถึงไม่ได้ อาจต้องรัน
minikube tunnelและใช้พฤติกรรมตาม Driver/OS ที่ใช้งาน
#24. Addons ที่น่าสนใจ
ดู Addon ทั้งหมด:
minikube addons list
เปิด Addon:
minikube addons enable <addon-name>
ตัวอย่าง:
minikube addons enable ingress
สามารถเปิด Addon หลายตัวตั้งแต่ตอน Start Cluster ได้ เช่น:
minikube start \
--addons=ingress \
--addons=metrics-server
#25. Deploy Local Docker Image เข้า Minikube
ระหว่าง Development เราอาจไม่ต้องการ Push Image ขึ้น Docker Hub ทุกครั้ง
สมมติมี Dockerfile:
FROM nginx:alpine
COPY ./html /usr/share/nginx/html
สร้าง Image เข้า Minikube โดยตรง:
minikube image build -t my-web:v1 .
ตรวจสอบ:
minikube image ls
ใช้ใน Deployment:
containers:
- name: my-web
image: my-web:v1
imagePullPolicy: IfNotPresent
จากนั้น:
kubectl apply -f k8s/deployment.yaml
แนวทางนี้ช่วยให้ Development Loop เร็วขึ้นมาก
#26. ตรวจสอบ Resource
คำสั่งพื้นฐานที่ใช้บ่อย:
kubectl get nodes
kubectl get pods
kubectl get deployments
kubectl get replicasets
kubectl get services
kubectl get ingress
ดู Resource หลัก:
kubectl get all
ดูทุก Namespace:
kubectl get all -A
ดูรายละเอียด:
kubectl describe pod <pod-name>
#27. Debug เมื่อ Pod ไม่ทำงาน
ตรวจสอบ:
kubectl get pods
ถ้าเจอ:
CrashLoopBackOff
ดูรายละเอียด:
kubectl describe pod <pod-name>
ดู Log:
kubectl logs <pod-name>
กรณี Container Restart แล้วต้องการ Log ก่อนหน้า:
kubectl logs <pod-name> --previous
ดู Events:
kubectl get events --sort-by=.metadata.creationTimestamp
ปัญหาที่พบบ่อย:
- Image name ผิด
- Pull Image ไม่ได้
- Container Port ผิด
- Application Crash
- Environment Variable ไม่ครบ
- ConfigMap / Secret ไม่ถูกต้อง
- Readiness Probe ไม่ผ่าน
- Liveness Probe ไม่ผ่าน
- Resource Memory/CPU ไม่พอ
#28. Pause และ Resume Cluster
หยุด Cluster ชั่วคราว:
minikube stop
เปิดใหม่:
minikube start
Resource เดิมมักยังคงอยู่เพราะ Cluster เดิมถูกหยุด ไม่ได้ถูกลบ
#29. ลบ Cluster
หากต้องการลบ Cluster:
minikube delete
ลบทุก Profile:
minikube delete --all
ตรวจสอบ Profile:
minikube profile list
#30. Command Cheat Sheet
| งาน | คำสั่ง |
|---|---|
| Start Cluster | minikube start |
| Start ด้วย Docker | minikube start --driver=docker |
| ดูสถานะ | minikube status |
| ดู IP | minikube ip |
| Stop | minikube stop |
| Delete | minikube delete |
| Dashboard | minikube dashboard |
| เปิด Service | minikube service <service> |
| ดู URL | minikube service <service> --url |
| เปิด Ingress | minikube addons enable ingress |
| LoadBalancer | minikube tunnel |
| ดู Node | kubectl get nodes |
| ดู Pod | kubectl get pods |
| ดู Service | kubectl get svc |
| Apply YAML | kubectl apply -f file.yaml |
| ดู Log | kubectl logs <pod> |
| Scale | kubectl scale deployment <name> --replicas=3 |
| Rollback | kubectl rollout undo deployment/<name> |
#31. Workflow สำหรับ Development
Workflow ที่แนะนำ:
1. เขียน Application
|
v
2. Build Docker Image
|
v
3. minikube image build
|
v
4. kubectl apply
|
v
5. Kubernetes Deployment
|
v
6. Pods
|
v
7. Service
|
v
8. Ingress / minikube service
|
v
9. Browser / API Client
ตัวอย่างคำสั่ง:
minikube start --driver=docker
minikube image build -t my-app:v1 .
kubectl apply -f k8s/
kubectl get pods
minikube service my-app-service
#32. Minikube เหมาะกับอะไร
Minikube เหมาะกับ:
#เรียน Kubernetes
สามารถทดลอง Resource สำคัญได้เกือบครบ:
Pod
Deployment
ReplicaSet
Service
Ingress
ConfigMap
Secret
PersistentVolume
Job
CronJob
DaemonSet
StatefulSet
#Development
Developer สามารถทดลองระบบบน Kubernetes ก่อน Deploy ขึ้น Cloud
#CI/CD Lab
สามารถใช้ทดลอง Pipeline:
GitHub
|
GitHub Actions
|
Docker Build
|
Kubernetes Manifest
|
Minikube
#Helm
Minikube เหมาะมากสำหรับทดลอง Helm Chart:
helm install my-app ./chart
#33. Minikube vs kind
เครื่องมือยอดนิยมสำหรับ Local Kubernetes คือ Minikube และ kind
| หัวข้อ | Minikube | kind |
|---|---|---|
| Local Kubernetes | ✅ | ✅ |
| Docker-based | ✅ | ✅ |
| VM Driver | ✅ | ❌ |
| Dashboard | มีในตัว | ต้องติดตั้งเอง |
| Addons | มี | จำกัด |
minikube service |
มี | ไม่มี |
minikube tunnel |
มี | ไม่มี |
| Multi-node | รองรับ | รองรับ |
| เหมาะกับ Learning | ดีมาก | ดี |
| เหมาะกับ CI | ดี | ดีมาก |
ถ้าเป้าหมายคือ เรียน Kubernetes และทำ Workshop Minikube ใช้งานสะดวกมาก
ถ้าเป้าหมายคือ สร้าง Cluster ชั่วคราวใน CI Pipeline kind มักมี workflow ที่กระชับกว่า
#34. จาก Minikube ไป Production
เมื่อเข้าใจ Minikube แล้ว Kubernetes Manifest ชุดเดียวกันสามารถนำแนวคิดไปใช้กับ Managed Kubernetes เช่น:
Amazon EKS
Google Kubernetes Engine (GKE)
Azure Kubernetes Service (AKS)
DigitalOcean Kubernetes
ภาพรวม:
Local Development
Minikube
|
| Kubernetes YAML / Helm
v
Production
EKS / GKE / AKS
สิ่งที่จะต้องเพิ่มใน Production เช่น:
- Container Registry
- Managed Load Balancer
- DNS
- TLS
- Persistent Storage
- Secrets Management
- Monitoring
- Logging
- Autoscaling
- Backup
- Security Policy
- GitOps / CI/CD
#35. สรุป
การ Deploy Kubernetes ด้วย Minikube เป็นวิธีที่ดีในการเรียนรู้ Kubernetes เพราะเราสามารถสร้าง Cluster ได้บนเครื่องส่วนตัวโดยไม่ต้องเสียค่าใช้จ่าย Cloud
ขั้นตอนหลักคือ:
Install Minikube
↓
minikube start
↓
kubectl apply Deployment
↓
Pods
↓
Service
↓
minikube service / Ingress
↓
Application
คำสั่งหลักที่ควรจำ:
minikube start
kubectl apply -f k8s/
kubectl get pods
kubectl get svc
minikube service <service-name>
เมื่อเข้าใจ Workflow นี้แล้ว สามารถต่อยอดไปสู่หัวข้อสำคัญ เช่น Helm, Ingress, Persistent Volume, ConfigMap, Secret, Horizontal Pod Autoscaler, GitOps และ Kubernetes บน Cloud ได้ง่ายขึ้น
#References
- Minikube — Start: https://minikube.sigs.k8s.io/docs/start/
- Minikube — Deploying apps: https://minikube.sigs.k8s.io/docs/handbook/deploying/
- Kubernetes — Install Tools: https://kubernetes.io/docs/tasks/tools/
- Kubernetes — Using a Service to Expose Your App: https://kubernetes.io/docs/tutorials/kubernetes-basics/expose/expose-intro/
- Kubernetes — Hello Minikube: https://kubernetes.io/docs/tutorials/hello-minikube/
- Kubernetes — Service: https://kubernetes.io/docs/concepts/services-networking/service/