บทนำ
ถ้าคุณกำลังมองหาวิธี deploy application ขนาดใหญ่ที่ต้อง scale ได้แบบไม่มีสะดุด Kubernetes คือคำตอบที่ดีที่สุดในปี 2026 นี้ ผมเองใช้ Kubernetes มาตั้งแต่ version 1.8 สมัยที่ยังต้อง configure อะไรเยอะมาก จนถึงวันนี้ version 1.29+ ที่ทุกอย่างง่ายขึ้นเยอะ
สำหรับบทความนี้ ผมจะพาคุณ setup Kubernetes Cluster แบบ production-grade ตั้งแต่ศูนย์ ไม่ใช่แค่ demo หรือ lab environment แต่เป็นระบบที่รองรับ traffic จริง มี high availability และ security ครบถ้วน
สิ่งที่ต้องเตรียม (Prerequisites)
ก่อนจะเริ่ม setup cluster คุณต้องเตรียม:
Hardware Requirements
| Component | Master Node | Worker Node |
|---|---|---|
| CPU | 4 cores+ | 2 cores+ |
| RAM | 8 GB+ | 4 GB+ |
| Disk | 100 GB SSD | 50 GB SSD |
| Network | 1 Gbps | 1 Gbps |
Software Requirements
- OS: Ubuntu 22.04 LTS หรือ 24.04 LTS (แนะนำ)
- Container Runtime: containerd 1.7+
- Kubernetes: v1.29+ (ล่าสุดคือ v1.31)
- Network Plugin: Calico หรือ Cilium
ขั้นตอนที่ 1: เตรียม Node ทุกเครื่อง
Disable Swap
Kubernetes ต้องการให้ปิด swap ทุก node:
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
ติดตั้ง Container Runtime (containerd)
# ติดตั้ง dependencies
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
# ติดตั้ง containerd
sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
สิ่งสำคัญคือต้อง enable SystemdCgroup:
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
sudo systemctl restart containerd
ติดตั้ง kubeadm, kubelet, kubectl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
ขั้นตอนที่ 2: Initialize Master Node
นี่คือหัวใจสำคัญของการ setup cluster:
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--control-plane-endpoint="k8s-master.example.com:6443" \
--upload-certs
หลัง init เสร็จ ให้ copy kubeconfig:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
ขั้นตอนที่ 3: ติดตั้ง Network Plugin
ผมแนะนำ Calico สำหรับ production เพราะรองรับ Network Policy ได้ดี:
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
หรือถ้าต้องการ eBPF-based networking ใช้ Cilium:
cilium install --version 1.15
ตรวจสอบ status:
kubectl get pods -n kube-system
# ต้องเห็น calico-node หรือ cilium-agent Running ทุก node
ขั้นตอนที่ 4: Join Worker Nodes
ใน master node จะได้ join command มา ให้ run บน worker ทุกเครื่อง:
sudo kubeadm join k8s-master.example.com:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
ตรวจสอบ nodes:
kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# master-01 Ready control-plane 10m v1.31.0
# worker-01 Ready <none> 2m v1.31.0
# worker-02 Ready <none> 1m v1.31.0
ขั้นตอนที่ 5: Storage Configuration
สำหรับ production ต้องมี persistent storage:
Local Path Provisioner (สำหรับเริ่มต้น)
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.26/deploy/local-path-storage.yaml
NFS StorageClass (สำหรับ shared storage)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
provisioner: nfs.csi.k8s.io
parameters:
server: nfs-server.example.com
share: /exports/k8s
reclaimPolicy: Retain
volumeBindingMode: Immediate
ขั้นตอนที่ 6: Monitoring Stack
ระบบ production ต้องมี monitoring เสมอ ผมใช้ kube-prometheus-stack:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install monitoring prometheus-community/kube-prometheus-stack \
--namespace monitoring --create-namespace \
--set grafana.adminPassword="your-secure-password"
Dashboard ที่ต้องมี:
- Cluster Overview — ดู resource utilization ทั้ง cluster
- Node Exporter — ดู health ของแต่ละ node
- Pod Resources — ดู CPU/Memory ของแต่ละ pod
ขั้นตอนที่ 7: Security Hardening
RBAC Configuration
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: developer-role
rules:
- apiGroups: ["", "apps"]
resources: ["pods", "deployments", "services"]
verbs: ["get", "list", "watch", "create", "update"]
Network Policy
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
spec:
podSelector: {}
policyTypes:
- Ingress
Pod Security Standards
ตั้งแต่ Kubernetes 1.25+ ใช้ Pod Security Admission แทน PSP:
kubectl label namespace production pod-security.kubernetes.io/enforce=restricted
ขั้นตอนที่ 8: Ingress Controller
ใช้ NGINX Ingress Controller สำหรับ traffic routing:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespace
ตัวอย่าง Ingress Resource:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- app.example.com
secretName: app-tls
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
Best Practices สำหรับ Production
- ใช้ Resource Limits เสมอ — กำหนด requests และ limits ให้ทุก container
- Enable Pod Disruption Budgets — ป้องกันไม่ให้ pod ถูก evict พร้อมกันหมด
- ใช้ Rolling Updates — ตั้ง maxSurge และ maxUnavailable ให้เหมาะสม
- Backup etcd สม่ำเสมอ — etcd คือหัวใจของ cluster data
- ใช้ GitOps — ArgoCD หรือ Flux สำหรับ deployment management
คำถามที่พบบ่อย (FAQ)
Kubernetes Cluster ต้องใช้กี่ node ขั้นต่ำ?
สำหรับ production แนะนำ 3 master nodes (high availability) และ 2+ worker nodes ขึ้นไป รวมขั้นต่ำ 5 nodes แต่ถ้างบจำกัด ใช้ 1 master + 2 workers ก็พอเริ่มต้นได้
Kubernetes กับ Docker Swarm ต่างกันยังไง?
Kubernetes มี feature ครบกว่ามาก: auto-scaling, rolling updates, service mesh, RBAC และ ecosystem ใหญ่กว่า Docker Swarm ง่ายกว่าแต่ไม่เหมาะกับ workload ขนาดใหญ่
ใช้ Kubernetes บน Cloud หรือ On-Premise ดีกว่า?
ถ้าทีมเล็กแนะนำ managed Kubernetes บน Cloud (EKS, GKE, AKS) ประหยัดเวลา maintain ถ้าต้องการ control เต็มที่หรือมี compliance requirements ใช้ on-premise
Kubernetes เรียนรู้ยากไหม?
มี learning curve สูงพอสมควร แนะนำเริ่มจาก Docker ก่อน แล้วค่อยขยับมา Kubernetes ใช้เวลาประมาณ 2-3 เดือนถึงจะใช้งานได้คล่อง
ต้อง upgrade Kubernetes บ่อยแค่ไหน?
Kubernetes release ใหม่ทุก 4 เดือน แต่ละ version support 1 ปี แนะนำ upgrade ทุก 6-8 เดือน อย่าปล่อยให้ version เก่าเกิน 2 minor versions
สรุป
การ setup Kubernetes Cluster สำหรับ production ไม่ใช่เรื่องยากถ้ามีขั้นตอนที่ชัดเจน ตั้งแต่เตรียม node, initialize cluster, ติดตั้ง networking, storage, monitoring จนถึง security hardening ทุกขั้นตอนสำคัญหมด
สิ่งสำคัญที่สุดคือ อย่ารีบ ทำทีละ step test ให้แน่ใจก่อนไปขั้นตอนถัดไป production cluster ที่ดีต้องผ่านการ test อย่างถี่ถ้วน
ถ้ามีคำถามเพิ่มเติม สามารถติดตามบทความเกี่ยวกับ DevOps และ Server ได้ที่ SiamCafe Blog ครับ
"Infrastructure as code is not just a practice, it's a mindset." — Kelsey Hightower