#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