Kubeflow 是一种现代解决方案,用于使用最新和最流行的框架设计、构建和编排机器学习管道。开箱即用,Kubeflow 在内部附带 MinIO,用于存储其所有管道、工件和日志,但是该 MinIO 仅限于单个 PVC,因此无法从分布式 MinIO 带来的所有功能中受益,例如 主动-主动复制、通过 分层 实现无限存储 - 等等。
在本博文中,我们将配置 Kubeflow 以使用同一 Kubernetes 集群上的大型 MinIO 租户,当然,此配置也适用于 Kubeflow 和 MinIO 在不同集群上的情况。作为参考,请参阅我们之前的博文,在 Azure 上使用 Kubeflow 和 MinIO 的机器学习管道,以及 Kubeflow 网站。
虽然在本博文中我们将从头到尾进行讲解,但如果您已经拥有 Kubeflow 设置和 MiniO 设置,则可以直接跳到本博文的 配置 Kubeflow 部分,查看需要配置的内容。
设置 MinIO 运算符
让我们从安装 MinIO 运算符和创建 Kubeflow 将使用的租户开始。我安装 MinIO 运算符最喜欢的办法是通过 kubectl apply -k
,但我们也提供了 Helm 图表,并且我们还在 AWS 市场、Google Cloud 市场 和 Azure 市场 上提供。
kubectl apply -k github.com/minio/operator/ |

这将安装最新且最棒的 MinIO 运算符,现在我们只需要登录运算符 UI 并创建一个租户。在此步骤中,我们将获得一个服务帐户 JWT 令牌以登录,但此 UI 也可以通过 AD/LDAP 或 OIDC 来保护。
kubectl -n minio-operator get secret $(kubectl -n minio-operator get serviceaccount console-sa -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode && echo "" |

现在让我们将 UI 端口转发并登录。
kubectl -n minio-operator port-forward svc/console 9090 |

现在打开浏览器,转到 https://127.0.0.1:9090 并使用我们在上一步中获得的 JWT 令牌登录。

登录后,单击 创建租户 并设置一个 1TiB 租户。

输入新租户的名称及其命名空间。

如果命名空间不存在,您可以选择创建该命名空间。

现在让我们调整租户的大小。我将设置一个 4 节点集群,每个节点上有 4 个驱动器,在本例中,因为我们在 Kubernetes 上,节点或服务器转换为 Pod,而每个服务器上的驱动器转换为每个 Pod 的 PVC。
我还从 1TiB 的容量开始,但您可以随时 扩展租户的容量。

让我们转到 身份提供者 并创建一个将被 Kubeflow 使用的基本用户。如果您选择配置使用 OpenID 或 Active Directory/LDAP 的 外部身份提供者,您只需在登录租户后创建服务帐户即可。

最后,我们将禁用 TLS,只是为了避免本博文变得太长,但如果您希望在租户上启用 TLS,则需要在 Kubeflow 信任的租户上配置证书。

就是这样,只需点击 创建,租户将在几分钟内创建。


就是这样,现在您拥有一个分布式、高性能、超大规模的对象存储,可以无限扩展。从这里,让我们配置 Kubeflow 以使用此 MinIO 部署。
设置 Kubeflow
在本节中,我们将从头开始在 Kubernetes 上设置 Kubeflow。这适用于内部部署、开发环境或任何公共云,尽管云提供商通常提供预配置的 Kubeflow 版本。
我们将使用 kubeflow/manifest 存储库。请记住,要使此方法生效,有一些严格的要求,例如,Kubeflow 1.5.0(撰写本文时)支持的最高 Kubernetes 版本为 1.21,因此请确保您使用的是满足此要求的 Kubernetes 集群。
另一个要求是拥有 Kustomize 版本 3.2.0,仅此而已。
让我们从克隆 kubeflow/manifest 存储库开始
git clone https://github.com/kubeflow/manifests |

然后更改目录到 manifest 文件夹并运行以下命令
cd manifests while ! kustomize build example | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done |
此命令将花费几分钟来安装 Kubeflow 所需的所有资源。如果任何资源无法应用,则该命令将继续尝试应用它,直到完全成功为止。

几分钟后,您可以确认 kubeflow 命名空间中的所有 Pod 都已启动并运行
kubectl -n kubeflow get pods |

现在我们将配置 Kubeflow 以使用我们的新 MinIO。
以下部分是连接 Kubeflow 和 MinIO 的核心。请注意,本节中需要修改的资源也是您从现有 Kubeflow 部署开始时需要调整的资源。
我们首先将在 kubeflow 命名空间中编辑各种配置映射、秘密和部署,然后在任何现有的用户命名空间中进行编辑。
所有这些步骤都假设 MinIO 在 ns-1 命名空间中运行,并在端口 80 上运行。如果您使用 TLS 运行租户,则将使用端口 443。
租户 URL:minio.ns-1.svc.cluster.local
租户端口:80
编辑配置映射
pipeline-install-config
编辑 pipeline-install-config 配置映射,并将以下字段添加到 .data 中
minioServiceHost: minio.ns-1.svc.cluster.local minioServicePort: "80" |
编辑命令
kubectl -n kubeflow edit cm pipeline-install-config |
workflow-controller-configmap
编辑配置映射 workflow-controller-configmap,并将 s3 部分中的 endpoint 字段配置为指向您的租户
s3: endpoint: "minio.ns-1.svc.cluster.local:80" |
使用此命令编辑配置映射
kubectl -n kubeflow edit cm workflow-controller-configmap |
ml-pipeline-ui-configmap
编辑 ml-pipeline-ui-configmap 配置映射,并将 viewer-pod-template.json 的 json 内容替换为以下 json
{ "spec": { "containers": [ { "env": [ { "name": "AWS_ACCESS_KEY_ID", "valueFrom": { "secretKeyRef": { "name": "mlpipeline-minio-artifact", "key": "accesskey" } } }, { "name": "AWS_SECRET_ACCESS_KEY", "valueFrom": { "secretKeyRef": { "name": "mlpipeline-minio-artifact", "key": "secretkey" } } }, { "name": "AWS_REGION", "valueFrom": { "configMapKeyRef": { "name": "pipeline-install-config", "key": "minioServiceRegion" } } } ] } ] } } |
使用此命令编辑配置映射
kubectl -n kubeflow edit cm ml-pipeline-ui-configmap |
确保 json 的缩进结构与现有格式相匹配。

编辑秘密
我们将更新保存 MinIO 凭据的秘密,但是这些凭据应该是 base64 编码的,因此您可以使用 shell 对它们进行编码
echo -n "kubeflow" | base64 echo -n "kubeflow123" | base64 |

mlpipeline-minio-artifact
编辑秘密 mlpipeline-minio-artifact,并在 .data 字段中设置以下值
data: accesskey: a3ViZWZsb3c= secretkey: a3ViZWZsb3cxMjM= |
使用此命令编辑配置映射
kubectl -n kubeflow edit secret mlpipeline-minio-artifact |
编辑部署
我们现在将最后编辑部署以导致 Pod 重启并准备好所有内容。
ml-pipeline-ui
编辑ml-pipeline-ui 部署并添加以下环境变量
- name: AWS_ACCESS_KEY_ID valueFrom: secretKeyRef: name: mlpipeline-minio-artifact key: accesskey - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: mlpipeline-minio-artifact key: secretkey - name: MINIO_NAMESPACE - name: MINIO_HOST value: minio.ns-1.svc.cluster.local - name: MINIO_PORT value: "80" |
注意:确保编辑 MINIO_NAMESPACE 环境变量使其为空,这至关重要,因为该环境变量已存在于部署中。
使用以下命令编辑 configmap
kubectl -n kubeflow edit deployment ml-pipeline-ui |
ml-pipeline
编辑ml-pipeline 部署并添加以下环境变量
- name: OBJECTSTORECONFIG_HOST valueFrom: configMapKeyRef: name: pipeline-install-config key: minioServiceHost - name: OBJECTSTORECONFIG_PORT value: "80" |
使用以下命令编辑部署
kubectl -n kubeflow edit deployment ml-pipeline |
这也很重要,对于每个用户命名空间,请修补该命名空间中的ml-pipeline-ui-artifact 部署和工件密钥。例如,在我的情况下,我的命名空间是kubeflow-user-example-com,因为我们使用了示例清单。
编辑秘密 mlpipeline-minio-artifact,并在 .data 字段中设置以下值
data: accesskey: a3ViZWZsb3c= secretkey: a3ViZWZsb3cxMjM= |
编辑 ml-pipeline-ui-artifact 并添加以下环境变量
- name: MINIO_NAMESPACE - name: MINIO_HOST value: minio.ns-1.svc.cluster.local - name: MINIO_PORT value: "80" |
使用以下命令编辑工件
kubectl -n kubeflow-user-example-com edit secret mlpipeline-minio-artifact kubectl -n kubeflow-user-example-com edit deployment ml-pipeline-ui-artifact |
此时,Kubeflow 已正确配置为使用您的租户。只剩下最后一步,然后我们就可以测试我们的部署。
将所有数据从 Kubeflow 的内部 MinIO 迁移到新的租户
现在我们已经配置了所有内容,我们只需要确保 Kubeflow 预计在其存储桶中存在的数据确实存在。让我们将这些数据复制过来,然后关闭我们将要替换的内部 MinIO。
为了实现这一点,我们将使用 MinIO 客户端 (mc),这是一个用于管理 MinIO 的 CLI 工具。我们将从 Kubernetes 中运行的 pod 中执行所有这些操作,但如果您愿意,也可以通过端口转发并从您自己的机器上使用 mc 来执行。
让我们运行一个带有 Ubuntu shell 的 pod
kubectl -n kubeflow run my-shell -i --tty --image ubuntu -- bash |

此 shell 运行在 Kubeflow 命名空间中 Kubernetes 集群内运行的 pod 上。
现在我们将
- 安装 wget
- 下载 mc
- 使 mc 可执行
- 向当前 MinIO 添加别名
- 向新的 MinIO 添加别名
- 复制所有数据
为了实现这一点,我们运行以下命令
apt update && apt install -y wget wget https://dl.min.io/client/mc/release/linux-amd64/mc chmod +x mc mv mc /usr/local/bin/ mc config host add kubeflow http://minio-service.kubeflow.svc.cluster.local:9000 minio minio123 mc config host add tenant http://minio.ns-1.svc.cluster.local kubeflow kubeflow123 mc mirror kubeflow tenant
|
最后,关闭内部 MinIO,因为它不再需要。
kubectl -n kubeflow scale deploy minio --replicas=0 |
好了!我们完成了迁移到完整的 MinIO 部署。
验证 Kubeflow 是否正在使用新的 MinIO
接下来我们将验证设置并运行一些管道。
如果转到 MinIO 运算符,您会看到租户现在有数据

单击租户,然后单击浏览器窗口右上角的 **控制台** 以打开 MinIO 控制台,以便浏览该租户。

从这个视图中,您可以看到 **mlpipeline** 存储桶。单击浏览以查看其内容。

您将看到现有的演示管道已复制过来。

现在让我们进入 Kubeflow 并运行一些管道,您可以使用端口转发来公开 Kubeflow 中央仪表板
kubectl port-forward svc/istio-ingressgateway -n istio-system 8080:80 |
然后在您的浏览器中转到 https://127.0.0.1:8080.

使用此示例设置的默认凭据登录
电子邮件地址: user@example.com
密码 12341234

然后转到左侧菜单栏中的管道菜单。我们将运行最基本的管道,“[教程] DSL - 控制结构”。

单击管道名称。

从这里,单击右上角的创建实验。这将创建一个新的实验,因为这是它第一次运行,但在随后您可以重新使用此实验。

然后单击开始。

运行完成后,探索管道以验证它是否成功运行。


Kubeflow 和 MinIO 用于多云机器学习
这篇博文教您如何将随 Kubeflow 提供的 MinIO 替换为 MinIO 运算符。您现在已准备好将您的 Kubeflow 使用提升到一个新的水平,并以 Kubernetes 原生的高性能和高度可扩展的 MinIO 对象存储为其提供支持。
在机器学习管道和基础设施方面,使用 MinIO 的 生命周期管理 部署由超快 NVMe 驱动器支持的租户作为您的热点层,用于快速训练和模型服务,并且还设置一个由 SSD 或 HDD 支持的暖层,用于您的老化数据集。MinIO 透明地执行此操作,不会中断您的应用程序。分层在每个存储桶的基础上配置,甚至可以为存储桶内的单个前缀配置,从而提供对将哪些数据移动到较慢的层的细粒度控制。
借助 MinIO 的 主动-主动复制,您可以配置为生产机器学习模型提供服务的存储桶,以便立即复制到多个站点,以实现灾难恢复和快速故障转移。
我真诚地希望这篇博文能帮助您发现如何在 Kubernetes 上轻松设置 MinIO 对象存储以及如何在 Kubeflow 中使用它。如果您有任何疑问,请加入我们的 Slack 社区 并提出问题!