目录

k8s存储类:storageclass

1  安装nfs provisioner,用于配合存储类动态生成pv

2  创建storageclass,动态供给pv

3  创建pvc,通过storageclass动态生成pv

4  创建pod,挂载storageclass动态生成的pvc:test-claim1


文档中的YAML文件配置直接复制粘贴可能存在格式错误,故实验中所需要的YAML文件以及本地包均打包至网盘

链接:https://pan.baidu.com/s/10KKMiitavxqdZdMpea95WA 
提取码:l0ux 

k8s存储类:storageclass

上面介绍的PV和PVC模式都是需要先创建好PV,然后定义好PVC和pv进行一对一的Bond,但是如果PVC请求成千上万,那么就需要创建成千上万的PV,对于运维人员来说维护成本很高,Kubernetes提供一种自动创建PV的机制,叫StorageClass,它的作用就是创建PV的模板。k8s集群管理员通过创建storageclass可以动态生成一个存储卷pv供k8s pvc使用。

每个StorageClass都包含字段provisioner,parameters和reclaimPolicy。

具体来说,StorageClass会定义以下两部分:

1、PV的属性 ,比如存储的大小、类型等;

2、创建这种PV需要使用到的存储插件,比如Ceph、NFS等

有了这两部分信息,Kubernetes就能够根据用户提交的PVC,找到对应的StorageClass,然后Kubernetes就会调用 StorageClass声明的存储插件,创建出需要的PV。

#查看定义的storageclass需要的字段

[root@xianchaomaster1 ~]# kubectl explain storageclass

KIND:     StorageClass

VERSION:  storage.k8s.io/v1

DESCRIPTION:

     StorageClass describes the parameters for a class of storage for which

     PersistentVolumes can be dynamically provisioned.

     StorageClasses are non-namespaced; the name of the storage class according

     to etcd is in ObjectMeta.Name.

FIELDS:

   allowVolumeExpansion   <boolean>

   allowedTopologies <[]Object>

   apiVersion   <string>

   kind <string>

   metadata <Object>

   mountOptions <[]string>

   parameters   <map[string]string>

   provisioner  <string> -required-

   reclaimPolicy <string>

   volumeBindingMode <string>

provisioner:供应商,storageclass需要有一个供应者,用来确定我们使用什么样的存储来创建pv,常见的provisioner如下

(https://kubernetes.io/zh/docs/concepts/storage/storage-classes/):

provisioner既可以由内部供应商提供,也可以由外部供应商提供,如果是外部供应商可以参考GitHub - kubernetes-retired/external-storage: [EOL] External storage plugins, provisioners, and helper libraries下提供的方法创建。

GitHub - kubernetes-sigs/sig-storage-lib-external-provisioner

以NFS为例,要想使用NFS,我们需要一个nfs-client的自动装载程序,称之为provisioner,这个程序会使用我们已经配置好的NFS服务器自动创建持久卷,也就是自动帮我们创建PV。

reclaimPolicy:回收策略

allowVolumeExpansion:允许卷扩展,PersistentVolume 可以配置成可扩展。将此功能设置为true时,允许用户通过编辑相应的 PVC 对象来调整卷大小。当基础存储类的allowVolumeExpansion字段设置为 true 时,以下类型的卷支持卷扩展。

注意:此功能仅用于扩容卷,不能用于缩小卷。

安装nfs provisioner,用于配合存储类动态生成pv

#把nfs-subdir-external-provisioner.tar.gz上传到xianchaonode2和xianchaonode1上,手动解压。

[root@xianchaonode2 ~]# ctr -n=k8s.io images import  nfs-subdir-external-provisioner.tar.gz

[root@xianchaonode1 ~]# ctr -n=k8s.io images import  nfs-subdir-external-provisioner.tar.gz

1、创建运行nfs-provisioner需要的sa账号

[root@xianchaomaster1 nfs]# cat serviceaccount.yaml

apiVersion: v1

kind: ServiceAccount

metadata:

  name: nfs-provisioner

[root@xianchaomaster1 nfs]# kubectl apply -f serviceaccount.yaml

serviceaccount/nfs-provisioner created

扩展:什么是sa?

sa的全称是serviceaccount。

serviceaccount是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的。

指定了serviceaccount之后,我们把pod创建出来了,我们在使用这个pod时,这个pod就有了我们指定的账户的权限了。

2、对sa授权

[root@xianchaomaster1]# kubectl create clusterrolebinding nfs-provisioner-clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner

3、安装nfs-provisioner程序

[root@xianchaomaster1 ~]# mkdir /data/nfs_pro -p

#把/data/nfs_pro变成nfs共享的目录

[root@xianchaomaster1 ~]# cat /etc/exports

/data/volumes 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v1 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v2 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v3 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v4 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v5 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v6 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v7 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v8 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v9 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v10 192.168.40.0/24(rw,no_root_squash)

/data/nfs_pro 192.168.40.0/24(rw,no_root_squash)

[root@xianchaomaster1 ~]# exportfs -arv

exporting 192.168.40.0/24:/data/nfs_pro

exporting 192.168.40.0/24:/data/volume_test/v10

exporting 192.168.40.0/24:/data/volume_test/v9

exporting 192.168.40.0/24:/data/volume_test/v8

exporting 192.168.40.0/24:/data/volume_test/v7

exporting 192.168.40.0/24:/data/volume_test/v6

exporting 192.168.40.0/24:/data/volume_test/v5

exporting 192.168.40.0/24:/data/volume_test/v4

exporting 192.168.40.0/24:/data/volume_test/v3

exporting 192.168.40.0/24:/data/volume_test/v2

exporting 192.168.40.0/24:/data/volume_test/v1

exporting 192.168.40.0/24:/data/volumes

[root@xianchaomaster1 ~]# cat nfs-deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

  name: nfs-provisioner

spec:

  selector:

    matchLabels:

       app: nfs-provisioner

  replicas: 1

  strategy:

    type: Recreate

  template:

    metadata:

      labels:

        app: nfs-provisioner

    spec:

      serviceAccount: nfs-provisioner

      containers:

        - name: nfs-provisioner

          image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0

imagePullPolicy: IfNotPresent

          volumeMounts:

            - name: nfs-client-root

              mountPath: /persistentvolumes

          env:

            - name: PROVISIONER_NAME

              value: example.com/nfs

            - name: NFS_SERVER

              value: 192.168.40.180

            - name: NFS_PATH

              value: /data/nfs_pro

      volumes:

        - name: nfs-client-root

          nfs:

            server: 192.168.40.180

            path: /data/nfs_pro

#更新资源清单文件

[root@xianchaomaster1 ~]# kubectl apply -f nfs-deployment.yaml

deployment.apps/nfs-provisioner created

#查看nfs-provisioner是否正常运行

[root@xianchaomaster1 nfs]# kubectl get pods | grep nfs

nfs-provisioner-cd5589cfc-pjwsq      1/1     Running

创建storageclass,动态供给pv

[root@xianchaomaster1]# cat nfs-storageclass.yaml

kind: StorageClass

apiVersion: storage.k8s.io/v1

metadata:

  name: nfs

provisioner: example.com/nfs

[root@xianchaomaster1]# kubectl apply -f nfs-storageclass.yaml

#查看storageclass是否创建成功

[root@xianchaomaster1 nfs]# kubectl get storageclass

NAME   PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE  

nfs       example.com/nfs         Delete          Immediate                         

#显示内容如上,说明storageclass创建成功了

注意:provisioner处写的example.com/nfs应该跟安装nfs provisioner时候的env下的PROVISIONER_NAME的value值保持一致,如下:

env:

    - name: PROVISIONER_NAME

     value: example.com/nfs

3  创建pvc,通过storageclass动态生成pv

[root@xianchaomaster1]# cat claim.yaml

kind: PersistentVolumeClaim

apiVersion: v1

metadata:

  name: test-claim1

spec:

  accessModes:  ["ReadWriteMany"]

  resources:

    requests:

      storage: 1Gi

  storageClassName:  nfs

[root@xianchaomaster1]# kubectl apply -f claim.yaml

persistentvolumeclaim/test-claim1 created

#查看是否动态生成了pv,pvc是否创建成功,并和pv绑定

[root@xianchaomaster1 nfs]# kubectl get pvc

#通过上面可以看到test-claim1的pvc已经成功创建了,绑定的pv是pvc-da737fb7-3ffb-43c4-a86a-2bdfa7f201e2,这个pv是由storageclass调用nfs provisioner自动生成的。

步骤总结:

1、供应商:创建一个nfs provisioner

2、创建storageclass,storageclass指定刚才创建的供应商

3、创建pvc,这个pvc指定storageclass

4  创建pod,挂载storageclass动态生成的pvc:test-claim1

[root@xianchaomaster1]# cat read-pod.yaml

kind: Pod

apiVersion: v1

metadata:

  name: read-pod

spec:

  containers:

  - name: read-pod

image: nginx

imagePullPolicy: IfNotPresent

    volumeMounts:

      - name: nfs-pvc

        mountPath: /usr/share/nginx/html

  restartPolicy: "Never"

  volumes:

    - name: nfs-pvc

      persistentVolumeClaim:

        claimName: test-claim1

#更新资源清单文件

[root@xianchaomaster1 nfs]# kubectl apply -f read-pod.yaml

pod/read-pod created

#查看pod是否创建成功

[root@xianchaomaster1 nfs]# kubectl get pods | grep read

read-pod                             1/1     Running     0   

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐