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。这样排查问题会清晰很多。

MinIO 在 Kubeflow 中的角色 MinIO 对象存储 Pipeline 中间产物 模型与数据集 Katib 实验日志 Notebook 工作区 所有角色均基于 S3 兼容 API,可无缝切换至外部对象存储

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,比如 mlpipelinekubeflow-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 才能跑得顺畅。


专注资料整理