kubeflow 机器学习的工具集,包含Notebook(交互实验)、AutoML(自动化处理)、Pipeline(流水线)、Serverless(部署)。
由于是google自己的产品开源,很多组建依赖于google,即国内不友好。这里推荐一个国内的解决方案(https://github.com/shikanon/kubeflow-manifests/)。
kind 工具安装集群
安装kind
kind是搭建本地k8s集群的工具,主要用来测试k8s,安装kind可以使用release binary方式:
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.14.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
创建集群
kind create cluster --config=kind/kind-config.yaml --name=kubeflow --image=kindest/node:v1.19.11
先拉取shikanon/kubeflow-manifests
,在代码根目录执行该语句,config对应文件kind/kind-config.yaml便是在这里
image版本很重要,由于这里是kubeflow1.3,测试来看最新版本是不可取的,1.19.4以下创建集群不成功。否则会出现CrashLoopBackOff的pod,提示莫名的问题。如果有类似问题,先尝试切换版本。
kind delete cluster --name kubeflow
下载新版本的时候,清除资源可以使用该语句。如果硬盘资源有限可以使用docker rmi
删除多余镜像。
常规排查问题手段
kubectl get pods -A
kubectl logs {pod} -n kubeflow
kubectl describe pod|describe
kubectl rollout restart deploy {deploy} -n kubeflow # 重启deploy
kubectl get secret mysql-secret -n kubeflow -o jsonpath='{.data}' # 获取secret
调试部分资源可截取部分yaml文件,先delete后apply
解决方案简介
该解决方案将所有的清单中的镜像地址替换为了阿里云,并做了辅助脚本以及个性化设置。如果有定制化需求,可以修改对应的yaml文件,自行apply
- install.py文件
定义了两个方法install
和patchInstall
,主要是迭代读取对应目录下的yaml文件,挨个apply(patch会先delete)
python install.py
执行完该语句,等待20分钟左右,如果都running状态即成功,直接方案30000端口即可。
- manifest1.3目录
kubeflow所有依赖组件的yaml文件组合。install
方法既是读取该文件下的所有文件,挨个apply。安装过程中遇到问题,可以回溯到该目录,查看对应的文件。
- patch目录
一些自定义化设置,包括一些问题的fixed。比如auth.yaml
文件添加修改用户,同时可以按照自己需求修改默认的命名空间,替换kubeflow-admin-example-com
为自己的名字,记得必须以kubeflow-
为前缀,否则会在前端显示没有namespace
。
后续问题
- run创建pod的时候describe发现问题
MountVolume.SetUp failed for volume "mlpipeline-minio-artifact" : secret "mlpipeline-minio-artifact" not found
命名空间的问题,将命名空间kubeflow替换为自己的命名空间(我修改为了kubeflow-admin) 解决办法
kubectl get secret mlpipeline-minio-artifact --namespace=kubeflow -o yaml | sed 's/namespace: kubeflow/namespace: kubeflow-admin/' | kubectl create -f -
- pipeline运行报错
这个错误是由于 kind 集群创建的 k8s 集群容器运行时用的containerd,而workflow默认的pipeline执行器是docker,因此有些特性不兼容。如果你的 k8s 集群是自己基于docker runtime 搭建的,可以将patch/workflow-controller.yaml的containerRuntimeExecutor改为docker,这样就不存在兼容性问题了。 详见 方案文档
- notebook pod 无root权限
jupyter-web-app pod是负责管理 notebook-server接口的提供者,使用flask实现的,并用/usr/local/bin/gunicorn
向外提供服务。
kubectl exec -it jupyter-web-app-deployment-{序号} -n kubeflow -- bash
可以连接到pod中的容器中
编辑容器中apps/common/yaml/notebook_template.yaml
,添加
securityContext:
runAsUser: 0
runAsGroup: 0
fsGroup: 0
然后重新添加一个notebook server,通过terminal进去,便可以发现是root用户,可以通过apt安装自己想要的组建。
我是安装tfx,需要gcc g++, 通过执行apt install gcc g++
便解决了。
- kfp client 403
Internal error: Unauthenticated: Request header error: there is no user identity header.: Request header error: there is no user identity header
这些报错是请求的时候缺少header头,可以通过附加认证策略来解决
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: bind-ml-pipeline-nb-kubeflow-admin
namespace: kubeflow
spec:
selector:
matchLabels:
app: ml-pipeline
rules:
- from:
- source:
principals: ["cluster.local/ns/kubeflow-admin/sa/default-editor"]
--
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: add-header
namespace: kubeflow-admin
spec:
configPatches:
- applyTo: VIRTUAL_HOST
match:
context: SIDECAR_OUTBOUND
routeConfiguration:
vhost:
name: ml-pipeline.kubeflow.svc.cluster.local:8888
route:
name: default
patch:
operation: MERGE
value:
request_headers_to_add:
- append: true
header:
key: kubeflow-userid
value: admin@example.com
workloadSelector:
labels:
notebook-name: test999
如果将workloadSelector
去掉,那么会应用于所有的notebook 详见 issue
- kfp cli命令提示 token文件缺失
Failed to read a token from file '/var/run/secrets/kubeflow/pipelines/token'
通过describe pod会发现/run/secrets/kubernetes.io/serviceaccount/token
这个是真是的token文件,所以只要
export KF_PIPELINES_SA_TOKEN_PATH=token文件即可
, 或者配置poddefault配置,详见 issue
client = kfp.Client()
client.create_run_from_pipeline_package(pipeline_file='{yaml文件}', arguments={},experiment_name="{实验名称}", namespace="{命名空间}")
执行结果会列出对应的 run
的链接。
引用
https://github.com/shikanon/kubeflow-manifests/ https://hub.docker.com/r/kindest/node/tags?page=1&name=v1.19 kind镜像版本 https://github.com/argoproj/argo-workflows argo workflow https://github.com/kubeflow/pipelines kubeflow