เมื่อวานนี้ผม deploy Dify บน Kubernetes สำหรับ production ไป แต่พอ scale pod ขึ้นมา 3 replicas กลับเจอปัญหา ConnectionError: timeout after 30s ที่ API gateway พอดี สาเหตุคือไม่ได้ตั้งค่า session affinity และ health check ที่ถูกต้อง วันนี้เลยจะมาแชร์วิธีแก้และ best practice สำหรับ การ deploy Dify แบบ High Availability บน Kubernetes อย่างละเอียด
Dify บน Kubernetes คืออะไร และทำไมต้อง HA?
Dify เป็นแพลตฟอร์ม LLM Application Development ที่ช่วยให้เราสร้าง AI agent ได้ง่าย การ deploy บน Kubernetes ช่วยให้ระบบรองรับ load สูง พร้อมกับ ความน่าเชื่อถือ 99.9% ผ่าน HA architecture
Architecture ภาพรวม
+-------------------+ +---------------------+
| External Users |---->| Kubernetes Cluster |
+-------------------+ | +-----------------+ |
| | Ingress/Nginx | |
| +--------+--------+ |
| | |
| +--------v--------+ |
| | Dify API Pods | | (3 replicas)
| | (Replication) | |
| +--------+--------+ |
| | |
| +--------v--------+ |
| | PostgreSQL | | (Primary-Standby)
| | Redis Cluster | | (Sentinel)
| | Weaviate/Neo4j | |
| +-----------------+ |
+---------------------+
ขั้นตอนที่ 1: เตรียม Kubernetes Cluster
สำหรับ production แนะนำใช้ cluster ที่มีอย่างน้อย 3 nodes เพื่อรองรับ HA
# ตรวจสอบ version ของ kubectl และ Kubernetes
kubectl version --client
kubectl get nodes
สร้าง namespace สำหรับ Dify
kubectl create namespace dify
kubectl config set-context --current --namespace=dify
ตรวจสอบว่ามี ingress controller แล้วหรือยัง
kubectl get pods -n ingress-nginx
ขั้นตอนที่ 2: values.yaml สำหรับ Helm Chart
# values-production.yaml
global:
imageRegistry: <your-registry>
imagePullSecrets:
- name: regcred
API Service - HA Configuration
api:
replicaCount: 3
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 2000m
memory: 4Gi
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- dify-api
topologyKey: kubernetes.io/hostname
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
failureThreshold: 3
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 3
env:
# Database Configuration
DB_HOST: "postgresql.dify.svc.cluster.local"
DB_PORT: "5432"
DB_DATABASE: "dify"
DB_USERNAME: "dify"
DB_PASSWORD: "${DB_PASSWORD}"
# Redis Configuration
REDIS_HOST: "redis-master.dify.svc.cluster.local"
REDIS_PORT: "6379"
REDIS_PASSWORD: "${REDIS_PASSWORD}"
# Secret Key
SECRET_KEY: "${SECRET_KEY}"
Worker Service
worker:
replicaCount: 3
resources:
requests:
cpu: 300m
memory: 512Mi
limits:
cpu: 1000m
memory: 2Gi
Web App Service
web:
replicaCount: 2
service:
type: ClusterIP
Ingress Configuration
ingress:
enabled: true
className: "nginx"
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
nginx.ingress.kubernetes.io/proxy-send-timeout: "300"
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
nginx.ingress.kubernetes.io/session-cookie-expires: "14400"
nginx.ingress.kubernetes.io/session-cookie-max-age: "14400"
hosts:
- host: dify.yourdomain.com
paths:
- path: /
pathType: Prefix
service: web
- path: /api
pathType: Prefix
service: api
- path: /console
pathType: Prefix
service: web
tls:
- secretName: dify-tls
hosts:
- dify.yourdomain.com
ขั้นตอนที่ 3: Deploy ด้วย Helm
# เพิ่ม Helm repository
helm repo add dify https://difyai.github.io/dify-helm
helm repo update
สร้าง secret สำหรับ database password
kubectl create secret generic dify-secrets \
--from-literal=DB_PASSWORD="$(openssl rand -base64 32)" \
--from-literal=REDIS_PASSWORD="$(openssl rand -base64 32)" \
--from-literal=SECRET_KEY="$(openssl rand -base64 64)" \
-n dify
ติดตั้ง Dify ด้วย production values
helm install dify dify/dify \
-f values-production.yaml \
--set-file global.existingSecret=dify-secrets \
-n dify \
--create-namespace
ตรวจสอบสถานะ deployment
kubectl get pods -n dify -w
ตรวจสอบ logs ของ API pods
kubectl logs -f deployment/dify-api -n dify
ขั้นตอนที่ 4: ตั้งค่า Horizontal Pod Autoscaler (HPA)
# สร้าง HPA สำหรับ API
kubectl autoscale deployment dify-api \
--cpu-percent=70 \
--min=3 \
--max=10 \
-n dify
สร้าง HPA สำหรับ Worker
kubectl autoscale deployment dify-worker \
--cpu-percent=70 \
--min=2 \
--max=8 \
-n dify
ตรวจสอบ HPA status
kubectl get hpa -n dify
kubectl describe hpa dify-api -n dify
ขั้นตอนที่ 5: ตั้งค่า Persistent Storage สำหรับ Database
# storage-class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: dify-storage
provisioner: pd.csi.storage.gke.io
parameters:
type: pd-ssd
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
---
pvc-postgresql.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dify-postgresql
namespace: dify
spec:
accessModes:
- ReadWriteOnce
storageClassName: dify-storage
resources:
requests:
storage: 100Gi
---
pvc-redis.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dify-redis
namespace: dify
spec:
accessModes:
- ReadWriteOnce
storageClassName: dify-storage
resources:
requests:
storage: 20Gi
การเชื่อมต่อ Dify กับ HolySheep AI
หลังจาก deploy Dify เรียบร้อยแล้ว ต่อไปจะเป็นการตั้งค่า LLM provider ซึ่ง สมัครที่นี่ เพื่อรับ API key ของ HolySheep AI กันครับ
# สร้าง API key secret
kubectl create secret generic holysheep-api-key \
--from-literal=HOLYSHEEP_API_KEY="YOUR_HOLYSHEEP_API_KEY" \
-n dify
เพิ่ม environment variable ใน API deployment
ใน values.yaml ส่วน api.env
api:
env:
HOLYSHEEP_API_KEY: "${HOLYSHEEP_API_KEY}"
# หรือสามารถตั้งค่าผ่าน Dify UI ได้โดยตรง
# ไปที่ Settings > Model Providers > HolySheep AI
# Base URL สำหรับ Dify
HOLYSHEEP_BASE_URL: "https://api.holysheep.ai/v1"
Upgrade deployment
helm upgrade dify dify/dify \
-f values-production.yaml \
-n dify
การใช้งาน HolySheep AI กับ Dify Agent
# ตัวอย่างการใช้งานผ่าน Python client
import requests
กำหนดค่า API endpoint และ key
HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY"
HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"
ตัวอย่างการเรียกใช้ GPT-4o model ผ่าน HolySheep
headers = {
"Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": "gpt-4o",
"messages": [
{"role": "user", "content": "สอนวิธี deploy Dify บน Kubernetes"}
],
"temperature": 0.7,
"max_tokens": 2000
}
response = requests.post(
f"{HOLYSHEEP_BASE_URL}/chat/completions",
headers=headers,
json=payload
)
if response.status_code == 200:
result = response.json()
print("Response:", result['choices'][0]['message']['content'])
else:
print(f"Error: {response.status_code}")
print(response.text)
การตรวจสอบและ Monitoring
# ติดตั้ง Prometheus และ Grafana สำหรับ monitoring
helm install prometheus prometheus-community/kube-prometheus-stack \
-n monitoring --create-namespace
ดู metrics ของ Dify pods
kubectl port-forward -n dify svc/dify-api 8080:8080 &
curl http://localhost:8080/metrics
ตรวจสอบ logs ทั้งหมด
kubectl logs -f -l app=dify-api -n dify --tail=100
ตรวจสอบ resource usage
kubectl top pods -n dify
kubectl top nodes
ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข
1. ConnectionError: timeout after 30s ที่ API Gateway
สาเหตุ: ไม่ได้ตั้งค่า session affinity และ readiness probe ทำให้ request ถูกส่งไปยัง pod ที่ยังไม่พร้อมใช้งาน
# วิธีแก้ไข: เพิ่ม session affinity ใน ingress annotation
แก้ไขใน values.yaml
ingress:
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "dify-route"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"
และเพิ่ม readiness probe ที่ถูกต้อง
api:
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 3
Apply การเปลี่ยนแปลง
helm upgrade dify dify/dify -f values-production.yaml -n dify
2. Pod CrashLoopBackOff - OOMKilled
สาเหตุ: Memory limit ตั้งไว้ต่ำเกินไปสำหรับ Dify API ที่ต้องโหลด model
# วิธีแก้ไข: เพิ่ม memory limit และตั้งค่า JVM heap
api:
resources:
requests:
cpu: 500m
memory: 2Gi
limits:
cpu: 2000m
memory: 8Gi # เพิ่มจาก 4Gi เป็น 8Gi
env:
WORKER_TIMEOUT: "600"
EXPIRED_TIME: "3600"
หากใช้ Python worker
worker:
resources:
requests:
cpu: 500m
memory: 2Gi
limits:
cpu: 2000m
memory: 6Gi
ลบ pod เดิมแล้ว deploy ใหม่
kubectl delete pod -l app=dify-api -n dify
kubectl delete pod -l app=dify-worker -n dify
3. 401 Unauthorized เมื่อเรียก LLM API
สาเหตุ: API key ไม่ถูกต้องหรือ environment variable ไม่ถูก pass เข้า container
# วิธีแก้ไข: ตรวจสอบ secret และ env variable
1. ตรวจสอบว่า secret มีอยู่จริง
kubectl get secret dify-secrets -n dify
2. ตรวจสอบ env ใน pod
kubectl exec -it deploy/dify-api -n dify -- env | grep HOLYSHEEP
3. ถ้าไม่มี ให้เพิ่ม env reference ใน values.yaml
api:
existingSecret: "dify-secrets"
env:
- name: HOLYSHEEP_API_KEY
valueFrom:
secretKeyRef:
name: dify-secrets
key: HOLYSHEEP_API_KEY
- name: HOLYSHEEP_BASE_URL
value: "https://api.holysheep.ai/v1"
4. หากใช้ Dify UI ให้ตรวจสอบว่า base URL ถูกต้อง
Settings > Model Providers > HolySheep AI
Base URL: https://api.holysheep.ai/v1
API Key: YOUR_HOLYSHEEP_API_KEY
helm upgrade dify dify/dify -f values-production.yaml -n dify
4. HPA ไม่ทำงาน - pods ไม่ scale up
สาเหตุ: Metrics server ไม่ได้ติดตั้ง หรือ HPA ไม่สามารถอ่าน metrics ได้
# วิธีแก้ไข: ติดตั้ง metrics-server
helm install metrics-server metrics-server/metrics-server \
-n kube-system
หรือติดตั้งผ่าน kubectl
kubectl apply -f - <ตรวจสอบ HPA อีกครั้ง
kubectl get hpa -n dify -w
สรุป
การ deploy Dify บน Kubernetes แบบ High Availability ต้องใส่ใจเรื่อง:
- Pod Anti-Affinity - กระจาย pods ไปยัง nodes ต่างกัน
- Session Affinity - ใช้ cookie-based affinity ที่ ingress
- Health Check - ตั้งค่า liveness และ readiness probe ที่เหมาะสม
- Resource Limits - กำหนด memory และ CPU ที่เพียงพอ
- HPA - ตั้ง autoscaling ตาม CPU หรือ custom metrics
- Monitoring - ติดตาม logs และ metrics อย่างต่อเนื่อง
สำหรับ LLM provider นั้น HolySheep AI เป็นทางเลือกที่น่าสนใจมาก เพราะอัตราแลกเปลี่ยน ¥1=$1 ทำให้ประหยัดได้ถึง 85%+ เมื่อเทียบกับ OpenAI โดยตรง ราคาเริ่มต้นที่ $0.42/MTok สำหรับ DeepSeek V3.2 และ latency ต่ำกว่า 50ms รองรับงาน production ได้อย่างสบาย
👉 สมัคร HolySheep AI — รับเครดิตฟรีเมื่อลงทะเบียน