KubeFlow 是一个开源的项目,旨在为 Kubernetes 提供可组合、便携式、可扩展的机器学习技术栈。它最初是为了解决在 Kubernetes 上运行分布式机器学习任务所带来的挑战而创建的。Kubernetes 本身是一个容器平台,但在近年来,越来越多的公司开始用它来运行各种工作负载,特别是机器学习任务。由于分布式机器学习任务通常需要不同的参数服务器(PS)和工作节点(worker),并且不同领域的学习任务对 PS 和 worker 有不同的需求,因此 Kubernetes 在处理机器学习任务时存在一些困难。
KubeFlow 的核心组件是 TFJob,它是一个 Kubernetes 资源类型,用于定义 TensorFlow 作业。使用 TFJob,机器学习工程师可以按照他们对业务的理解,确定 PS 与 worker 的个数以及数据与日志的输入输出,而不需要编写繁杂的配置。KubeFlow 还提供了许多其他功能,如作业调度、多租户、网络隔离等,以简化机器学习任务在 Kubernetes 上的部署和管理。KubeFlow 的目标是让机器学习任务在 Kubernetes 上变得简单、可靠、可扩展和高效。
注意事项
- 默认情况下Kubernetes环境需要提供StorageClass:local-storage
- 国内环境拉取镜像失败可以增加前缀 (推荐方式) gcr.io/ml-pipeline/metadata-envoy:2.0.0-alpha.7 => m.daocloud.io/gcr.io/ml-pipeline/metadata-envoy:2.0.0-alpha.7,手动拉取之后重新打TAG
- 从 Kubeflow 1.3 开始,所有组件都只能使用 kustomize 进行部署。
- kustomize 5.0.0
官方文档:GitHub - kubeflow/manifests at v1.7.0
方法一:一键部署命令
- 测试环境信息:
- CentOS Linux release 7.8.2003 (Core)
- Kubernetes v1.26.0 (官方文档提示支持1.24/1.25)
- Kubernetes网络组件: calico
https://github.com/kubeflow/manifests/tree/v1.7.0
下载并解压
tar -zxvf manifests-1.7.0.tar.gz
cd manifests-1.7.0
while ! kustomize build example | awk '!/well-defined/' | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done
方法二:组件逐步安装
- 仅使用 kubectl 和 kustomize 分别安装每个 Kubeflow 官方组件(在 apps 下)和每个公共服务(在 common 下)
- kubectl apply 命令可能在第一次尝试时失败。这是 Kubernetes 和 kubectl 工作方式所支持的(例如,CR 必须在 CRD 准备就绪后创建)。解决方案是简单地重新运行该命令,直到成功为止。对于一键部署命令,包含了一个 bash 单行命令”awk '!/well-defined/“来重试该命令。
cert-manager
Kubeflow 组件使用 cert-manager 来为准入 Webhooks 提供证书。
Install cert-manager:
kustomize build common/cert-manager/cert-manager/base | kubectl apply -f -
kubectl wait --for=condition=ready pod -l 'app in (cert-manager,webhook)' --timeout=180s -n cert-manager
kustomize build common/cert-manager/kubeflow-issuer/base | kubectl apply -f -
如果出现如下错误:
Error from server (InternalError): error when creating "STDIN": Internal error occurred: failed calling webhook "webhook.cert-manager.io": failed to call webhook: Post "https://cert-manager-webhook.cert-manager.svc:443/mutate?timeout=10s": dial tcp 10.96.202.64:443: connect: connection refused
这是因为 webhook 尚未准备好接收请求。等待几秒钟,然后重试应用清单。
Istio
Kubeflow 组件使用 Istio 来保护其流量、强制网络授权和实施路由策略。
Install Istio:
kustomize build common/istio-1-16/istio-crds/base | kubectl apply -f -
kustomize build common/istio-1-16/istio-namespace/base | kubectl apply -f -
kustomize build common/istio-1-16/istio-install/base | kubectl apply -f -
Dex
Dex 是一个具有多个身份验证后端的 OpenID Connect Identity (OIDC)。在此默认安装中,它包括一个电子邮件地址为 user@example.com 的静态用户。默认情况下,用户的密码为 12341234。对于任何生产 Kubeflow 部署,您应该按照相关部分更改默认密码。
Install Dex:
kustomize build common/dex/overlays/istio | kubectl apply -f -
OIDC AuthService
OIDC AuthService 扩展了您的 Istio Ingress-Gateway 功能,使其能够充当 OIDC 客户端:
kustomize build common/oidc-authservice/base | kubectl apply -f -
Knative
Knative 由 KServe 官方 Kubeflow 组件提供。
Install Knative Serving:
kustomize build common/knative/knative-serving/overlays/gateways | kubectl apply -f -
kustomize build common/istio-1-16/cluster-local-gateway/base | kubectl apply -f -
或者,您可以安装 Knative Eventing,它可用于推理请求日志记录:
kustomize build common/knative/knative-eventing/base | kubectl apply -f -
Kubeflow 命名空间
创建 Kubeflow 组件所在的命名空间。该命名空间名为 kubeflow。
install kubeflow namespace:
kustomize build common/kubeflow-namespace/base | kubectl apply -f -
Kubeflow Roles
创建 Kubeflow ClusterRoles、kubeflow-view、kubeflow-edit 和 kubeflow-admin。 Kubeflow 组件将权限聚合到这些 ClusterRoles。
Install kubeflow roles:
kustomize build common/kubeflow-roles/base | kubectl apply -f -
Kubeflow Istio Resources
创建 Kubeflow 所需的 Istio 资源。此 kustomization 当前在命名空间 kubeflow 中创建一个名为 kubeflow-gateway 的 Istio 网关。
Install istio resources:
kustomize build common/istio-1-16/kubeflow-istio-resources/base | kubectl apply -f -
Kubeflow Pipelines
安装多用户 Kubeflow Pipelines 官方 Kubeflow 组件:
kustomize build apps/pipeline/upstream/env/cert-manager/platform-agnostic-multi-user | awk '!/well-defined/' | kubectl apply -f -
不要再使用已弃用且不安全的 PNS 执行器
kustomize build apps/pipeline/upstream/env/platform-agnostic-multi-user-pns | kubectl apply -f -
KServe
KFServing 更名为 KServe。
Install the KServe component:
kustomize build contrib/kserve/kserve | kubectl apply -f -
Install the Models web app:
kustomize build contrib/kserve/models-web-app/overlays/kubeflow | kubectl apply -f -
../contrib/kserve/models-web-app/overlays/kubeflow
Katib
Install the Katib official Kubeflow component:
kustomize build apps/katib/upstream/installs/katib-with-kubeflow | kubectl apply -f -
Central Dashboard
Install the Central Dashboard official Kubeflow component:
kustomize build apps/centraldashboard/upstream/overlays/kserve | kubectl apply -f -
Admission Webhook
Install the Admission Webhook for PodDefaults:
kustomize build apps/admission-webhook/upstream/overlays/cert-manager | kubectl apply -f -
Notebooks
Install the Notebook Controller official Kubeflow component:
kustomize build apps/jupyter/notebook-controller/upstream/overlays/kubeflow | kubectl apply -f -
Install the Jupyter Web App official Kubeflow component:
kustomize build apps/jupyter/jupyter-web-app/upstream/overlays/istio | kubectl apply -f -
Profiles + KFAM
Install the Profile Controller and the Kubeflow Access-Management (KFAM) official Kubeflow components:
kustomize build apps/profiles/upstream/overlays/kubeflow | kubectl apply -f -
Volumes Web App
Install the Volumes Web App official Kubeflow component:
kustomize build apps/volumes-web-app/upstream/overlays/istio | kubectl apply -f -
Tensorboard
Install the Tensorboards Web App official Kubeflow component:
kustomize build apps/tensorboard/tensorboards-web-app/upstream/overlays/istio | kubectl apply -f -
Install the Tensorboard Controller official Kubeflow component:
kustomize build apps/tensorboard/tensorboard-controller/upstream/overlays/kubeflow | kubectl apply -f -
Training Operator
Install the Training Operator official Kubeflow component:
kustomize build apps/training-operator/upstream/overlays/kubeflow | kubectl apply -f -
User Namespace
Finally, create a new namespace for the the default user (named kubeflow-user-example-com).
kustomize build common/user-namespace/base | kubectl apply -f -
安装后,所有Pod都需要一段时间才能准备就绪。在尝试连接之前,请确保所有Pod都已准备好,否则可能会出现意外错误。要检查所有与Kubeflow相关的Pod是否已就绪,请使用以下命令:
kubectl get pods -n cert-manager
kubectl get pods -n istio-system
kubectl get pods -n auth
kubectl get pods -n knative-eventing
kubectl get pods -n knative-serving
kubectl get pods -n kubeflow
kubectl get pods -n kubeflow-user-example-com
访问 Kubeflow 的默认方式是通过端口转发。这使您能够快速入门,而不会对您的环境提出任何要求。运行以下命令将 Istio 的 Ingress-Gateway 端口转发到本地端口 80
kubectl port-forward svc/istio-ingressgateway -n istio-system 80:80 --address 192.168.61.29
也可以通过ingress 暴露域名访问或Nginx反向代理访问,建议使用https访问后续创建Notebooks容器组会报错。
一切就绪,您就可以访问Kubeflow Central Dashboard。
默认用户名/密码:user@example.com/12341234
修改密码
####### 注:一般在部署之前调整或部署 Dex之前调整
为默认用户user@example.com修改密码,使用bcrypt对密码进行哈希
python3 -c 'from passlib.hash import bcrypt; import getpass; print(bcrypt.using(rounds=12, ident="2y").hash(getpass.getpass()))'
编辑common/dex/base/config-map.yaml,用上面生产的密码哈希值填充相关字段:
...
staticPasswords:
- email: user@example.com
hash: <enter the generated hash here>