Kubernetes คืออะไร เหมาะกับใคร เริ่มต้นอย่างไร

เมื่อแอปพลิเคชันของคุณโตขึ้น การรัน 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 เต็ม:

Kubernetes แก้ปัญหาทั้งหมดนี้ด้วย:

แนวคิดหลักที่ต้องรู้ (Core Concepts)

1. Cluster

Cluster คือกลุ่มของเครื่อง (Node) ที่ทำงานร่วมกันภายใต้ Kubernetes หนึ่ง Cluster ประกอบด้วย Control Plane (สมองกลาง) และ Worker Nodes (ผู้รัน Container)

2. Node

Node คือเครื่องหนึ่งเครื่องในระบบ อาจเป็น VPS หรือ Physical Server Node แต่ละตัวรัน Container ตามที่ Control Plane สั่ง มี 2 ประเภท:

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 ที่ทุกคนต้องใช้ เหมาะกับสถานการณ์เหล่านี้:

⚠️ ไม่เหมาะกับ: โปรเจกต์เล็ก หรือแอปที่รัน 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

ความต้องการระบบ

ขั้นที่ 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

ติดตั้ง 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 ประกอบด้วย:

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 ให้ทีมย้อนดูได้ว่าใครอัปเดตอะไรเมื่อไหร่

สรุป: ควรเริ่มต้นอย่างไร?

สำหรับผู้เริ่มต้น แนะนำเส้นทางดังนี้:

  1. เรียน Docker ให้ชำนาญก่อน — เข้าใจ Container, Image, Volume, Network
  2. ทดลอง k3s บน VPS เครื่องเดียว — ตาม Workshop ในบทความนี้
  3. ศึกษา YAML Manifests: Deployment, Service, ConfigMap, Secret
  4. ลอง 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