
เมื่อแอปพลิเคชันของคุณโตขึ้น การรัน Container ด้วย docker run หรือ docker-compose up เริ่มไม่เพียงพอ คุณต้องการระบบที่ กระจาย Load อัตโนมัติ, รีสตาร์ท Container ที่ล่มเอง, และ อัปเดตโดยไม่หยุดบริการ — นั่นคือจุดที่ Kubernetes เข้ามาแก้ปัญหา
บทความนี้อธิบาย Kubernetes ตั้งแต่ต้น ไม่ว่าคุณจะเป็นนักพัฒนาที่เพิ่งเริ่มรู้จัก Container หรือ DevOps ที่ต้องการทดลองบน VPS ก็อ่านได้เลย
สิ่งที่ต้องรู้ก่อน: ควรมีความเข้าใจเบื้องต้นเกี่ยวกับ Docker และ Container แล้ว หากยังไม่รู้จัก Docker แนะนำอ่าน Docker คืออะไร ก่อน
Kubernetes คืออะไร?
Kubernetes (อ่านว่า "คูเบอร์เนทิส") หรือเรียกย่อว่า K8s คือ Container Orchestration Platform โอเพ่นซอร์สที่พัฒนาโดย Google และปัจจุบันดูแลโดย Cloud Native Computing Foundation (CNCF)
พูดง่ายๆ คือ Kubernetes ทำหน้าที่เป็น "ผู้จัดการ Container" ที่ดูแลว่า Container ของคุณรันอยู่บนเครื่องไหน มีจำนวนเท่าไหร่ และพร้อมรับ Traffic ตลอดเวลาหรือไม่
ที่มาของชื่อ: "Kubernetes" มาจากภาษากรีก แปลว่า "นายท้าย" หรือ "กัปตันเรือ" — สื่อถึงการควบคุมทิศทางของ Container ทั้งหมด
ปัญหาที่ Kubernetes แก้ไข
ลองนึกภาพว่าคุณมีเว็บแอปพลิเคชันที่รันอยู่บน 3 Container บน VPS เครื่องเดียว เมื่อมี Traffic เพิ่มขึ้นจู่ๆ Container หนึ่งล่มเพราะ RAM เต็ม:
- Docker Compose จะทำอะไรไม่ได้ — Container ล่มก็ล่มอยู่นั่นแหละ ต้อง Manual restart
- ถ้าต้องการ Scale ขึ้น 5 Container ก็ต้องทำเอง ไม่มีระบบอัตโนมัติ
- ถ้าต้องการ Deploy version ใหม่โดยไม่หยุดบริการ ต้องวางแผนเอง
Kubernetes แก้ปัญหาทั้งหมดนี้ด้วย:
- Self-healing: Container ล่มปุ๊บ รีสตาร์ทอัตโนมัติทันที
- Auto-scaling: เพิ่ม/ลด Container ตาม CPU/Memory load
- Rolling Updates: อัปเดตทีละ Container โดยไม่หยุดบริการ
- Load Balancing: กระจาย Traffic ให้ Container ทุกตัวเท่าๆ กัน
แนวคิดหลักที่ต้องรู้ (Core Concepts)
1. Cluster
Cluster คือกลุ่มของเครื่อง (Node) ที่ทำงานร่วมกันภายใต้ Kubernetes หนึ่ง Cluster ประกอบด้วย Control Plane (สมองกลาง) และ Worker Nodes (ผู้รัน Container)
2. Node
Node คือเครื่องหนึ่งเครื่องในระบบ อาจเป็น VPS หรือ Physical Server Node แต่ละตัวรัน Container ตามที่ Control Plane สั่ง มี 2 ประเภท:
- Control Plane Node: จัดการ Cluster ทั้งหมด ตัดสินใจว่า Pod จะรันบน Node ไหน
- Worker Node: รัน Pod จริงๆ ตามคำสั่งจาก Control Plane
3. Pod
Pod คือหน่วยที่เล็กที่สุดใน Kubernetes หนึ่ง Pod มี Container อย่างน้อย 1 ตัว (โดยทั่วไปคือ 1 Container ต่อ 1 Pod) Pod ทุกตัวมี IP address ของตัวเอง และ Container ภายใน Pod เดียวกันแชร์ Network กัน
4. Deployment
Deployment คือ Template ที่บอก Kubernetes ว่า "ฉันต้องการ Pod นี้จำนวน X ตัว ตลอดเวลา" ถ้า Pod ตัวไหนล่ม Deployment จะสร้าง Pod ใหม่ขึ้นมาแทนทันที
5. Service
Service คือ Stable IP/DNS ที่ใช้เข้าถึง Pod เนื่องจาก Pod เปลี่ยน IP ได้ตลอด Service จึงเป็นตัวกลางที่รับ Traffic แล้วส่งต่อให้ Pod ที่พร้อมทำงาน
Kubernetes vs Docker Compose — ต่างกันอย่างไร?
ผู้ใช้ Docker ส่วนใหญ่คุ้นเคยกับ Docker Compose ก่อน ทั้งสองใช้ Container เหมือนกัน แต่เหมาะกับ Scale ที่ต่างกัน:
| ลักษณะ | Docker Compose | Kubernetes |
|---|---|---|
| จำนวนเครื่อง | 1 เครื่อง | หลายเครื่อง (Multi-node) |
| Self-healing | ไม่มี (ต้อง restart: always) | มี — สร้าง Pod ใหม่อัตโนมัติ |
| Auto-scaling | ไม่มี | มี (HPA) |
| Rolling Update | ต้อง down แล้ว up ใหม่ | ไม่ต้อง down |
| Load Balancing | พื้นฐาน (Nginx manual) | Built-in |
| ความซับซ้อน | ต่ำ | สูง (learning curve) |
| เหมาะกับ | Dev/Test, Production เล็กๆ | Production ขนาดกลาง-ใหญ่ |
Helm: Package Manager สำหรับ Kubernetes
Helm คือ Package Manager สำหรับ Kubernetes เหมือนกับ apt บน Ubuntu หรือ pip บน Python แทนที่จะต้องเขียน YAML หลายสิบไฟล์เพื่อ Deploy แอปพลิเคชัน Helm ให้คุณติดตั้ง Application ที่ซับซ้อนด้วยคำสั่งเดียว
Helm ทำงานอย่างไร
Helm ใช้แนวคิด "Chart" ซึ่งคือชุดของ YAML Template ที่ถูก Package ไว้ด้วยกัน พร้อม Default Values ที่ปรับแต่งได้:
| แนวคิด | คำอธิบาย | เปรียบเหมือน |
|---|---|---|
| Chart | ชุด YAML Template ของ Application | Package (.deb/.rpm) |
| Release | Instance ที่รันอยู่จริงบน Cluster | Process ที่ Install แล้ว |
| Repository | แหล่งรวม Chart จากชุมชน | apt-get repository |
| values.yaml | ไฟล์ปรับแต่งค่าของ Chart | Configuration file |
ติดตั้ง Helm และใช้งานเบื้องต้น
# ติดตั้ง Helm (Linux)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# เพิ่ม Official Helm Repository
helm repo add stable https://charts.helm.sh/stable
helm repo update
# ติดตั้ง Nginx Ingress Controller ด้วย Helm ในคำสั่งเดียว
helm install my-nginx ingress-nginx/ingress-nginx
# ดู Release ที่ติดตั้งแล้ว
helm list
# ถอนการติดตั้ง
helm uninstall my-nginx
Helm ช่วยประหยัดเวลาได้มากเมื่อต้องการ Deploy Application ที่มี Component ซับซ้อน เช่น WordPress บน Kubernetes ซึ่งต้องการ Deployment, Service, PersistentVolume, ConfigMap และ Secret รวมกัน — ด้วย Helm ทำได้ในคำสั่งเดียว
Kubernetes เหมาะกับใคร?
Kubernetes ไม่ใช่ Tools ที่ทุกคนต้องใช้ เหมาะกับสถานการณ์เหล่านี้:
- Microservices Architecture: แอปที่แบ่งเป็น Service ย่อยหลายตัว (API, Auth, Notification ฯลฯ)
- Traffic ไม่แน่นอน: ต้องการ Scale up/down ตาม Load โดยอัตโนมัติ
- High Availability: ต้องการให้บริการไม่หยุด แม้ Node ตัวหนึ่งล่ม
- CI/CD Pipeline: ต้องการ Deploy บ่อยๆ โดยไม่กระทบ Production
- Multi-environment: Dev, Staging, Production บนโครงสร้างเดียวกัน
⚠️ ไม่เหมาะกับ: โปรเจกต์เล็ก หรือแอปที่รัน Container แค่ 1-3 ตัว ค่าใช้จ่ายในการดูแล (Operational Overhead) ของ Kubernetes สูงกว่า Docker Compose มาก ถ้าไม่จำเป็นจริงๆ ให้ใช้ Docker Compose เพียงพอ
จัดการ Secrets และ ConfigMap อย่างปลอดภัย
ใน Kubernetes มีวิธีจัดการข้อมูล Configuration แยกออกจาก Container Image โดยใช้ Resource 2 ประเภทหลัก ซึ่งช่วยให้ Application ปลอดภัยและ Flexible มากขึ้น
ConfigMap — สำหรับค่า Config ที่ไม่ใช่ความลับ
ใช้เก็บค่า Config เช่น URL ของ Service, Feature Flags, ชื่อ Database ที่ไม่ต้องการปกปิด:
# สร้าง ConfigMap จากไฟล์
kubectl create configmap app-config \
--from-literal=DB_HOST=mysql-service \
--from-literal=APP_ENV=production \
--from-literal=MAX_CONNECTIONS=100
# ดู ConfigMap ที่สร้าง
kubectl describe configmap app-config
Secret — สำหรับข้อมูลที่ต้องปกปิด
ใช้เก็บ Password, API Key, Token ที่ไม่ควรอยู่ใน Code โดยตรง Kubernetes เข้ารหัส Secret ด้วย Base64 (แนะนำเปิด Encryption at Rest เพิ่มเติม):
# สร้าง Secret
kubectl create secret generic db-credentials \
--from-literal=DB_PASSWORD=MyStr0ngP@ss \
--from-literal=DB_USER=appuser
# ดู Secret (ค่าจะถูก Encode)
kubectl get secret db-credentials -o yaml
ใช้งาน ConfigMap และ Secret ใน Pod
# ตัวอย่าง Deployment ที่ใช้ ConfigMap + Secret
spec:
containers:
- name: myapp
image: myapp:latest
envFrom:
- configMapRef:
name: app-config # โหลดทุก Key จาก ConfigMap
- secretRef:
name: db-credentials # โหลด Secrets เป็น Environment Variables
คำเตือนด้านความปลอดภัย: ห้าม Commit Secret Values ลงใน Git Repository โดยตรง ให้สร้าง Secret ผ่าน kubectl โดยตรงบน Cluster หรือใช้ External Secret Manager เช่น HashiCorp Vault หรือ AWS Secrets Manager ร่วมกับ Kubernetes
ทดลอง Kubernetes บน VPS ด้วย k3s
k3s คือ Kubernetes เวอร์ชันที่เบาและติดตั้งง่าย เหมาะสำหรับทดลองบน VPS RAM ต่ำ (ใช้แค่ ~512MB) พัฒนาโดย Rancher Labs และเป็น CNCF Certified Kubernetes Distribution
ความต้องการระบบ
- VPS Ubuntu 20.04 หรือ 22.04 (แนะนำ RAM ≥ 1GB)
- Root หรือ Sudo access
- Port 6443 เปิดสำหรับ Kubernetes API
ขั้นที่ 1 — ติดตั้ง k3s
รันคำสั่งเดียวเพื่อติดตั้ง k3s บน Node แรก (Control Plane):
curl -sfL https://get.k3s.io | sh -
รอสักครู่ เมื่อเสร็จแล้วตรวจสอบสถานะ:
sudo systemctl status k3s sudo kubectl get nodes
ถ้าเห็น Node ของคุณมีสถานะ Ready แสดงว่า k3s ทำงานแล้ว
ขั้นที่ 2 — Deploy แอปทดสอบ (Nginx)
สร้าง Deployment ด้วย YAML file:
# nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-demo spec: replicas: 3 # ต้องการ Pod 3 ตัวตลอดเวลา selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
sudo kubectl apply -f nginx-deployment.yaml
ตรวจสอบ Pod ที่สร้างขึ้น:
sudo kubectl get pods
คุณจะเห็น Pod 3 ตัวที่มีสถานะ Running
ขั้นที่ 3 — สร้าง Service เพื่อเข้าถึงจากภายนอก
# nginx-service.yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: NodePort selector: app: nginx ports: - port: 80 targetPort: 80 nodePort: 30080 # เข้าถึงได้ที่ http://IP_VPS:30080
sudo kubectl apply -f nginx-service.yaml
ลองเปิดบราวเซอร์ไปที่ http://IP_ของ_VPS:30080 คุณจะเห็นหน้า Nginx ซึ่งถูก Serve จาก 1 ใน 3 Pod อัตโนมัติ
ขั้นที่ 4 — ทดสอบ Self-healing
ลบ Pod ตัวหนึ่งแล้วดูว่า Kubernetes สร้างใหม่ไหม:
# ดูชื่อ Pod sudo kubectl get pods # ลบ Pod ตัวหนึ่ง (แทนชื่อ Pod จริง) sudo kubectl delete pod nginx-demo-xxxxxxx-xxxxx # ดู Pod ใหม่ที่ถูกสร้างแทน sudo kubectl get pods
ภายในไม่กี่วินาที จำนวน Pod จะกลับมาเป็น 3 ตัวโดยอัตโนมัติ — นี่คือ Self-healing ที่ Kubernetes ทำให้
kubectl คืออะไร: kubectl (อ่านว่า "คิวบ-คอนโทรล") คือ Command-line Tool สำหรับสั่งงาน Kubernetes ทุกอย่าง ตั้งแต่ Deploy, Scale, Inspect, Logs ไปจนถึง Delete Resource ทุกชนิด
Monitoring Kubernetes ด้วย Prometheus และ Grafana
การ Monitor ระบบ Kubernetes เป็นสิ่งจำเป็นสำหรับ Production Cluster ทั้ง Prometheus (สำหรับเก็บ Metrics) และ Grafana (สำหรับ Visualize) เป็น Tool ที่นิยมที่สุดในระบบนิเวศ Kubernetes
Metrics ที่ควร Monitor บน Kubernetes
- Pod CPU/Memory Usage: ใช้ดูว่า Pod ไหนกิน Resource เยอะเกิน หรือ OOMKilled
- Node Resource Utilization: CPU, RAM, Disk ของแต่ละ Node
- Pod Restart Count: Pod ที่ Restart บ่อยมักสัญญาณว่ามีปัญหา
- API Server Latency: เวลา Response ของ Kubernetes API
- Network I/O: ปริมาณ Traffic เข้า-ออกของแต่ละ Pod
ติดตั้ง kube-prometheus-stack ด้วย Helm
วิธีที่ง่ายที่สุดคือใช้ Helm Chart ที่รวม Prometheus + Grafana + AlertManager พร้อม Dashboard ที่ตั้งค่าล่วงหน้าสำหรับ Kubernetes:
# เพิ่ม Helm Repository
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# ติดตั้ง kube-prometheus-stack
helm install monitoring prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace
# ตรวจสอบ Pod ที่ติดตั้ง
kubectl get pods -n monitoring
# เข้าถึง Grafana (Port-forward)
kubectl port-forward -n monitoring \
svc/monitoring-grafana 3000:80
จากนั้นเปิด Browser ไปที่ http://localhost:3000 Login ด้วย user: admin และ Password เริ่มต้นที่ดึงได้จาก Secret:
kubectl get secret -n monitoring monitoring-grafana \
-o jsonpath="{.data.admin-password}" | base64 --decode
k3s + Prometheus: ถ้าใช้ k3s ให้เพิ่ม Flag --set kubeEtcd.enabled=false --set kubeScheduler.enabled=false --set kubeControllerManager.enabled=false เมื่อติดตั้ง kube-prometheus-stack เพราะ k3s รวม Component เหล่านี้ไว้แบบอื่น
Kubernetes Architecture สรุปย่อ
ภาพรวมของ Kubernetes Cluster ประกอบด้วย:
- kube-apiserver: ประตูหลักของ Cluster ทุก Request ผ่านที่นี่
- etcd: Database ที่เก็บ State ทั้งหมดของ Cluster
- kube-scheduler: ตัดสินใจว่า Pod ใหม่จะรันบน Node ไหน
- kube-controller-manager: ดูแลให้ Deployment มี Pod ครบตามที่กำหนด
- kubelet: Agent บน Worker Node ที่รับคำสั่งจาก Control Plane
- kube-proxy: จัดการ Network Rules บน Worker Node แต่ละตัว
Rolling Update และ Rollback อย่างปลอดภัย
หนึ่งในฟีเจอร์ที่ทรงพลังที่สุดของ Kubernetes คือการอัปเดต Application โดยไม่หยุดบริการ (Zero-downtime Deployment) และสามารถ Rollback กลับไปเวอร์ชันก่อนหน้าได้ในเวลาไม่กี่วินาที
วิธีทำ Rolling Update
เมื่อต้องการอัปเดต Image เป็นเวอร์ชันใหม่:
# อัปเดต Image ของ Deployment
kubectl set image deployment/nginx-demo \
nginx=nginx:1.25 \
--record
# ดูสถานะ Rollout แบบ Real-time
kubectl rollout status deployment/nginx-demo
# ดูประวัติ Rollout ทั้งหมด
kubectl rollout history deployment/nginx-demo
ระหว่าง Rolling Update Kubernetes จะอัปเดตทีละ Pod (ตาม Strategy ที่กำหนด) โดยรอให้ Pod ใหม่ Ready ก่อนค่อยลบ Pod เก่า ทำให้มีบริการอย่างต่อเนื่อง
Rollback เมื่อพบปัญหา
# Rollback กลับไปเวอร์ชันก่อนหน้าทันที
kubectl rollout undo deployment/nginx-demo
# Rollback ไปยัง Revision เฉพาะ (เช่น Revision 2)
kubectl rollout undo deployment/nginx-demo --to-revision=2
# ตรวจสอบว่า Rollback สำเร็จ
kubectl get pods -l app=nginx
ตั้งค่า Update Strategy
ควบคุมพฤติกรรมการอัปเดตผ่าน strategy ใน Deployment YAML:
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # Pod ที่หยุดได้พร้อมกันสูงสุด 1 ตัว
maxSurge: 1 # Pod ใหม่ที่สร้างเกินจาก Replicas ได้ 1 ตัว
แนวปฏิบัติที่ดี: ก่อน Deploy Production จริง ควรทดสอบบน Staging Cluster ก่อนเสมอ และใช้ --record Flag เพื่อบันทึก Rollout History ให้ทีมย้อนดูได้ว่าใครอัปเดตอะไรเมื่อไหร่
สรุป: ควรเริ่มต้นอย่างไร?
สำหรับผู้เริ่มต้น แนะนำเส้นทางดังนี้:
- เรียน Docker ให้ชำนาญก่อน — เข้าใจ Container, Image, Volume, Network
- ทดลอง k3s บน VPS เครื่องเดียว — ตาม Workshop ในบทความนี้
- ศึกษา YAML Manifests: Deployment, Service, ConfigMap, Secret
- ลอง Managed Kubernetes: เมื่อพร้อม Kubernetes บน Cloud (EKS, GKE, AKS) จัดการ Control Plane ให้อัตโนมัติ
VPS สำหรับ Kubernetes: k3s ต้องการ RAM ขั้นต่ำ ~512MB แต่แนะนำ 1-2GB สำหรับการทดลอง ถ้าต้องการ Multi-node Cluster ที่ใช้งานจริง ควรมี RAM อย่างน้อย 2GB ต่อ Node
VPS Full Root Access พร้อมทดลอง Kubernetes
ควบคุม Server ได้ 100% ติดตั้ง k3s, Docker และเครื่องมือ DevOps ได้ทันที VPS เริ่มต้น 500 บาท/เดือน ทำเลไทย / สิงคโปร์
ดูแพ็กเกจ VPS