Cấu hình Resource Request và Limit cho Pod
Trước khi áp dụng Auto-scaling, Kubernetes cần biết mức tiêu thụ tài nguyên dự kiến của mỗi Pod để tính toán việc phân bổ và mở rộng.
Chúng ta cần xác định giá trị requests (tài nguyên tối thiểu cần thiết để Pod chạy) và limits (tài nguyên tối đa Pod được phép sử dụng). Nếu vượt quá limit, Pod sẽ bị OOMKilled (Out of Memory) hoặc bị throttling CPU.
Đối với ứng dụng AI thực thi trên WebAssembly, CPU là tài nguyên quan trọng nhất. Hãy chỉnh sửa file deployment manifest.
Đường dẫn file: deployments/ai-inference-deployment.yaml
Nội dung hoàn chỉnh:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-inference-wasm
labels:
app: ai-inference-wasm
spec:
replicas: 2
selector:
matchLabels:
app: ai-inference-wasm
template:
metadata:
labels:
app: ai-inference-wasm
spec:
containers:
- name: inference-engine
image: your-registry/ai-inference-wasm:latest
ports:
- containerPort: 8080
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
Kết quả mong đợi: Khi áp dụng file này, Kubernetes sẽ đảm bảo mỗi Pod nhận được ít nhất 200m CPU và 256Mi RAM. Nếu Pod cố dùng quá 500m CPU, nó sẽ bị giới hạn tốc độ.
Verify kết quả bằng lệnh:
kubectl get pods -l app=ai-inference-wasm -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].resources.requests.cpu}{"\t"}{.spec.containers[0].resources.limits.cpu}{"\n"}{end}'
Các Pod sẽ hiển thị đúng giá trị 200m và 500m tương ứng.
Cấu hình HPA (Horizontal Pod Autoscaler) dựa trên CPU và Memory
HPA là cơ chế chuẩn của Kubernetes để tự động tăng giảm số lượng Pod dựa trên mức sử dụng tài nguyên.
Chúng ta sẽ tạo một HPA target vào Deployment đã cấu hình ở bước trên. HPA sẽ mở rộng khi CPU sử dụng trung bình vượt quá 70% và thu nhỏ khi dưới 30%.
Đường dẫn file: autoscaling/hpa-cpu.yaml
Nội dung hoàn chỉnh:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: ai-inference-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ai-inference-wasm
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
Kết quả mong đợi: HPA sẽ duy trì tối thiểu 2 Pod và tối đa 10 Pod. Khi CPU trung bình của tất cả Pod vượt 70%, HPA sẽ tạo thêm Pod mới.
Apply cấu hình và verify:
kubectl apply -f autoscaling/hpa-cpu.yaml
kubectl get hpa ai-inference-hpa
Bảng kết quả sẽ hiển thị REPLICAS hiện tại là 2, và RESOURCES sẽ báo 0% hoặc Unknown ngay sau khi tạo (cần 30 giây để Metric Server thu thập dữ liệu).
Sử dụng Custom Metrics để scale dựa trên số lượng kết nối WebSocket
Trong ứng dụng Real-time AI, CPU có thể chưa cao nhưng số lượng kết nối WebSocket đồng thời đã quá tải. HPA dựa trên CPU chưa đủ. Chúng ta cần sử dụng Custom Metrics.
Để làm điều này, chúng ta cần triển khai Metrics Server và Prometheus Adapter nếu chưa có. Ở đây giả định môi trường đã có Prometheus Adapter.
Chúng ta sẽ tạo file HPA mới sử dụng metric http_requests_per_second hoặc metric đếm số lượng kết nối WebSocket. Giả sử ứng dụng của bạn đã expose metric wasm_active_connections vào Prometheus.
Đường dẫn file: autoscaling/hpa-custom-websocket.yaml
Nội dung hoàn chỉnh:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: ai-inference-hpa-custom
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ai-inference-wasm
minReplicas: 2
maxReplicas: 15
metrics:
- type: Pods
pods:
metric:
name: wasm_active_connections
target:
type: AverageValue
averageValue: "50"
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
Cấu hình này yêu cầu mỗi Pod trung bình chỉ xử lý tối đa 50 kết nối WebSocket. Nếu tổng số kết nối chia cho số Pod lớn hơn 50, HPA sẽ mở rộng.
Để HPA nhận metric này, đảm bảo Prometheus Adapter đã được cấu hình trong cluster để map metric wasm_active_connections sang Kubernetes API.
Apply và verify:
kubectl apply -f autoscaling/hpa-custom-websocket.yaml
kubectl get hpa ai-inference-hpa-custom
Kết quả: Nếu Prometheus Adapter chưa cấu hình đúng, cột CONDITIONS hoặc RESOURCES sẽ báo lỗi Unknown hoặc False với thông báo "metric not found". Nếu cấu hình đúng, nó sẽ hiển thị giá trị hiện tại (ví dụ: 5/50).
Mô phỏng tải cao để kiểm tra khả năng tự mở rộng
Bây giờ chúng ta sẽ tạo tải giả (load test) để kích hoạt cơ chế tự mở rộng. Chúng ta sẽ sử dụng k6 hoặc hey để gửi request liên tục.
Mục tiêu: Tăng CPU usage lên trên 70% hoặc tăng số lượng kết nối WebSocket vượt ngưỡng để HPA tự động tăng số lượng Pod.
Sử dụng script bash đơn giản để tạo tải CPU và kết nối WebSocket giả lập.
Tạo file script test: scripts/load-test.sh
Nội dung hoàn chỉnh:
#!/bin/bash
# Biến môi trường
POD_NAME=$(kubectl get pods -l app=ai-inference-wasm -o jsonpath='{.items[0].metadata.name}')
SERVICE_URL="http://ai-inference-wasm-service:8080"
echo "Starting load test on $SERVICE_URL..."
# 1. Test CPU load: Gửi request inference liên tục
# Giả sử endpoint /infer xử lý nặng
for i in {1..1000}; do
curl -s -o /dev/null "$SERVICE_URL/infer" &
sleep 0.1
done
# 2. Test WebSocket load (nếu có script hỗ trợ)
# Giả sử chúng ta giữ 100 kết nối WebSocket đồng thời
# Bạn cần thay thế bằng công cụ thực tế như websocat hoặc script Python
# websocat "ws://$SERVICE_URL/ws" &
# ... lặp lại 100 lần
echo "Load test completed. Monitoring HPA..."
# Theo dõi HPA mỗi 5 giây trong 120 giây
for i in {1..24}; do
kubectl get hpa ai-inference-hpa
sleep 5
done
Chạy script này từ một Pod khác hoặc từ máy client có quyền truy cập vào service nội bộ.
Chạy lệnh:
chmod +x scripts/load-test.sh
./scripts/load-test.sh
Kết quả mong đợi:
- Sau khoảng 30-60 giây đầu, bạn sẽ thấy cột CPU trong HPA tăng dần (ví dụ: 45%, 60%, 75%).
- Ngay khi vượt 70%, HPA sẽ tăng REPLICAS từ 2 lên 3.
- Khi có thêm Pod mới, CPU usage trung bình sẽ giảm xuống (do chia đều tải), và quá trình lặp lại nếu tải vẫn cao.
- Sau khi load test dừng, CPU giảm xuống dưới 30% (ngưỡng scale down), HPA sẽ giảm số lượng Pod về 2 sau 5 phút (mặc định
behavior.scaleDown.stabilizationWindowSeconds).
Verify quá trình mở rộng:
kubectl get pods -l app=ai-inference-wasm -w
Bạn sẽ thấy dòng log mới xuất hiện: Creating -> Pending -> Running cho các Pod mới.
kubectl describe hpa ai-inference-hpa
Phần Events sẽ ghi lại lịch sử: metric current value is 75%, target is 70% và increasing desired size from 2 to 3.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Real-time AI với WebAssembly, TensorFlow Lite và Kubernetes
« Phần 7: Triển khai ứng dụng lên Kubernetes Cluster
Phần 9: Tối ưu hiệu năng và giám sát hệ thống »