12/04/2026 18:16น.

EP.121 Deploy WebSocket Server บน Kubernetes ให้เสถียรและพร้อมใช้งานจริง
#WebSocket
#Kubernetes
#Deploy
#Production
#Go
#Golang
เมื่อ WebSocket Server ของคุณ...
- รองรับผู้ใช้งานจำนวนมาก
- ทำงานแบบ Real-time ซับซ้อน (Chat, Game, Whiteboard, IoT)
- ต้องออนไลน์เสถียร 24/7
คำถามสำคัญคือ 👉 จะ Deploy อย่างไรให้ “เสถียร ขยายได้ และพร้อมใช้งานจริงในระดับ Production”?
คำตอบคือ: Kubernetes (K8s)
บทความนี้จะพาคุณ Deploy WebSocket Server (Go) เข้าสู่ Production Environment อย่างมั่นคง ด้วยเทคนิคที่ใช้ได้จริงในระบบขนาดใหญ่
🧠 ทำไม WebSocket ต้องใช้ Kubernetes?
WebSocket แตกต่างจาก HTTP ธรรมดา เพราะ...
- ใช้ การเชื่อมต่อแบบต่อเนื่อง (Long-lived Connection)
- ต้องจัดการ Connection Lifecycle ที่ซับซ้อน
- การ Scale ยากกว่าระบบแบบ Request/Response
Kubernetes เข้ามาช่วยในเรื่อง:
- ควบคุมการทำงานของ WebSocket Server ได้เต็มรูปแบบ
- รองรับ Auto Scaling
- บริหาร Load Balancer ให้เชื่อมต่อได้แม่นยำ
- ลด Downtime เวลาเกิดการเปลี่ยนแปลงในระบบ
🏗️ ภาพรวมสถาปัตยกรรม (Architecture Overview)
Client
↓
Load Balancer (L4/L7)
↓
Kubernetes Service
↓
WebSocket Pods (Go)
↕
Redis / Message Broker
🐳 1. เตรียม WebSocket Server สำหรับ Kubernetes
ตัวอย่างโค้ด Go แบบง่าย:
http.HandleFunc("/ws", handleWebSocket)
http.ListenAndServe(":8080", nil)
✅ ข้อควรระวัง:
- อย่า Hardcode พอร์ต
- ควรทำ Graceful Shutdown ให้เรียบร้อย
📦 2. สร้าง Docker Image
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o ws-server
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/ws-server .
EXPOSE 8080
CMD ["./ws-server"]
คำสั่ง Build & Push:
docker build -t your-org/ws-server:1.0 .
docker push your-org/ws-server:1.0
☸️ 3. Deploy บน Kubernetes
✅ Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ws-server
spec:
replicas: 3
selector:
matchLabels:
app: ws
template:
metadata:
labels:
app: ws
spec:
containers:
- name: ws
image: your-org/ws-server:1.0
ports:
- containerPort: 8080
🌐 4. Load Balancer (Service)
apiVersion: v1
kind: Service
metadata:
name: ws-service
spec:
type: LoadBalancer
selector:
app: ws
ports:
- port: 80
targetPort: 8080
🔁 5. Sticky Session (สำคัญมาก!)
WebSocket ต้องการ Connection Stickiness เพื่อให้ Client กลับไปยัง Pod เดิม
ตัวอย่าง (Ingress + NGINX):
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "ws-session"
หากไม่เปิด Sticky Session:
- ❌ Client อาจเชื่อมต่อไปยัง Pod ใหม่เมื่อ Reconnect
- ❌ State หาย การ Sync ข้อมูลผิดพลาด
📈 6. Auto Scaling (HPA)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: ws-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ws-server
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
คำแนะนำ: การ Scale ด้วย CPU อย่างเดียวไม่พอ ควรใช้ Custom Metrics เช่น:
- จำนวน Active Connections
- Messages per Second
🔗 7. แชร์ State ระหว่าง Pods
หากคุณมีหลาย Pod ทำงานพร้อมกัน เช่น:
- User A อยู่ Pod 1
- User B อยู่ Pod 3
ต้องใช้ Redis Pub/Sub หรือ Message Broker เพื่อแชร์ข้อมูลระหว่างกัน
WebSocket Pod → Redis Pub/Sub → WebSocket Pod
🛑 8. Graceful Shutdown
หาก Pod ถูก Scale Down หรือ Restart:
- ห้ามตัด Connection ทันที!
แนวทางที่แนะนำ:
- ใช้
context.Contextเพื่อจัดการ Lifecycle - ส่งสัญญาณให้ Client เตรียม Reconnect
- Wait อย่างเหมาะสมก่อนปิดตัว
✅ 9. Checklist ก่อนขึ้น Production
- ✅ Sticky Session ใช้งานได้จริง
- ✅ Auto Scaling ไม่ทำให้ Connection หลุด
- ✅ Redis / Message Broker พร้อม
- ✅ Health Check แยก HTTP และ WebSocket
- ✅ ระบบ Logging และ Metrics ครบถ้วน
🚀 เริ่ม Deploy ของคุณเลย!
- เริ่มต้นที่ 2–3 Replicas
- เปิด Sticky Session
- ทดสอบ Scale Up / Down
- ตรวจสอบว่าการเชื่อมต่อยังคงอยู่ครบ
ถ้าทำครบ → WebSocket Server ของคุณพร้อมสำหรับ Production แล้ว!
🧠 Key Takeaways
- Kubernetes ช่วยบริหาร WebSocket Server ได้อย่างยืดหยุ่น
- Sticky Session สำคัญกับการรักษาสถานะของผู้ใช้
- ต้องมี Redis/Broker เพื่อแชร์สถานะข้าม Pods
- Graceful Shutdown จำเป็นสำหรับระบบ Production
- Auto Scaling ต้องใช้ Metrics ที่สอดคล้องกับ Real-time Workload
🔮 EP.122 Horizontal & Geo-distributed Scaling Strategies
ตอนถัดไปเราจะขยายระบบ WebSocket ข้าม Cluster และรองรับหลาย Region พร้อมแนวทางลด Latency ระดับโลก 🌍