Triển khai MLflow Tracking Server bằng Helm Chart
1. Thêm repository của MLflow vào Helm
Thêm source chart chính thức của MLflow để có thể truy cập phiên bản mới nhất và ổn định nhất.
helm repo add mlflow https://mlflow.github.io/helm-charts
helm repo update
Kết quả mong đợi: Thông báo "repository 'mlflow' added" và các chart được cập nhật thành công.
2. Chuẩn bị file cấu hình values.yaml
Tạo file cấu hình để tùy chỉnh tên namespace, số lượng replica, và cổng truy cập mặc định của server.
Đường dẫn file: ./mlflow-values.yaml
namespace: mlflow-system
image:
repository: cr.containers.dev/mlflow/mlflow
tag: "2.10.2"
pullPolicy: IfNotPresent
server:
replicas: 1
resources:
limits:
cpu: 1000m
memory: 2Gi
requests:
cpu: 500m
memory: 1Gi
service:
type: LoadBalancer
port: 5000
extraEnv:
- name: MLFLOW_TRACKING_URI
value: "http://mlflow-tracking-service:5000"
- name: MLFLOW_ARTIFACT_ROOT
value: "s3://mlflow-artifacts/training-logs"
ingress:
enabled: true
className: "nginx"
hosts:
- host: mlflow.local
paths:
- path: /
pathType: Prefix
tls:
- secretName: mlflow-tls
hosts:
- mlflow.local
Kết quả mong đợi: File được tạo với cấu trúc YAML hợp lệ, sẵn sàng để Helm parse.
3. Triển khai Tracking Server lên Cluster
Chạy lệnh install để tạo các resource Kubernetes (Deployment, Service, Ingress) dựa trên file values.yaml.
helm install mlflow-tracking mlflow/mlflow -f ./mlflow-values.yaml -n mlflow-system --create-namespace
Kết quả mong đợi: Thông báo "NAME: mlflow-tracking" và các resource được tạo trong namespace mlflow-system.
4. Kiểm tra trạng thái triển khai
Verify các pod đã chạy ổn định và service đã được expose.
kubectl get pods -n mlflow-system
kubectl get svc -n mlflow-system
Kết quả mong đợi: Pod hiển thị trạng thái Running với restart count = 0, Service hiển thị kiểu LoadBalancer hoặc ClusterIP tùy cấu hình.
Cấu hình lưu trữ Artifact cho MLflow (MinIO)
1. Triển khai MinIO làm Object Storage nội bộ
MinIO đóng vai trò thay thế S3 để lưu trữ các artifact (model files, logs, plots) trong cluster, giúp giảm độ trễ và chi phí.
helm repo add minio https://charts.min.io
helm repo update
helm install minio minio/minio -n mlflow-system --create-namespace --set accessKey=minioadmin --set secretKey=minioadmin123 --set persistence.enabled=false
Kết quả mong đợi: MinIO Server và MinIO Console được triển khai thành công trong namespace mlflow-system.
2. Tạo bucket lưu trữ artifact
Sử dụng MinIO Client (mc) để tạo bucket chuyên dụng cho artifact của MLflow.
mc alias set ml http://minio-minio.mlfow-system.svc:9000 minioadmin minioadmin123
mc mb ml/mlflow-artifacts
Kết quả mong đợi: Thông báo "Bucket created successfully - mlflow-artifacts".
3. Cập nhật biến môi trường trong MLflow Server
Cấu hình lại MLflow Tracking Server để trỏ artifact root về bucket MinIO vừa tạo. Điều này đảm bảo mọi run đều lưu file vào S3-compatible storage.
helm upgrade mlflow-tracking mlflow/mlflow -n mlflow-system --set server.extraEnv[0].name=MLFLOW_ARTIFACT_ROOT --set server.extraEnv[0].value="s3://mlflow-artifacts/training-logs" --set server.extraEnv[1].name=AWS_ACCESS_KEY_ID --set server.extraEnv[1].value="minioadmin" --set server.extraEnv[2].name=AWS_SECRET_ACCESS_KEY --set server.extraEnv[2].value="minioadmin123" --set server.extraEnv[3].name=AWS_S3_ENDPOINT --set server.extraEnv[3].value="http://minio-minio.mlfow-system.svc:9000" --set server.extraEnv[4].name=MLFLOW_S3_IGNORE_TLS --set server.extraEnv[4].value="true"
Kết quả mong đợi: Helm upgrade hoàn tất, pod sẽ restart để load biến môi trường mới.
4. Verify kết nối lưu trữ
Kiểm tra xem pod MLflow có thể truy cập MinIO không và bucket đã được nhận diện.
kubectl logs -n mlflow-system $(kubectl get pods -n mlflow-system -l app=mlflow -o jsonpath='{.items[0].metadata.name}') | grep -i "s3"
Kết quả mong đợi: Log không xuất hiện lỗi "Connection refused" hoặc "Access Denied" khi khởi động server.
Cấu hình xác thực và bảo mật truy cập MLflow
1. Cấu hình Basic Auth với Authelia hoặc Keycloak (Simplified: Basic Auth)
Để đơn giản hóa cho bước này, ta sẽ sử dụng cơ chế Basic Auth tích hợp sẵn của MLflow bằng cách cấu hình file config hoặc biến môi trường. Ở đây ta dùng biến môi trường để khởi tạo user admin.
Chú ý: MLflow mặc định không có cơ chế auth mạnh, cần cấu hình proxy (như Nginx) hoặc plugin. Ở đây ta cấu hình biến môi trường để kích hoạt cơ chế kiểm tra quyền truy cập cơ bản.
helm upgrade mlflow-tracking mlflow/mlflow -n mlflow-system --set server.extraEnv[5].name=MLFLOW_TRACKING_USERNAME --set server.extraEnv[5].value="admin" --set server.extraEnv[6].name=MLFLOW_TRACKING_PASSWORD --set server.extraEnv[6].value="SecurePassword123!"
Kết quả mong đợi: Server khởi động lại, yêu cầu username/password khi truy cập API.
2. Cấu hình RBAC Kubernetes cho Service Account
Tạo Service Account và Role để đảm bảo pod MLflow có quyền đọc ghi vào Persistent Volume hoặc MinIO nếu cần, và hạn chế quyền truy cập cluster khác.
Đường dẫn file: ./mlflow-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: mlflow-sa
namespace: mlflow-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: mlflow-role
namespace: mlflow-system
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps", "secrets"]
verbs: ["get", "list", "watch", "create", "update", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "create", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: mlflow-rolebinding
namespace: mlflow-system
subjects:
- kind: ServiceAccount
name: mlflow-sa
namespace: mlflow-system
roleRef:
kind: Role
name: mlflow-role
apiGroup: rbac.authorization.k8s.io
Kết quả mong đợi: RBAC resources được tạo thành công.
3. Áp dụng RBAC vào Deployment
Update Helm chart để Deployment của MLflow sử dụng Service Account vừa tạo.
helm upgrade mlflow-tracking mlflow/mlflow -n mlflow-system --set server.serviceAccount.name=mlflow-sa --set server.serviceAccount.create=false
Kết quả mong đợi: Pod MLflow chạy với context của service account 'mlflow-sa', có quyền truy cập tài nguyên nội bộ.
4. Verify bảo mật
Thử truy cập API MLflow không có token hoặc credentials sai để xác nhận bị chặn.
curl -v http://mlflow-tracking-service.mlfow-system.svc:5000/api/2.0/mlflow/runs/create 2>&1 | grep "401"
Kết quả mong đợi: HTTP Status Code 401 Unauthorized, chứng tỏ xác thực đang hoạt động.
Kết nối Client Python với MLflow Server trong Cluster
1. Cài đặt thư viện MLflow trong môi trường Client
Trên máy phát triển hoặc trong container training, cài đặt SDK cần thiết.
pip install mlflow boto3 requests
Kết quả mong đợi: Các thư viện được cài đặt thành công.
2. Cấu hình kết nối trong Script Python
Viết script Python để kết nối với MLflow Tracking Server đang chạy trong Kubernetes, bao gồm việc cấu hình tracking URI và artifact location.
Đường dẫn file: ./train_client.py
import mlflow
import boto3
# Cấu hình kết nối đến MLflow Tracking Server trong Cluster
# Lưu ý: Nếu chạy từ ngoài cluster, cần dùng URL Ingress (mlflow.local)
# Nếu chạy từ trong cluster (sidecar hoặc pod khác), dùng DNS nội bộ
MLFLOW_TRACKING_URI = "http://mlflow-tracking-service.mlfow-system.svc:5000"
# Cấu hình artifact location (MinIO)
MLFLOW_ARTIFACT_ROOT = "s3://mlflow-artifacts/training-logs"
# Thiết lập tracking URI
mlflow.set_tracking_uri(MLFLOW_TRACKING_URI)
# Thiết lập artifact location mặc định
mlflow.set_registry_uri(MLFLOW_TRACKING_URI)
# Cấu hình credentials cho S3 (MinIO)
# Trong môi trường thực tế, nên dùng AWS_SESSION_TOKEN hoặc IAM Role
mlflow.set_config(
{
"s3": {
"access_key_id": "minioadmin",
"secret_access_key": "minioadmin123",
"endpoint_url": "http://minio-minio.mlfow-system.svc:9000",
"use_ssl": False
}
}
)
# Bắt đầu một run mới
with mlflow.start_run(run_name="k8s-mlflow-test"):
# Log tham số
mlflow.log_param("learning_rate", 0.001)
mlflow.log_param("epochs", 10)
# Log metric
mlflow.log_metric("accuracy", 0.95)
# Log artifact (tạo file dummy)
with open("dummy_model.txt", "w") as f:
f.write("Model weights: [0.1, 0.2, 0.3]")
mlflow.log_artifact("dummy_model.txt")
# Đăng ký mô hình vào Model Registry
# mlflow.sklearn.log_model(sk_model, "my-model") # Ví dụ nếu dùng sklearn
print("Run completed successfully. Check MLflow UI.")
Kết quả mong đợi: Script chạy không lỗi, thông báo "Run completed successfully".
3. Chạy script và verify dữ liệu
Thực thi script và kiểm tra xem dữ liệu có xuất hiện trên UI MLflow và trong bucket MinIO không.
python train_client.py
kubectl port-forward -n mlflow-system svc/mlflow-tracking-service 5000:5000 &
mc ls ml/mlflow-artifacts/training-logs
Kết quả mong đợi: Terminal hiển thị logs của script, và lệnh mc ls hiển thị đường dẫn artifact đã được upload thành công vào bucket.
4. Truy cập UI để xác nhận
Mở trình duyệt truy cập địa chỉ port-forward hoặc Ingress URL, đăng nhập (nếu đã cấu hình auth) để xem Run mới tạo.
open http://localhost:5000
Kết quả mong đợi: Giao diện MLflow hiển thị run "k8s-mlflow-test" với các tham số, metric và artifact đã được log.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng DataOps với DVC, MLflow và Kubernetes cho vòng đời AI
« Phần 3: Tích hợp DVC vào quy trình huấn luyện ML
Phần 4: Cài đặt và cấu hình MLflow trên Kubernetes »