目录
1、jupyter-notebook未指定存储位置,缺少存储空间
2、手动为Jupyter创建PV和PVC
2.1 创建PV(前提:nfs挂载已经配置成功)
2.2 创建PVC
2.3 拉取官方的jupyter镜像,下载源为阿里云
3、自动创建PV
3.1 StorageClass的概念和作用
3.2 创建nfs provisioner
3.3 创建storageClass
3.4 新建jupyter任务
刚开始使用jupyter notebook,点击【+NEW SERVER】按钮,弹出的页面会出现如下报错:
No default Storage Class is set. Can’t create new Disks for the new Notebook
简单说明一下该页面的内容
我们使用过jupyter-notebook的都知道,jupyter的代码文件,数据在本地需要一个存储位置,所以在创建一个新的jupyter任务,即创建一个pod之前,要为其准备好一个pv及其pvc,我们先手动创建一下。
jupyter-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: jupyter-pv
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage #指定存储类型名称,在创建PVC时可以指定这个名称
local:
path: /nfs/data/myfilesystem/ #改成你的目录地址
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname #使用hostname指定pv挂载的节点
operator: In
values:
- k8snode02 #pv挂载的节点
执行yaml文件
[root@k8snode01 ~]# kubectl apply -f jupyter-pv.yaml
persistentvolume/jupyter-pv created
[root@k8snode01 ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
jupyter-pv 5Gi RWO Delete Available local-storage 109s
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jupyter-pvc
namespace: machinelearning #指定pvc所属的命名空间
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 5Gi
storageClassName: local-storage #指定存储类型名称,即指向我们刚刚创建的PV
执行yaml文件
[root@k8snode01 jupyter3]# kubectl apply -f jupyter-pvc.yaml
persistentvolumeclaim/jupyter-pvc created
[root@k8snode01 jupyter3]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
jupyter-pvc 5Gi RWO Delete Bound machinelearning/jupyter-pvc local-storage 8m42s
至此,PV和PVC都已经创建并挂载成功,可以在页面中创建Jupyter任务喽~
docker pull registry.aliyuncs.com/kubeflow-images-public/tensorflow-1.15.2-notebook-cpu:1.0.0
点击【Launch】,出现下图。
创建成功,点击【CONNECT】查看是否可以正常使用。
一切正常。
上节介绍了如何手动为Jupyter创建PV和PVC,但这样稍显麻烦,因为每次想要创建Jupyter任务就必须手动创建一个PV和一个PVC,还要在创建Jupyter任务时指定PVC名称。因此我们这里介绍如何为Jupyter自动创建PV(jupyter可以自己创建PVC)。
自动创建PV,在kubernetes的官方文档中被称为StorageClass,官方文档链接如下,想要了解可以去看
存储类 | Kubernetes
StorageClass 为管理员提供了描述存储 "类" 的方法。 不同的类型可能会映射到不同的服务质量等级或备份策略,或是由集群管理员制定的任意策略,这一句话有点难以理解,通俗的说,storageClass提供了一个创建PV的模板,在storageClass的这个模板中,可以指定PV的创建策略(动态or静态?),大小,读写策略,绑定策略等等,有了这些信息,Kubernetes就能够根据用户提交的PVC,找到对应的StorageClass,然后Kubernetes就会调用 StorageClass声明的存储插件,创建出需要的PV。
我们现在要做的,就是在k8s集群中创建一个能够动态创建PV的storageClass,但首先,我们需要制备器,k8s也提供了一些内置的制备器,但没有提供nfs制备器,因此要创建一个nfs存储制备器,拉取nfs-client-provisioner镜像来创建。
serviceAccount.yaml(服务账户,供nfs存储制备器使用)
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
namespace: kubeflow
nfs-provisioner.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-client-provisioner
namespace: kubeflow
labels:
app: nfs-client-provisioner
spec:
replicas: 1
selector:
matchLabels:
app: nfs-client-provisioner
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccount: nfs-client-provisioner #需要指定serviceAccount
containers:
- name: nfs-client-provisioner
image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner
volumeMounts:
- name: nfs-client-root
mountPath: persistentvolumes
env:
- name: PROVISIONER_NAME
value: kubeflow/nfs #nfs制备器的名称,很重要
value: 192.168.52.11
- name: NFS_PATH
value: /nfs/data/jupyter-system/ #改成你自己的目录
volumes:
- name: nfs-client-root
nfs:
server: 192.168.52.11
path: /nfs/data/jupyter-system/ #改成你自己的目录
注意!:以上两个资源我都是建在kubeflow的namespace下面的!建在默认namespace或其他namespace下面会报下面这样的错误
Failed to list >*v1.PersistentVolume: persistentvolumes is forbidden: User "system:serviceaccount:kube->system:random-scheduler" cannot list resource "persistentvolumes" in API group "" at the cluster scope
storageClass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: kubeflow-nfs-storage
provisioner: kubeflow/nfs #这里很重要,指定了存储制备器的名称
此时我们在页面里新创建一个jupyter任务automatic-task,看看能否创建成功
创建成功!
在后台看一下PV和PVC的创建情况。
如上图,集群自动创建了PV供jupyter创建的PVC挂载。