实战,在Kubeflow中启动Jupyter notebook

今天装好了Kubeflow,准备玩一个E2E的case。 按照Kubeflow的设计,它拥有全生命周期的ML/DL的开发和部署,也就是说囊括了

模型编写 --- 模型训练 — 超参搜索 — infrerence部署等全流程的支持,我决定试一试,当然从第一部开始,代码编写,现在看起来,这个开端并不容易!

在kubeflow中对于代码编写提供了业内最为著名的在线类IDE:Jupyter Nodebook的多用户版本Jupyter Hub, 使用随便一个名字登录后见下图:

看起来是要求Spawn一个盖用户自己使用的Server,事实上也是如此, 会在k8s中新建一个名为jupyter-${username}的pod。

我选择了默认配置,直接点击Spawn, 糟糕的事情发生了,页面一直卡着如下图:

别等了,放任不管的话会卡30min,别问我怎么知道的。

这时候我们查看k8s中的pod:

可以看到新建的pod状态为pending

用describe看看:

扫描二维码关注公众号,回复: 5514155 查看本文章

看起来跟PVC有关系哈,查查PVC

确实有一个pvc在pending状态,也能理解,Jupyter Nodebook是需要存储用户代码的,所以建立pvc应该是再正常不过了,可是为啥penging呢,

用describe

得到的错误是没有pv并且没设storageclasses,按照k8s的定义,如果pvc没有设置storageclass,那么将按照dynamic provision的设置对待,具体来说是寻找default storageclass。

那么坏了,我的k8s环境压根没default storageclass,赶紧建个:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local
  annotations:
    storageclass.beta.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

光有Storageclass没有响应的PV也不成啊,再建个PV

kind: PersistentVolume
apiVersion: v1
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: local
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

搞好了这一切我们重新换个用户重新Spawn

这次看起来蛮好,但是pod仍然是pending,查了查原因,居然说”jovyan”这个用户没有权限!jovyan是个什么鬼,赶紧查了查,在Spawn前的高级选线中发现了玄机:

感情这是个内置的用户啊,在我新建的PV中没权限啊,赶紧把PV的路径/mnt/data付了777权限,发现,成了!

下面是我解决问题参考的页面:

https://github.com/kubeflow/kubeflow/issues/2076

https://github.com/kubeflow/kubeflow/pull/469

https://github.com/kubeflow/kubeflow/issues/365

猜你喜欢

转载自blog.csdn.net/pushme_pli/article/details/88524393