1. Chuẩn bị PersistentVolumeClaim (PVC) cho Vector Database
Vector Database cần lưu trữ dữ liệu dạng file trên disk để đảm bảo tính nhất quán và hiệu năng truy xuất. Nếu không có PVC, dữ liệu sẽ mất khi Pod bị xóa hoặc restart.
Chúng ta sẽ tạo một PVC với loại storage là local-path (phù hợp cho môi trường dev/test) hoặc hostPath. Trong môi trường production thực tế, hãy thay storageClassName bằng gp2 (AWS) hoặc standard (GCP/On-prem).
Tạo file cấu trúc YAML với đường dẫn đầy đủ: /home/admin/vector-db-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: milvus-pvc
namespace: private-llm
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
storageClassName: local-path
Kết quả mong đợi: Kubernetes sẽ cấp phát một Volume và gắn nó vào PVC milvus-pvc trong namespace private-llm.
Áp dụng cấu hình vào cluster:
kubectl apply -f /home/admin/vector-db-pvc.yaml
Verify kết quả bằng lệnh kiểm tra trạng thái PVC:
kubectl get pvc milvus-pvc -n private-llm
Bạn sẽ thấy trạng thái STATUS là Bound và CAPACITY là 50Gi.
2. Triển khai Milvus qua Helm Chart
2.1. Cài đặt Helm Repository
Chúng ta sử dụng Milvus vì khả năng mở rộng (scaling) tốt hơn ChromaDB khi dữ liệu lớn. Đầu tiên cần thêm repository chính thức của Milvus vào Helm client.
helm repo add milvus https://zilliztech.github.io/milvus-helm/
helm repo update
Kết quả mong đợi: Repository milvus được cập nhật thành công và hiển thị danh sách các chart có sẵn.
2.2. Cấu hình values.yaml tùy chỉnh
Milvus mặc định chạy với nhiều component (ETCD, MinIO, Pulsar). Để đơn giản hóa và phù hợp với môi trường Private LLM, chúng ta cần cấu hình lại để:
- Turn off MinIO (sử dụng local storage hoặc MinIO riêng).
- Bind đúng PVC đã tạo ở phần 1.
- Expose cổng API (19530) qua Service NodePort hoặc LoadBalancer.
Tạo file cấu hình: /home/admin/milvus-values.yaml
cluster:
enabled: true
name: milvus
etcd:
enabled: true
persistence:
enabled: true
storageClass: local-path
accessMode: ReadWriteOnce
size: 5Gi
minio:
enabled: true
persistence:
enabled: true
storageClass: local-path
accessMode: ReadWriteOnce
size: 50Gi
pulsar:
enabled: true
persistence:
enabled: true
storageClass: local-path
accessMode: ReadWriteOnce
size: 10Gi
milvus:
persistence:
enabled: true
storageClass: local-path
accessMode: ReadWriteOnce
size: 50Gi
service:
type: NodePort
port: 19530
resources:
limits:
cpu: 2000m
memory: 4Gi
requests:
cpu: 1000m
memory: 2Gi
Cấu hình này sẽ deploy toàn bộ stack Milvus (Etcd, MinIO, Pulsar, Milvus) và map PVC vào từng component cần lưu trữ.
2.3. Deploy Milvus vào Kubernetes
Thực thi lệnh install với namespace private-llm và file values.yaml vừa tạo.
helm install milvus milvus/milvus \
-n private-llm \
-f /home/admin/milvus-values.yaml \
--wait \
--timeout 10m
Kết quả mong đợi: Quá trình cài đặt sẽ mất vài phút. Khi xong, terminal sẽ in ra NAME: milvus và trạng thái các release là deployed.
3. Kiểm tra Trạng thái và Expose Endpoint
3.1. Verify Pod và Service
Để đảm bảo hệ thống đã chạy ổn định, chúng ta kiểm tra tất cả các Pod trong namespace và Service để lấy địa chỉ IP/Port.
kubectl get pods -n private-llm | grep milvus
Kết quả mong đợi: Tất cả các pod (milvus-etcd, milvus-minio, milvus-pulsar, milvus-standalone) đều có trạng thái STATUS là Running và RESTARTS bằng 0.
Để lấy địa chỉ truy cập (Endpoint) của Milvus API:
kubectl get svc -n private-llm | grep milvus
Bạn sẽ thấy một dòng có NAME là milvus với TYPE là NodePort (hoặc LoadBalancer nếu cluster hỗ trợ). Ghi lại EXTERNAL-IP và PORT(S) (thường là 19530).
3.2. Test kết nối từ Pod khác
Để chắc chắn Milvus đã sẵn sàng nhận kết nối, hãy vào trong một pod bất kỳ (ví dụ: pod của vLLM sau này hoặc pod debug) và ping thử API.
kubectl run -it --rm --image=python:3.9 --restart=Never --namespace=private-llm debug-client -- bash
Trong terminal của pod debug-client, chạy lệnh kiểm tra kết nối:
python -c "import urllib.request; urllib.request.urlopen('http://milvus:19530')"
Kết quả mong đợi: Không có lỗi (error) được in ra, hoặc in ra mã trạng thái 200. Nếu thấy lỗi Connection refused, hãy kiểm tra lại log của pod milvus-standalone bằng lệnh kubectl logs -f milvus-standalone -n private-llm.
Thoát khỏi pod debug:
exit
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Private LLM với vLLM, RAG và VectorDB trên hạ tầng Kubernetes
« Phần 1: Chuẩn bị môi trường và kiến trúc tổng quan cho Private LLM trên Kubernetes
Phần 3: Xây dựng và tối ưu hóa dữ liệu nguồn cho RAG »