1. Xử lý lỗi OOMKilled và Tối ưu Bộ nhớ cho Mô hình Lớn
Khi triển khai các Agent sử dụng mô hình ngôn ngữ lớn (LLM) hoặc tải nhiều context vào RAM, Pod thường bị Kubernetes giết (OOMKilled) khi vượt quá giới hạn bộ nhớ đã đặt.
Bước 1: Kiểm tra nguyên nhân OOMKilled trong logs của Pod.
Thực hiện lệnh sau để xem trạng thái và lý do Pod bị restart.
kubectl get pods -n ai-platform -o wide
Kết quả: Nếu thấy trạng thái "OOMKilled" hoặc "CrashLoopBackOff", hãy kiểm tra chi tiết hơn bằng lệnh describe.
kubectl describe pod -n ai-platform | grep -A 5 "Last State"
Kết quả mong đợi: Xuất hiện dòng "Reason: OOMKilled" xác nhận Pod bị thiếu RAM.
Bước 2: Điều chỉnh Resource Limits trong Deployment để tránh bị kill đột ngột và sử dụng Request để đảm bảo tài nguyên.
Sửa file deployment.yaml (giả sử đường dẫn: /app/manifests/agent-deployment.yaml). Tăng giá trị limits.memory và thêm request.memory để Kubernetes scheduler phân bổ đúng nút có đủ RAM.
cat > /app/manifests/agent-deployment.yaml
Kết quả mong đợi: File được lưu, cấu hình giới hạn bộ nhớ đã được thiết lập rõ ràng (Request 4Gi, Limit 8Gi).
Bước 3: Áp dụng cấu hình mới và bật tính năng Eviction để Kubernetes tự động di chuyển Pod khi nút đầy bộ nhớ thay vì giết Pod ngay lập tức.
kubectl apply -f /app/manifests/agent-deployment.yaml -n ai-platform
Kết quả mong đợi: Pod mới được tạo với resource limits mới, trạng thái chuyển sang Running.
Bước 4: Tối ưu code Python trong ứng dụng để giảm peak memory usage.
Sửa file main.py trong ứng dụng (giả sử /app/src/main.py) để sử dụng kỹ thuật streaming và hạn chế giữ toàn bộ context trong biến toàn cục.
cat > /app/src/main.py
Kết quả mong đợi: Code được cập nhật, giảm thiểu peak RAM khi xử lý các prompt dài.
Bước 5: Verify kết quả bằng cách giả lập tải cao và kiểm tra lại trạng thái OOM.
for i in {1..50}; do curl http://ai-agent-svc.ai-platform.svc.cluster.local:8000/process -d '{"input": "Generate a long story..."}' & done; sleep 30; kubectl get pods -n ai-platform | grep -v Running
Kết quả mong đợi: Không có Pod nào trong trạng thái OOMKilled hoặc CrashLoopBackOff sau khi chạy 50 request song song.
2. Chiến lược Cân bằng tải (Load Balancing) cho các Loại Agent khác nhau
Hệ thống Agent thường bao gồm nhiều loại: Agent tính toán nặng (Heavy), Agent phản hồi nhanh (Light), và Agent cần dữ liệu đặc thù. Load Balancer mặc định (Round Robin) của Kubernetes Service có thể gây nghẽn cổ chai.
Bước 1: Đánh nhãn (Labeling) Pod theo loại Agent để cân bằng tải thông minh.
Sửa Deployment cho Agent Heavy (tính toán nặng) và Agent Light (xử lý nhanh) để có label khác nhau.
cat > /app/manifests/agent-heavy-deployment.yaml
Kết quả mong đợi: File deployment cho agent nặng được tạo với label "type: heavy-compute".
cat > /app/manifests/agent-light-deployment.yaml
Kết quả mong đợi: File deployment cho agent nhẹ được tạo với label "type: fast-response".
Bước 2: Áp dụng các Deployment và tạo Service riêng biệt hoặc sử dụng Ingress để định tuyến dựa trên đường dẫn (Path-based routing).
Tạo Service riêng cho từng loại để Load Balancer (Ingress Controller như Nginx hoặc Traefik) có thể định tuyến chính xác.
kubectl apply -f /app/manifests/agent-heavy-deployment.yaml -n ai-platform
kubectl apply -f /app/manifests/agent-light-deployment.yaml -n ai-platform
Kết quả mong đợi: Các Pod được tạo với đúng label tương ứng.
Bước 3: Cấu hình Ingress để định tuyến request đến đúng loại Agent.
Sử dụng Ingress Resource để map URL /heavy/* đến Pod heavy và /fast/* đến Pod light. Điều này tránh việc request nhẹ bị kẹt bởi Pod đang xử lý nặng.
cat > /app/manifests/agent-ingress.yaml
Kết quả mong đợi: File Ingress được tạo, cấu hình định tuyến theo path.
Bước 4: Tạo Service cho các Deployment mới.
cat > /app/manifests/agent-services.yaml
kubectl apply -f /app/manifests/agent-services.yaml -n ai-platform
kubectl apply -f /app/manifests/agent-ingress.yaml -n ai-platform
Kết quả mong đợi: Các Service và Ingress được áp dụng thành công.
Bước 5: Verify kết quả bằng cách gọi các endpoint khác nhau và kiểm tra Pod nào xử lý.
curl -v http://api.your-ai-platform.com/heavy/process 2>&1 | grep "host"; curl -v http://api.your-ai-platform.com/fast/process 2>&1 | grep "host"
Kết quả mong đợi: Request /heavy chỉ được gửi đến Pod heavy, request /fast được phân tán đều cho các Pod light.
3. Thực hiện Blue-Green Deployment để Cập nhật Phiên bản Agent không Gián đoạn
Trong môi trường sản xuất, việc cập nhật Agent (đặc biệt là khi thay đổi logic hoặc model) không được gây downtime. Blue-Green Deployment cho phép chạy hai phiên bản song song và chuyển đổi traffic ngay lập tức.
Bước 1: Chuẩn bị Deployment "Blue" (phiên bản hiện tại đang chạy) và tạo Deployment "Green" (phiên bản mới) với cùng Service nhưng khác label.
Giả sử hiện tại đang chạy version v1.0.0 (Blue). Tạo Deployment cho v1.1.0 (Green).
cat > /app/manifests/agent-blue.yaml
cat > /app/manifests/agent-green.yaml
Kết quả mong đợi: Hai file deployment được tạo, sẵn sàng để áp dụng.
Bước 2: Áp dụng Deployment Green và Service chỉ trỏ vào Blue (hiện tại).
kubectl apply -f /app/manifests/agent-blue.yaml -n ai-platform
kubectl apply -f /app/manifests/agent-green.yaml -n ai-platform
Kết quả mong đợi: Cả 2 Deployment đều tồn tại, nhưng traffic vẫn đi vào v1.0.0 vì Service selector đang trỏ vào version đó.
Bước 3: Cập nhật Service Selector để chuyển đổi traffic từ Blue sang Green.
Thay đổi label selector trong file service.yaml từ version: v1.0.0 sang version: v1.1.0. Đây là bước "cắt" traffic.
cat > /app/manifests/agent-service.yaml
kubectl apply -f /app/manifests/agent-service.yaml -n ai-platform
Kết quả mong đợi: Service được cập nhật, traffic mới sẽ đi đến Pod v1.1.0 (Green). Pod v1.0.0 (Blue) vẫn chạy để xử lý các request cũ đang pending.
Bước 4: Chạy Smoke Test (kiểm thử nhanh) trên phiên bản Green trước khi chuyển toàn bộ traffic.
Sử dụng Service riêng biệt hoặc tạm thời điều chỉnh selector để gửi 1% traffic vào Green để kiểm tra tính ổn định.
cat > /app/manifests/agent-smoke-svc.yaml
kubectl apply -f /app/manifests/agent-smoke-svc.yaml -n ai-platform
curl http://ai-agent-green-test.ai-platform.svc.cluster.local:8001/health
Kết quả mong đợi: API trả về 200 OK, xác nhận phiên bản mới hoạt động tốt.
Bước 5: Thực hiện chuyển đổi cuối cùng và xóa phiên bản Blue cũ.
Khi đã xác nhận Green ổn định, xóa Deployment Blue để giải phóng tài nguyên.
kubectl delete deployment ai-agent-v1 -n ai-platform
kubectl delete service ai-agent-green-test -n ai-platform
Kết quả mong đợi: Chỉ còn lại Deployment v1.1.0 đang phục vụ toàn bộ traffic.
Bước 6: Verify kết quả bằng cách kiểm tra Pod đang chạy và logs.
kubectl get pods -n ai-platform -l app=ai-agent
kubectl logs -l app=ai-agent -n ai-platform --tail=20
Kết quả mong đợi: Tất cả Pod đều có label version: v1.1.0 và logs cho thấy phiên bản mới đang chạy.
4. Tổng kết Bài học Kinh nghiệm và Checklist Bảo mật Cuối cùng
Trước khi đưa hệ thống vào vận hành thực tế (Production), cần rà soát lại các điểm yếu tiềm ẩn về bảo mật và vận hành đã được đề cập trong series.
Bước 1: Tạo file Checklist bảo mật để rà soát (Security Checklist).
File này nên được lưu trong thư mục docs của dự án để team DevOps và Security cùng xem xét.
cat > /app/docs/production-security-checklist.md
Kết quả mong đợi: File checklist được tạo, team có thể đánh dấu từng mục đã hoàn thành.
Bước 2: Cấu hình Network Policy để cô lập Pod Agent khỏi mạng nội bộ không cần thiết.
Chỉ cho phép traffic từ Ingress Controller vào Pod Agent. Chặn tất cả traffic từ các Pod khác.
cat > /app/manifests/agent-network-policy.yaml
kubectl apply -f /app/manifests/agent-network-policy.yaml -n ai-platform
Kết quả mong đợi: Policy được áp dụng, Pod Agent chỉ nhận kết nối từ Ingress và kết nối ra DB/API.
Bước 3: Cấu hình Secret Management cho API Keys.
Không hardcode API Key trong code. Tạo Kubernetes Secret và mount vào biến môi trường.
kubectl create secret generic ai-llm-key --from-literal=OPENAI_API_KEY=sk-your-secret-key-here -n ai-platform
kubectl create secret generic ai-db-creds --from-literal=DB_PASSWORD=your-db-password -n ai-platform
Kết quả mong đợi: Các secret được tạo, key đã được mã hóa trong etcd của Kubernetes.
Bước 4: Cập nhật Deployment để mount Secrets vào Pod.
Sửa deployment.yaml để tham chiếu đến các secret vừa tạo.
cat > /app/manifests/agent-deployment-secure.yaml
kubectl apply -f /app/manifests/agent-deployment-secure.yaml -n ai-platform
Kết quả mong đợi: Pod mới chạy với security context chặt chẽ, không root, filesystem read-only và dùng secret.
Bước 5: Verify bảo mật bằng cách cố gắng truy cập Pod từ bên ngoài hoặc từ Pod khác không được phép.
curl http://ai-agent-secure.ai-platform.svc.cluster.local:8000/health
kubectl exec -it -n ai-platform -- id
Kết quả mong đợi:
1. Request từ trong cluster (nếu không qua Ingress) bị từ chối do Network Policy.
2. Lệnh id trong Pod trả về user 1000 (không phải root).
3. Không thể ghi file vào filesystem của container.
Đ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 9: Giám sát, Logging và Debugging trong môi trường Kubernetes
Phần 10: Troubleshooting nâng cao và chiến lược sản xuất »