如何使用 MinIO Operator 安装和配置 Kubeflow

如何使用 MinIO Operator 安装和配置 Kubeflow

Kubeflow 是一种现代解决方案,可使用最新和最流行的框架来设计、构建和编排机器学习管道。开箱即用,Kubeflow 内部随附 MinIO 以存储其所有管道、工件和日志,但是 MinIO 仅限于单个 PVC,因此无法受益于分布式 MinIO 为表带来的所有功能,例如 Active- Active复制,通过分层无限存储- 等等。

在这篇博文中,我们将配置 Kubeflow 以在同一 Kubernetes 集群上使用大型 MinIO 租户,但当然,此配置也适用于位于不同集群上的 Kubeflow 和 MinIO。如需参考,请参阅我们之前的博文,在 Azure 上使用 Kubeflow 和 MinIO 的机器学习管道,以及Kubeflow站点。  

虽然我们在这篇博文中进行了详细介绍,但如果您已经有 Kubeflow 设置和 MiniO 设置,您可以直接跳到这篇博文的配置 Kubeflow部分以查看需要配置的内容。

设置 MinIO 操作员

让我们从安装 MinIO Operator 并创建 Kubeflow 将使用的租户开始。我最喜欢的安装 MinIO Operator 的方法是 via,kubectl apply -k但我们也有可用的 Helm Charts,我们也可以在AWS MarketplaceGoogle Cloud MarketplaceAzure Marketplace上使用。

kubectl apply -k github.com/minio/operator/


Screen Shot 2022-04-13 at 9.27.30 AM.png


这将安装最新最好的 MinIO Operator,现在我们只需要登录到 Operator 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 ""


Screen Shot 2022-04-13 at 9.33.29 AM.png


现在让我们转发 UI 和登录。

kubectl -n minio-operator port-forward svc/console 9090


Screen Shot 2022-04-13 at 9.34.11 AM.png


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


Screen Shot 2022-04-13 at 9.35.23 AM.png


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


Screen Shot 2022-04-13 at 9.36.12 AM.png


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


Screen Shot 2022-04-13 at 9.36.33 AM.png


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


Screen Shot 2022-04-13 at 9.36.35 AM.png


现在让我们确定租户的大小。我将设置一个4 节点集群,每个节点上有 4 个驱动器,在这种情况下,因为我们在 Kubernetes 上,节点或服务器转换为 pod,每个服务器的驱动器转换为每个 pod 的 PVC。

我也从 1TiB 的容量开始,但您始终可以扩展租户的容量


Screen Shot 2022-04-13 at 9.37.17 AM.png


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


Screen Shot 2022-04-13 at 9.37.35 AM.png


最后,我们将禁用TLS只是为了防止这篇博文变得太长,但是如果你想在你的租户上启用 TLS,你需要在 Kubeflow 信任的租户上配置一个证书。


Screen Shot 2022-04-13 at 9.37.42 AM.png


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


Screen Shot 2022-04-13 at 9.47.34 AM (1).png
Screen Shot 2022-04-13 at 9.37.52 AM.png


就是这样,现在您拥有了一个可以无限扩展的分布式、高性能、超大规模对象存储。从这里开始,让我们配置 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


Screen Shot 2022-04-13 at 9.58.03 AM.png


然后更改清单文件夹的目录并运行以下命令:

cd manifests
while ! kustomize build example | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done


此命令将花费几分钟时间来安装 Kubeflow 所需的所有资源。如果有任何应用失败,该命令将继续尝试应用它直到完全成功。


Screen Shot 2022-04-13 at 9.59.25 AM.png


几分钟后,您可以确认kubeflow命名空间中的所有 pod 都已启动并正在运行:

kubectl -n kubeflow get pods


Screen Shot 2022-04-13 at 10.03.48 AM.png


现在我们将配置 Kubeflow 以使用我们的新 MinIO。

配置 Kubeflow

以下部分是连接Kubeflow和MinIO的核心。请注意,如果您从现有的 Kubeflow 部署开始,本节中需要修改的资源也是您需要调整的资源。

我们将首先在kubeflow命名空间上编辑各种 Config Maps、Secrets 和 Deployment ,然后再在任何现有的用户命名空间上编辑。

所有这些步骤都假设 MinIO 在ns-1命名空间中运行并在端口80上运行。如果您使用 TLS 运行租户,您将使用端口 443。

租户 URL:minio.ns-1.svc.cluster.local

租户端口:80

编辑配置图

管道安装配置

编辑pipeline-install-config配置映射并将以下字段添加到.data

minioServiceHost: minio.ns-1.svc.cluster.local
minioServicePort: "80"

编辑命令:

kubectl -n kubeflow edit cm pipeline-install-config

工作流控制器配置映射

编辑 configmap workflow-controller-configmap并将s3部分内的端点字段配置为指向您的租户

s3:
      endpoint: "minio.ns-1.svc.cluster.local:80"

使用此命令编辑 configmap:

kubectl -n kubeflow edit cm workflow-controller-configmap

ml-pipeline-ui-configmap

编辑ml-pipeline-ui-configmap 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"
              }
            }
          }
        ]
      }
    ]
  }
}

使用此命令编辑 configmap:

kubectl -n kubeflow edit cm ml-pipeline-ui-configmap

确保 json 的缩进结构与现有格式匹配。


Screen Shot 2022-04-13 at 10.28.58 AM.png


编辑秘密

我们将更新保存 MinIO 凭据的秘密,但是这些是base64编码的,因此您可以使用 shell 对它们进行编码:

echo -n "kubeflow" | base64
echo -n "kubeflow123" | base64 


Screen Shot 2022-04-13 at 10.32.14 AM.png


mlpipeline-minio-工件

编辑秘密mlpipeline-minio-artifact并在.data字段中设置这些值

data:
  accesskey: a3ViZWZsb3c=
  secretkey: a3ViZWZsb3cxMjM=

使用此命令编辑 configmap:

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部署并添加以下环境变量:

- 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 Client (mc),这是一个用于管理 MinIO 的 CLI 工具。我们将从 Kubernetes 中运行的 pod 执行所有这些操作,但如果您选择这样做,您可以通过端口转发和使用您自己机器上的 mc 来执行此操作。

让我们用 Ubuntu shell 运行一个 pod:

kubectl -n kubeflow run my-shell  -i --tty --image ubuntu -- bash


Screen Shot 2022-04-13 at 10.53.00 AM.png


该 shell 在 Kubeflow 命名空间中的 Kubernetes 集群内运行的 pod 上运行。

现在我们将:

  1. 安装wget

  2. 下载MC

  3. 使mc可执行

  4. 为当前的 MinIO 添加一个别名

  5. 为新的 MinIO 添加别名

  6. 复制所有数据

为此,我们运行以下命令:

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 Operator,你可以看到租户现在有数据:


Screen Shot 2022-04-13 at 10.58.48 AM.png


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


Screen Shot 2022-04-13 at 10.59.04 AM.png


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


Screen Shot 2022-04-13 at 10.59.18 AM.png


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


Screen Shot 2022-04-13 at 11.00.07 AM.png


现在让我们进入 Kubeflow 并运行一些管道,您可以使用端口转发来公开 Kubeflow 中央仪表板:

kubectl port-forward svc/istio-ingressgateway -n istio-system 8080:80

然后在浏览器中转到http://localhost:8080


Screen Shot 2022-04-13 at 11.02.37 AM.png


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

密码: 12341234


Screen Shot 2022-04-13 at 11.03.19 AM.png


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


Screen Shot 2022-04-13 at 11.04.13 AM.png


单击管道的名称。


Screen Shot 2022-04-13 at 11.04.23 AM.png


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


Screen Shot 2022-04-13 at 11.05.41 AM.png


然后点击开始:


Screen Shot 2022-04-13 at 11.05.58 AM.png


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


Screen Shot 2022-04-13 at 11.11.22 AM.png
Screen Shot 2022-04-13 at 11.37.23 AM.png


用于多云机器学习的 Kubeflow 和 MinIO

这篇博文教您如何用 MinIO Operator 替换 Kubeflow 附带的 MinIO。您现在已准备好将 Kubeflow 的使用提升到一个新的水平,并使用 Kubernetes 原生高性能和高度可扩展的 MinIO 对象存储来支持它。

在机器学习管道和基础设施方面,使用 MinIO 的生命周期管理部署由超快 NVMe 驱动器支持的租户作为您的热层以进行快速训练和模型服务,并设置一个由 SSD 或 HDD 支持的暖层以供您老化数据集。MinIO 在不中断您的应用程序的情况下透明地执行此操作。分层是在每个存储桶的基础上配置的,甚至是针对存储桶中的单个前缀配置的,从而提供对将哪些数据移动到较慢的层的精细控制。

使用 MinIO 的Active-Active Replication,您可以将服务于生产机器学习模型的存储桶配置为跨多个站点即时复制,以实现灾难恢复和快速故障转移。

我真心希望这篇博文能帮助您发现在 Kubernetes 上设置 MinIO 对象存储并使用 Kubeflow 使用它是多么容易。如果您有任何问题,请加入我们的Slack 社区并提问!


上一篇 下一篇