吃不上鱼的dj猫

明月如镜 高悬草原映照千年岁月


  • 首页

  • 技术

  • 感想

  • 笔记

  • 归档

  • 关于

  • 搜索
close

kind上安装kubeflow(国内镜像源)

时间: 2022-08-31   |   分类: technical     |   阅读: 2131 字 ~5分钟

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

#运维#
mysql执行计划命令explain的输出解释
Laravel 消息队列源码分析
  • 文章目录
  • 站点概览
D&J

D&J

程序员

27 日志
3 分类
17 标签
GitHub
  • kind 工具安装集群
    • 安装kind
    • 创建集群
  • 解决方案简介
  • 后续问题
  • 引用
© 2009 - 2024 吃不上鱼的dj猫
Powered by - Hugo v0.124.0
Theme by - NexT 沪ICP备14008426号-3
0%