Triển khai MLflow Tracking Server bằng Helm Chart
Cài đặt Helm và thêm Repository MLflow
Bạn cần cài đặt Helm client trên máy phát triển hoặc bastion host để quản lý các package Kubernetes. Sau đó, thêm repository chính thức của MLflow để truy cập vào chart mới nhất.
Việc này giúp bạn có công cụ để deploy, upgrade và rollback MLflow mà không cần viết Kubernetes manifest thủ công, giảm thiểu lỗi cấu hình.
Trình báo sẽ hiển thị thông báo "repository added" hoặc "repository already added".
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm repo add mlflow https://mlflow-team.github.io/helm-charts/
helm repo update
Deploy MLflow Server với Helm
Thực hiện lệnh install để triển khai MLflow Tracking Server vào namespace `mlflow`. Cấu hình này sử dụng version 2.10 trở lên, bật tính năng serve model và tạo user mặc định.
Chúng ta dùng Helm vì nó đóng gói đầy đủ các resource cần thiết: Deployment, Service, ConfigMap và ServiceAccount, đảm bảo tính nhất quán.
Khi lệnh chạy xong, bạn sẽ thấy trạng thái "STATUS: deployed" và các resource được tạo ra trong cluster.
helm install mlflow mlflow/mlflow \
--namespace mlflow \
--create-namespace \
--set mlflow.tracking.enabled=true \
--set mlflow.model-registry.enabled=true \
--set mlflow.serve.enabled=true \
--set mlflow.version=2.10.2 \
--set mlflow.adminUser=mladmin \
--set mlflow.adminPassword=mlpass123
Verify kết quả triển khai
Kiểm tra trạng thái các pod đang chạy để đảm bảo MLflow Tracking Server đã khởi động thành công và không bị lỗi OOM hoặc CrashLoopBackOff.
Pod phải ở trạng thái "Running" và đã tồn tại đủ 1 restart (hoặc 0 nếu mới khởi động lần đầu).
kubectl get pods -n mlflow -l app=mlflow
Expose MLflow qua Ingress
Tạo ConfigMap để định nghĩa Ingress Resource, ánh xạ đường dẫn `/` đến service MLflow. Giả sử bạn đã cài đặt Ingress Controller (như Nginx Ingress) trước đó.
Việc này cho phép bạn truy cập MLflow UI từ trình duyệt bên ngoài cluster thông qua tên miền hoặc IP public của Ingress Controller.
Khối Ingress sẽ được tạo thành công, bạn có thể thấy resource mới trong namespace.
cat
Verify truy cập UI
Sử dụng lệnh kubectl port-forward để ánh xạ cổng 5000 của pod MLflow sang cổng local 5000 trên máy của bạn để test nhanh.
Mở trình duyệt và truy cập `http://localhost:5000`, bạn sẽ thấy giao diện đăng nhập của MLflow.
kubectl port-forward svc/mlflow 5000:5000 -n mlflow
Cấu hình lưu trữ Artifact cho MLflow (S3 hoặc MinIO)
Triển khai MinIO như Object Storage nội bộ
Thêm repository MinIO và triển khai MinIO lên cluster để đóng vai trò là bucket S3 cho việc lưu trữ artifact (model, dataset, logs).
Sử dụng MinIO giúp bạn không phụ thuộc vào dịch vụ cloud bên ngoài (AWS S3) khi phát triển nội bộ, đồng thời giảm chi phí và độ trễ mạng.
Helm chart MinIO sẽ deploy 2 pod: MinIO server và MinIO Console.
helm repo add minio https://charts.min.io/
helm repo update
helm install minio minio/minio \
--namespace mlflow \
--create-namespace \
--set rootUser=minioadmin \
--set rootPassword=minioadmin123 \
--set defaultBuckets=mlflow-artifacts
Cấu hình MLflow để sử dụng MinIO Storage
Tạo file `values.yaml` tùy chỉnh để chỉ định biến môi trường `MLFLOW_TRACKING_URI` và `MLFLOW_ARTIFACTS_ROOT` trỏ vào endpoint của MinIO.
MLflow cần biết đường dẫn gốc để lưu trữ các file artifact, nếu không nó sẽ lưu vào local filesystem của pod, gây mất dữ liệu khi pod bị scale down.
File values.yaml này sẽ được dùng trong bước upgrade Helm chart của MLflow để áp đặt cấu hình mới.
cat > mlflow-values.yaml
Áp dụng cấu hình Artifact Storage vào MLflow
Sử dụng lệnh `helm upgrade` để cập nhật release MLflow hiện tại với file `values.yaml` vừa tạo, thay thế cấu hình mặc định.
Lệnh này sẽ kích hoạt rolling update, tạo pod mới với biến môi trường S3 và tái khởi động server để nhận cấu hình.
Pod MLflow sẽ ở trạng thái `Terminating` rồi chuyển sang `Running` với cấu hình mới.
helm upgrade mlflow mlflow/mlflow \
--namespace mlflow \
-f mlflow-values.yaml
Verify kết cấu lưu trữ
Truy cập vào pod MinIO Console để xác nhận bucket `mlflow-artifacts` đã được tạo và sẵn sàng nhận dữ liệu.
Bạn cần port-forward dịch vụ console của MinIO để xem giao diện quản lý bucket.
kubectl port-forward svc/minio-console 8900:8900 -n mlflow
Test lưu Artifact từ Client
Chạy một script Python đơn giản từ bên ngoài cluster (hoặc trong container khác) để log một artifact và kiểm tra xem nó có được đẩy lên MinIO không.
Nếu cấu hình đúng, script sẽ log thành công và file artifact sẽ xuất hiện trong bucket MinIO thay vì local disk.
cat > test_artifact.py
Cấu hình xác thực và bảo mật truy cập MLflow
Thiết lập Basic Auth trong MLflow
MLflow đã hỗ trợ Basic Auth mặc định thông qua biến môi trường. Bạn cần đảm bảo `MLFLOW_TRACKING_SERVER_AUTH` được bật (thường mặc định trong Helm chart mới).
Việc này yêu cầu người dùng phải nhập username/password khi truy cập UI hoặc khi gọi API tracking, ngăn chặn truy cập trái phép.
Trong file `mlflow-values.yaml` ở phần trước, chúng ta đã set `adminUser` và `adminPassword`. Nếu cần thêm user, hãy dùng lệnh create user của MLflow.
mlflow users create --username dev_user --password dev_pass123 --host http://mlflow:5000 --auth-provider basic
Tạo ConfigMap cho xác thực OAuth2 (Tùy chọn nâng cao)
Nếu bạn muốn tích hợp với Keycloak hoặc OAuth2 Provider bên ngoài, hãy tạo ConfigMap chứa cấu hình OIDC.
Đây là bước nâng cao để bảo mật cấp doanh nghiệp, cho phép dùng SSO thay vì Basic Auth đơn thuần.
ConfigMap sẽ được gắn vào pod MLflow dưới dạng volume hoặc biến môi trường.
cat
Cấu hình NetworkPolicy để hạn chế truy cập
Áp dụng NetworkPolicy chỉ cho phép các pod trong namespace `mlflow` hoặc từ namespace `default` truy cập vào MLflow Service.
Điều này giảm bề mặt tấn công, đảm bảo chỉ có các service nội bộ được phép giao tiếp với MLflow Tracking Server.
NetworkPolicy sẽ được tạo và áp dụng cho tất cả các pod mang label `app=mlflow`.
cat
Verify xác thực
Thử truy cập MLflow UI qua trình duyệt mà không nhập thông tin đăng nhập, hệ thống phải chặn và yêu cầu auth.
Sau đó nhập đúng username/password đã tạo ở phần trước, bạn sẽ được đưa vào dashboard chính.
curl -v http://mlflow.yourdomain.com/login
Kết nối client Python với MLflow server trong cluster
Cấu hình biến môi trường trong script huấn luyện
Trong code Python của bạn, hãy sử dụng hàm `mlflow.set_tracking_uri()` để trỏ về endpoint của MLflow server.
Điều này cần thiết để mọi run, model và metric được ghi lại vào server trung tâm thay vì local file system.
Script sẽ in ra thông tin kết nối thành công và tạo run mới trên server.
import mlflow
# Kết nối đến MLflow Tracking Server
# Nếu chạy trong cluster: dùng DNS service
# Nếu chạy từ ngoài: dùng Ingress URL
mlflow.set_tracking_uri("http://mlflow:5000")
# Set experiment name
mlflow.set_experiment("k8s_training_pipeline")
print("Connected to MLflow successfully.")
Chạy script huấn luyện từ bên ngoài Cluster
Chạy script Python trên máy local, nhưng cấu hình `tracking_uri` trỏ về Ingress public của MLflow.
Điều này cho phép bạn phát triển code trên laptop nhưng vẫn log vào MLflow đang chạy trên K8s.
Trình duyệt của bạn cần truy cập được vào `http://mlflow.yourdomain.com` và script phải chạy không lỗi kết nối.
mlflow.set_tracking_uri("http://mlflow.yourdomain.com")
mlflow.set_experiment("external_client_test")
with mlflow.start_run():
mlflow.log_param("learning_rate", 0.01)
mlflow.log_metric("accuracy", 0.95)
print("Run logged from external client.")
Chạy script huấn luyện từ bên trong Cluster (Pod/Job)
Khi script chạy trong một Pod khác (ví dụ: Training Job), bạn dùng DNS internal của Kubernetes (`mlflow:5000`) để giảm độ trễ.
Trong môi trường K8s, DNS internal là cách nhanh nhất và ổn định nhất để các service giao tiếp với nhau.
Pod training phải có thể resolve tên `mlflow` và kết nối TCP vào port 5000.
cat > docker-train-entrypoint.sh
Verify kết nối từ Client
Truy cập vào tab "Experiments" hoặc "Runs" trên giao diện MLflow UI, tìm kiếm tên experiment bạn vừa tạo (`k8s_training_pipeline`).
Bạn sẽ thấy các run mới xuất hiện với các tham số (params) và metric đã được log từ script Python.
mlflow experiments search --experiment-name "k8s_training_pipeline"
Đ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 4: Cài đặt và cấu hình MLflow trên Kubernetes
Phần 5: Quản lý vòng đời mô hình với MLflow »