การดู : 0

12/04/2026 18:16น.

EP.121 Deploy WebSocket Server บน Kubernetes ให้เสถียรและพร้อมใช้งานจริง

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 ระดับโลก 🌍