[Kubeflow jupyter01]为jupyter notebook配置存储空间

目录

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任务



1、jupyter-notebook未指定存储位置,缺少存储空间

刚开始使用jupyter notebook,点击【+NEW SERVER】按钮,弹出的页面会出现如下报错:

No default Storage Class is set. Can’t create new Disks for the new Notebook

简单说明一下该页面的内容

[Kubeflow jupyter01]为jupyter notebook配置存储空间_第1张图片

我们使用过jupyter-notebook的都知道,jupyter的代码文件,数据在本地需要一个存储位置,所以在创建一个新的jupyter任务,即创建一个pod之前,要为其准备好一个pv及其pvc,我们先手动创建一下。

2、手动为Jupyter创建PV和PVC

2.1 创建PV(前提:nfs挂载已经配置成功)

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

2.2 创建PVC

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任务喽~

2.3 拉取官方的jupyter镜像,下载源为阿里云

docker pull registry.aliyuncs.com/kubeflow-images-public/tensorflow-1.15.2-notebook-cpu:1.0.0

[Kubeflow jupyter01]为jupyter notebook配置存储空间_第2张图片​​​​​​​

 

点击【Launch】,出现下图。

[Kubeflow jupyter01]为jupyter notebook配置存储空间_第3张图片

 创建成功,点击【CONNECT】查看是否可以正常使用。

[Kubeflow jupyter01]为jupyter notebook配置存储空间_第4张图片

 一切正常。

[Kubeflow jupyter01]为jupyter notebook配置存储空间_第5张图片

 3、自动创建PV

上节介绍了如何手动为Jupyter创建PV和PVC,但这样稍显麻烦,因为每次想要创建Jupyter任务就必须手动创建一个PV和一个PVC,还要在创建Jupyter任务时指定PVC名称。因此我们这里介绍如何为Jupyter自动创建PV(jupyter可以自己创建PVC)。

3.1 StorageClass的概念和作用

自动创建PV,在kubernetes的官方文档中被称为StorageClass,官方文档链接如下,想要了解可以去看

存储类 | Kubernetes

StorageClass 为管理员提供了描述存储 "类" 的方法。 不同的类型可能会映射到不同的服务质量等级或备份策略,或是由集群管理员制定的任意策略,这一句话有点难以理解,通俗的说,storageClass提供了一个创建PV的模板,在storageClass的这个模板中,可以指定PV的创建策略(动态or静态?),大小,读写策略,绑定策略等等,有了这些信息,Kubernetes就能够根据用户提交的PVC,找到对应的StorageClass,然后Kubernetes就会调用 StorageClass声明的存储插件,创建出需要的PV。

[Kubeflow jupyter01]为jupyter notebook配置存储空间_第6张图片

我们现在要做的,就是在k8s集群中创建一个能够动态创建PV的storageClass,但首先,我们需要制备器,k8s也提供了一些内置的制备器,但没有提供nfs制备器,因此要创建一个nfs存储制备器,拉取nfs-client-provisioner镜像来创建。

3.2 创建nfs 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

3.3 创建storageClass

storageClass.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: kubeflow-nfs-storage 
provisioner: kubeflow/nfs #这里很重要,指定了存储制备器的名称

3.4 新建jupyter任务

 此时我们在页面里新创建一个jupyter任务automatic-task,看看能否创建成功

[Kubeflow jupyter01]为jupyter notebook配置存储空间_第7张图片

创建成功!

在后台看一下PV和PVC的创建情况。

 如上图,集群自动创建了PV供jupyter创建的PVC挂载。


 

你可能感兴趣的:(kubeflow,jupyter,python,ide)