Cấu hình Metrics Server để thu thập dữ liệu CPU/RAM
Tại sao cần Metrics Server
Horizontal Pod Autoscaler (HPA) cần nguồn dữ liệu thời gian thực về tài nguyên (CPU/RAM) của các Pod để ra quyết định mở rộng. Kubernetes mặc định không cung cấp metric này nếu chưa cài Metrics Server.
HPA sẽ không hoạt động (lỗi "failed to get metrics") nếu thiếu thành phần này.
Triển khai Metrics Server
Tải manifest chính thức từ kho chứa của Kubernetes và áp dụng vào cluster.
Điều này sẽ tạo ra các custom resource definitions và deployment cần thiết cho việc thu thập metric.
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Đợi khoảng 2-3 phút để Pod của metrics-server khởi động và sẵn sàng.
Verify bằng cách kiểm tra trạng thái của Pod trong namespace kube-system.
kubectl get pods -n kube-system | grep metrics-server
Kết quả mong đợi: Trạng thái phải là Running và có 1 replica.
Điều chỉnh cấu hình Metrics Server (Quan trọng cho Docker Desktop/Minikube)
Trên các môi trường local như Docker Desktop hoặc Minikube, Metrics Server thường gặp lỗi kết nối do cơ chế bảo mật TLS hoặc timeout.
Cần patch cấu hình để bỏ qua lỗi chứng chỉ tự ký (self-signed certificate) và tăng thời gian chờ.
kubectl patch deploy metrics-server -n kube-system --type="json" -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--kubelet-insecure-tls"}]'
kubectl patch deploy metrics-server -n kube-system --type="json" -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--kubelet-preferred-address-types=InternalIP"}]'
Khởi động lại Pod metrics-server để áp dụng cấu hình mới.
kubectl rollout restart deployment metrics-server -n kube-system
Verify bằng cách yêu cầu metric CPU của toàn bộ cluster.
kubectl top nodes
Kết quả mong đợi: Hiển thị danh sách node với cột CPU(cores) và MEMORY(bytes) có giá trị thực tế, không bị lỗi.
Viết manifest HPA để tự động mở rộng số lượng Pod
Hiểu về Threshold và Scaling Window
HPA hoạt động dựa trên công thức: Target Pods = Current Pods * (Current Utilization / Target Utilization).
Chúng ta sẽ cấu hình để khi CPU trung bình vượt quá 70%, HPA sẽ tạo thêm Pod. Ngược lại, khi xuống dưới 50%, HPA sẽ giảm Pod (scale down).
Tạo file manifest HPA
Tạo file mới có tên ai-agent-hpa.yaml với nội dung chi tiết dưới đây.
File này trỏ đến Deployment đã tạo ở Phần 5 (giả định tên deployment là ai-agent-deployment).
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: ai-agent-hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ai-agent-deployment
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
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 100
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 15
- type: Pods
value: 4
periodSeconds: 15
selectPolicy: Max
Giải thích cấu hình: minReplicas: 2 đảm bảo luôn có ít nhất 2 instance để chịu tải và tránh single point of failure. behavior.scaleUp được cấu hình nhanh hơn scaleDown để phản ứng tức thì với lượng request tăng đột biến.
Áp dụng và Verify HPA
Áp dụng file manifest vừa tạo vào cluster.
kubectl apply -f ai-agent-hpa.yaml
Kiểm tra trạng thái của HPA ngay lập tức.
kubectl get hpa ai-agent-hpa
Kết quả mong đợi: Cột REPLICAS hiện số lượng Pod hiện tại, cột RESOURCE hiển thị CPU (70%) và Memory (80%) với giá trị hiện tại là 0% hoặc thấp (vì chưa có load).
Xử lý vấn đề 'cold start' khi mở rộng Pod cho ứng dụng AI
Bản chất của Cold Start trong AI Agent
Ứng dụng AI Agent (LangGraph/CrewAI) thường nặng: cần tải model LLM, khởi tạo vector store, hoặc load các thư viện Python phức tạp (PyTorch, LangChain).
Khi HPA scale-up, Pod mới mất 30-60 giây để khởi động (cold start). Trong thời gian này, Kubernetes có thể route traffic vào Pod chưa sẵn sàng, gây lỗi 503 hoặc timeout.
Chiến lược: Khởi động sẵn (Warm-up) và Readiness Probe
Cần điều chỉnh Deployment của AI Agent để HPA chỉ scale-up khi Pod đã thực sự sẵn sàng nhận request (Readiness Probe).
Tiếp theo, áp dụng chiến lược "Pre-warming" bằng cách duy trì minReplicas cao hơn mức cần thiết cho workload tĩnh, hoặc sử dụng Pod Disruption Budget (PDB) để đảm bảo tính sẵn sàng.
Tuy nhiên, cách hiệu quả nhất cho HPA là cấu hình Readiness Probe thông minh trong Deployment manifest.
Chỉnh sửa Deployment với Readiness Probe
Sửa file manifest Deployment (ai-agent-deployment.yaml) của bạn để thêm readinessProbe kiểm tra endpoint health của ứng dụng AI.
spec:
template:
spec:
containers:
- name: ai-agent
image: your-ai-agent-image:latest
readinessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 6
Giải thích: initialDelaySeconds: 30 cho phép Pod có thời gian khởi động môi trường Python và load model trước khi Kubernetes bắt đầu kiểm tra. failureThreshold: 6 (6 lần * 10s = 60s) đảm bảo nếu khởi động chậm hơn 1 phút, Pod sẽ bị kill và tạo lại thay vì giữ nguyên ở trạng thái lỗi.
Áp dụng lại Deployment sau khi chỉnh sửa.
kubectl apply -f ai-agent-deployment.yaml
Verify bằng cách xem logs của Pod mới khởi động để đảm bảo nó đi qua giai đoạn Initializing trước khi Running.
kubectl describe pod -l app=ai-agent
Kết quả mong đợi: Trong phần Events, bạn thấy Pod chuyển trạng thái từ ContainerCreating sang Running và sau đó mới xuất hiện Ready.
Mô phỏng tải cao để quan sát cơ chế tự động mở rộng
Chuẩn bị công cụ tạo tải (Load Generator)
Sử dụng Autok3s hoặc hey (mặc định) để tạo request HTTP liên tục vào Service của AI Agent.
Mục tiêu là đẩy mức sử dụng CPU trung bình của các Pod lên trên ngưỡng 70% đã cấu hình trong HPA.
Thực hiện Stress Test
Đầu tiên, tìm địa chỉ IP của Service AI Agent hoặc dùng kubectl port-forward để truy cập từ local machine.
export POD_IP=$(kubectl get pods -l app=ai-agent -o jsonpath='{.items[0].status.podIP}')
export POD_PORT=8000
# Tạo một pod mới để chạy load test (sử dụng alpine với curl)
kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while true; do wget -q -O- http://${POD_IP}:${POD_PORT}/process-task; sleep 1; done"
Hoặc nếu bạn có tool hey trên local machine, chạy command sau để tạo tải mạnh hơn:
hey -z 2m -c 50 http://localhost:8000/process-task
Chạy lệnh này trên 2-3 terminal song song để tạo lượng request đủ lớn làm tăng CPU.
Quan sát quá trình Scale Up
Mở một terminal mới để theo dõi HPA theo thời gian thực.
watch -n 2 'kubectl get hpa ai-agent-hpa; kubectl get pods -l app=ai-agent'
Quan sát sự thay đổi của số lượng Pod khi CPU usage tăng.
Kết quả mong đợi: Sau khoảng 30-60 giây, khi CPU trung bình vượt 70%, bạn thấy cột REPLICAS trong HPA tăng từ 2 lên 3, 4... và số lượng Pod Running tăng tương ứng.
Quan sát quá trình Scale Down
Dừng load generator (nhấn Ctrl+C).
Tiếp tục quan sát terminal đang chạy watch.
Kết quả mong đợi: Khi CPU usage giảm xuống dưới 50% (ngưỡng mặc định scale down thường là 70% * 0.8 = 56%, hoặc tùy cấu hình), HPA sẽ giảm số lượng Pod sau stabilizationWindowSeconds: 300 (5 phút) để tránh dao động liên tục (thrashing).
Để kiểm tra nhanh hơn, có thể chỉnh stabilizationWindowSeconds trong file HPA về 60s và apply lại.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng AI Agent tự động hóa với LangGraph, CrewAI và Kubernetes
« Phần 5: Triển khai Agent lên Kubernetes với Deployment và Service
Phần 7: Tích hợp Memory và Lưu trữ trạng thái bền vững »