Cấu hình Secret và ConfigMap cho dữ liệu nhạy cảm
Bước đầu tiên khi đưa ứng dụng vào Kubernetes là tách biệt mã nguồn khỏi dữ liệu nhạy cảm như API keys hay biến môi trường. Chúng ta không hardcode thông tin này vào Docker image mà sẽ sử dụng Secret và ConfigMap.
Tạo file Secret để lưu trữ API Key của LLM provider (ví dụ: OpenAI, Anthropic). Sử dụng base64 để mã hóa giá trị trước khi đưa vào YAML.
Đường dẫn: ./k8s/agent-secret.yaml
Trước khi tạo file, mã hóa key của bạn bằng lệnh: echo -n 'YOUR_ACTUAL_API_KEY' | base64. Kết quả mong đợi là một chuỗi ký tự base64.
Sử dụng chuỗi base64 đó để điền vào file YAML sau:
apiVersion: v1
kind: Secret
metadata:
name: agent-llm-secret
namespace: ai-agents
type: Opaque
data:
# Thay thế 'QUtFQV...' bằng kết quả base64 của API key thực tế
OPENAI_API_KEY: QUtFQV...
# Nếu cần thêm key khác, thêm dòng tương tự
# ANTHROPIC_API_KEY:
Khi tạo Secret, Kubernetes sẽ lưu trữ dữ liệu này ở tầng metadata riêng biệt, giúp bảo mật hơn so với ConfigMap thông thường. Bạn có thể áp dụng ngay bằng lệnh: kubectl apply -f ./k8s/agent-secret.yaml. Kết quả mong đợi: secret/agent-llm-secret created.
Tiếp theo, tạo ConfigMap để quản lý các tham số cấu hình không nhạy cảm như mức độ nhiệt độ (temperature) của LLM hoặc số lượng worker.
Đường dẫn: ./k8s/agent-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: agent-config
namespace: ai-agents
data:
LLM_MODEL: "gpt-4o-mini"
TEMPERATURE: "0.7"
MAX_TOKENS: "4096"
LOG_LEVEL: "INFO"
ConfigMap này sẽ được gắn vào Pod dưới dạng biến môi trường hoặc file cấu hình. Áp dụng cấu hình: kubectl apply -f ./k8s/agent-configmap.yaml. Kết quả mong đợi: configmap/agent-config created.
Viết Manifest Deployment để chạy nhiều bản sao
Sau khi đã có Secret và ConfigMap, ta sẽ viết manifest Deployment để khai báo cách Kubernetes chạy ứng dụng AI Agent. Mục tiêu là tạo ra một Deployment có thể tự động scale lên nhiều Pod (replicas) để chịu tải.
Đường dẫn: ./k8s/agent-deployment.yaml
Manifest này sẽ trỏ đến Docker image đã đóng gói ở Phần 4, đồng thời inject Secret và ConfigMap vào môi trường của container.
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-agent-deployment
namespace: ai-agents
labels:
app: ai-agent
spec:
replicas: 3
selector:
matchLabels:
app: ai-agent
template:
metadata:
labels:
app: ai-agent
spec:
containers:
- name: agent-app
image: your-docker-registry/ai-agent:latest
imagePullPolicy: Always
ports:
- containerPort: 8000
name: http-port
env:
# Mount Secret vào biến môi trường
- name: OPENAI_API_KEY
valueFrom:
secretKeyRef:
name: agent-llm-secret
key: OPENAI_API_KEY
# Mount ConfigMap vào biến môi trường
- name: LLM_MODEL
valueFrom:
configMapKeyRef:
name: agent-config
key: LLM_MODEL
- name: TEMPERATURE
valueFrom:
configMapKeyRef:
name: agent-config
key: TEMPERATURE
- name: MAX_TOKENS
valueFrom:
configMapKeyRef:
name: agent-config
key: MAX_TOKENS
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: agent-config
key: LOG_LEVEL
# Resource limits để tránh OOMKilled trên node
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "2Gi"
cpu: "1000m"
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 10
periodSeconds: 30
readinessProbe:
httpGet:
path: /ready
port: 8000
initialDelaySeconds: 5
periodSeconds: 10
Trong cấu hình trên, phần env sử dụng secretKeyRef và configMapKeyRef để tự động kéo giá trị từ các đối tượng đã tạo ở bước trước. Liveness và Readiness probe đảm bảo Kubernetes chỉ chuyển traffic vào Pod khi ứng dụng đã sẵn sàng và tự động restart nếu ứng dụng bị treo. Áp dụng file: kubectl apply -f ./k8s/agent-deployment.yaml. Kết quả mong đợi: deployment.apps/ai-agent-deployment created.
Verify trạng thái: Chạy kubectl get pods -n ai-agents. Bạn sẽ thấy 3 Pod đang ở trạng thái Running sau khi pull image hoàn tất.
Cấu hình Service để phơi lộ API ra bên ngoài
Khi Deployment chạy xong, các Pod chỉ có thể giao tiếp nội bộ. Để các thành phần khác (như Gateway API ở Phần 8) hoặc người dùng bên ngoài có thể gọi API của Agent, ta cần tạo một Service.
Đường dẫn: ./k8s/agent-service.yaml
Chúng ta sẽ sử dụng loại ClusterIP để Service này chỉ truy cập được bên trong cluster (an toàn cho nội bộ), hoặc đổi thành LoadBalancer nếu cần truy cập trực tiếp từ public internet.
apiVersion: v1
kind: Service
metadata:
name: ai-agent-service
namespace: ai-agents
labels:
app: ai-agent
spec:
type: ClusterIP
selector:
app: ai-agent
ports:
- port: 8000
targetPort: 8000
protocol: TCP
name: http-port
Service này sẽ tạo một IP ảo cố định bên trong cluster, và Kubernetes sẽ tự động load-balance traffic đến 3 Pod của Deployment dựa trên label selector app: ai-agent. Áp dụng file: kubectl apply -f ./k8s/agent-service.yaml. Kết quả mong đợi: service/ai-agent-service created.
Để lấy địa chỉ IP nội bộ của Service: kubectl get service ai-agent-service -n ai-agents. Kết quả sẽ hiển thị CLUSTER-IP và EXTERNAL-IP (có thể là <none> nếu dùng ClusterIP).
Triển khai và kiểm tra toàn bộ hệ thống
Bây giờ ta sẽ thực hiện quy trình triển khai toàn bộ từ dưới lên (Secret -> ConfigMap -> Deployment -> Service) và xác minh tính năng hoạt động.
Đầu tiên, đảm bảo namespace đã tồn tại. Nếu chưa, tạo namespace: kubectl create namespace ai-agents. Kết quả mong đợi: namespace/ai-agents created.
Áp dụng tất cả các manifest theo thứ tự ưu tiên: kubectl apply -f ./k8s/. Kết quả mong đợi: secret/agent-llm-secret created, configmap/agent-config created, deployment.apps/ai-agent-deployment created, service/ai-agent-service created.
Theo dõi trạng thái Pod cho đến khi chúng chuyển sang Running: kubectl get pods -n ai-agents -w. Dừng theo dõi khi thấy 3 Pod đều Running và READY 1/1.
Kiểm tra xem Pod có nhận đúng biến môi trường từ Secret và ConfigMap hay không. Chọn một Pod ngẫu nhiên: kubectl exec -it -n ai-agents <pod-name> -- env | grep OPENAI. Kết quả mong đợi: Hiển thị giá trị biến OPENAI_API_KEY đúng như key đã mã hóa.
Test khả năng phản hồi của Agent từ bên trong cluster. Sử dụng curl từ một Pod khác hoặc từ chính Pod Agent nếu có curl: kubectl run -n ai-agents debug-curl --rm -it --image=busybox --restart=Never -- curl ai-agent-service:8000/health. Kết quả mong đợi: Trả về JSON {"status": "healthy"} hoặc tương tự tùy code của bạn.
Kiểm tra lại logs để đảm bảo không có lỗi khởi tạo (startup errors) liên quan đến API key hoặc model: kubectl logs -n ai-agents -l app=ai-agent. Kết quả mong đợi: Logs hiển thị quá trình khởi tạo thành công, kết nối với LLM provider và sẵn sàng nhận request.
Đ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 4: Đóng gói ứng dụng AI Agent thành Docker Image
Phần 6: Tối ưu hiệu năng với Horizontal Pod Autoscaler (HPA) »