3、MinIO 对象存储部署:MinIO 在 Kubeflow 中的角色、Helm 部署 MinIO、创建 Bucket 与 AccessKey、MinIO Console 管理
3.1 MinIO 在 Kubeflow 中的角色
聊到 Kubeflow 的存储,绕不开 MinIO。说白了,它就是 Kubeflow 生态里的「默认文件柜」。
我刚开始接触 Kubeflow 时,有个困惑:明明有云厂商的 S3,为什么还要折腾 MinIO?后来在项目里踩过坑才明白——MinIO 扮演的是「本地 S3 兼容层」的角色。你的训练数据、模型 artifact、Pipeline 中间产物,全得有个地方存。MinIO 就是干这个的。
具体来说,MinIO 在 Kubeflow 里承担这几件事:
- Pipeline 中间产物存储:每个 Pipeline 步骤的输出,默认会写到 MinIO 的 bucket 里。我见过有人把中间结果全丢本地磁盘,结果 Pod 一重启全没了——嗯,血的教训。
- 模型与数据集持久化:训练好的模型、预处理后的数据集,存到 MinIO 里,后续推理服务直接拉取。
- Katib 超参调优的日志:Katib 每次实验的日志和指标,也依赖 MinIO 做后端存储。
- Notebook 工作区备份:你可以在 Notebook 里直接读写 MinIO,相当于给 Jupyter Lab 配了个网盘。
核心要点:MinIO 不是可选项,是 Kubeflow 的「默认存储后端」。除非你明确配置了外部 S3 或 GCS,否则 MinIO 就是那个兜底的。
我个人习惯,在部署 Kubeflow 之前,先把 MinIO 单独部署好,验证通了再装 Kubeflow。这样排查问题会清晰很多。
3.2 Helm 部署 MinIO
部署 MinIO 的方式有好几种,我推荐用 Helm。为什么?因为 Kubeflow 本身也是 Helm 部署的,统一管理起来方便。你想想看,用 kubectl apply 一个个 YAML 文件去怼,后期升级维护多痛苦。
先加个 Helm 仓库:
helm repo add minio https://charts.min.io/
helm repo update
然后写个 values.yaml 文件。我个人习惯把配置抽出来,方便后续改:
# values.yaml
replicas: 4
persistence:
size: 100Gi
storageClass: nfs-client # 根据你的集群环境改
resources:
requests:
memory: 2Gi
cpu: 1
limits:
memory: 4Gi
cpu: 2
accessKey: "admin"
secretKey: "minio123"
mode: distributed
小提示:replicas 设 4 是因为 MinIO 分布式模式要求至少 4 个节点(擦除编码)。如果你只是测试,设成 standalone 模式也行,但生产环境千万别这么干。
执行部署:
helm install minio minio/minio -f values.yaml --namespace kubeflow --create-namespace
等个一两分钟,检查 Pod 状态:
kubectl get pods -n kubeflow | grep minio
你应该能看到 4 个 minio Pod 处于 Running 状态。如果卡在 Pending,八成是 PVC 没绑定上——检查你的 StorageClass 是不是配对了。
我曾经在一个客户的集群上部署,StorageClass 名字写错了一个字母,结果 Pod 一直 Pending 了半小时。后来发现是「nfs-client」写成了「nfs-clinet」……嗯,这种低级错误,谁还没犯过呢。
3.3 创建 Bucket 与 AccessKey
MinIO 跑起来了,接下来得创建 Bucket 和 AccessKey。Kubeflow 默认会找几个特定的 Bucket,比如 mlpipeline、kubeflow-artifacts 这些。
有两种方式创建:
- 命令行方式:用 mc 客户端(MinIO Client)
- Console 界面:图形化操作,适合不熟悉命令行的同学
先说说命令行方式。安装 mc:
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
配置连接:
mc alias set myminio http://minio.kubeflow.svc.cluster.local:9000 admin minio123
创建 Bucket:
mc mb myminio/mlpipeline
mc mb myminio/kubeflow-artifacts
mc mb myminio/kubeflow-models
创建 AccessKey 和 SecretKey:
mc admin user add myminio myaccesskey mysecretkey123
然后给这个用户授权:
mc admin policy set myminio readwrite user=myaccesskey
注意:Kubeflow 的 Pipeline 组件默认使用 minio 这个 service account 的密钥。如果你改了 AccessKey,记得同步更新 Kubeflow 的配置,否则 Pipeline 跑不起来。
我一般会创建三个 Bucket:一个放 Pipeline 中间数据,一个放最终模型,一个放训练日志。这样权限好控制,清理也方便。
3.4 MinIO Console 管理
MinIO Console 是个 Web UI,能让你点点鼠标就完成大部分操作。部署时默认会创建一个 Service,端口是 9001(注意不是 9000,9000 是 API 端口)。
暴露 Console 的方式:
kubectl port-forward svc/minio-console 9001:9001 -n kubeflow
然后浏览器打开 http://localhost:9001,用你在 values.yaml 里设置的 accessKey 和 secretKey 登录。
Console 里能干的事:
- 浏览 Bucket:查看所有 Bucket 里的文件,支持上传下载
- 管理用户:创建/删除用户,分配策略
- 查看监控:磁盘使用量、请求速率、错误率
- 设置 Bucket 策略:比如设为公开只读,或者绑定特定用户
我个人习惯在 Console 里先验证一下 Bucket 的读写权限。上传一个测试文件,再下载回来,确认没问题了再交给 Kubeflow 用。这一步虽然简单,但能省掉后面很多排查时间。
经验之谈:MinIO Console 的「Bucket 事件」功能很实用。你可以配置当有新文件上传时,自动触发一个 Webhook 或通知到 Kafka。我在做实时训练数据管道时就用过这个,效果不错。
最后提一句,MinIO 的日志默认打到 stdout,你可以用 kubectl logs 查看。如果发现权限报错,八成是 AccessKey 或 SecretKey 不匹配。检查一下 Kubeflow 的 mlpipeline-minio-artifact 这个 Secret 里的值,跟 MinIO 里创建的是否一致。
嗯,MinIO 这块就聊到这儿。部署不难,但细节不少。把这一步搞扎实了,后面的 Kubeflow Pipeline 才能跑得顺畅。