动态卷供应

1.storageClass的工作流程

定义storageClass时必须要包含一个分配器(provisioner),不同的分配器指定了动态创建pv时使用什么后端存储。先看下面的3个例子
第一个例子,分配器使用aws的ebs作为pv的后端存储

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/aws-ebs
parameters:
  type: io1
  iopsPerGB: "10"
  fsType: ext4

第二个例子,分配器使用lvm作为pv的后端存储

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-lvm
provisioner: lvmplugin.csi.alibabacloud.com
parameters:
    vgName: volumegroup1
    fsType: ext4
reclaimPolicy: Delete

第三个例子,使用hostPath作为pv的后端存储

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: csi-hostpath-sc
provisioner: hostpath.csi.k8s.io
reclaimPolicy: Delete
#volumeBindingMode: Immediate
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

这三个例子里,分别使用了不同的分配器,这些分配器有的是以aws-ebs做pv的后端存储,有的是以lv作为pv后端存储,有的是以hostPath作为pv后端存储。

上面3个例子里所使用的分配器中,有一些是kubernetes内置的分配器,比如kubernetes.io/aws-ebs,其他两个分配器不是kubernetes自带的。kubernetes自带的分配器包括:
kubernetes.io/aws-ebs
kubernetes.io/gce-pd
kubernetes.io/glusterfs
kubernetes.io/cinder
kubernetes.io/vsphere-volume
kubernetes.io/rbd
kubernetes.io/quobyte
kubernetes.io/azure-disk
kubernetes.io/azure-file
kubernetes.io/portworx-volume
kubernetes.io/scaleio
kubernetes.io/storageos
kubernetes.io/no-provisioner
在动态创建pv的时候,根据使用不同的后端存储,应该选择一个合适的分配器。但是像 lvmplugin.csi.alibabacloud.com和hostpath.csi.k8s.io这样的分配器既然不是kubernetes自带的,那是哪里来的呢?

这些非内置的分配器咱们暂且称之为外部分配器,这些外部分配器由第三方提供,是通过自定义CSIDriver(容器存储接口驱动)来实现的分配器。

所以整个流程就是,管理员创建storageClass时会通过.provisioner字段指定分配器。管理员创建好storageClass之后,用户在定义pvc时需要通过.spec.storageClassName指定使用哪个storageClass。
file
图 pvc使用哪个storageClass

当创建pvc的时候,系统会通知storageClass,storageClass会从它所关联的分配器来获取后端存储类型,然后动态的创建一个pv出来和此pvc进行关联。

2.利用nfs创建动态卷供应

前面已经用nfs配置过共享文件夹了,因为配置起来相对简单,所以这里以nfs作为后端存储来配置动态卷供应。

步骤1:自行在存储服务器192.168.26.30上创建一个目录/vdisk,并共享这个目录。
[root@vms30 ~]# cat /etc/exports
/123 (rw,async,no_root_squash)
/zz
(rw,async,no_root_squash)
/vdisk (rw,async,no_root_squash)
[root@vms30 ~]# exportfs -avr
exporting
:/vdisk
exporting :/zz
exporting
:/123
[root@vms30 ~]#
因为kubernetes里,nfs没有内置分配器,所以需要下载相关插件来创建nfs外部分配器。

步骤2:在vms10上先安装git客户端工具。
[root@vms10 volume]# yum install git -y
...输出...
[root@vms10 volume]#

步骤3:克隆项目并进入到目录。
[root@vms10 volume]# git clone https://github.com/kubernetes-incubator/external-storage.git
正克隆到 'external-storage'...
...输出...
[root@vms10 volume]#

[root@vms10 volume]# cd external-storage-master/nfs-client/deploy/
[root@vms10 deploy]#

步骤4:部署rbac权限。
部署rbac:
[root@vms10 deploy]# kubectl apply -f rbac.yaml
...输出...
[root@vms10 deploy]#

3.部署nfs分配器

因为nfs分配器不是自带的,所以这里需要先把nfs分配器创建出来。
步骤5:用vim编辑deployment.yaml,修改如下内容。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
    ...输出...    
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 192.168.26.30
            - name: NFS_PATH
              value: /vdisk
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.26.30
            path: /vdisk

1.image后面的镜像需要提前在所有节点上pull下来,并修改镜像下载策略
2.env字段里,PROVISIONER_NAME用于指定分配器的名字,这里是fuseim.pri/ifs,NFS_SERVER和NFS_PATH分别指定这个分配器所使用的存储信息。
3.在volumes里的server和path里指定共享服务器和目录

步骤6:部署nfs分配器。
[root@vms10 deploy]# kubectl apply -f deployment.yaml
deployment.apps/nfs-client-provisioner created
[root@vms10 deploy]#

步骤7:查看pod的运行情况。
[root@vms10 deploy]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-7544459d44-dpjtx 1/1 Running 0 5s
[root@vms10 deploy]#
4.5.4.部署storageClass
创建了nfs分配器之后,下面开始创建一个使用这个分配器的storageClass。

步骤8:创建storageClass。
在当前目录里有一个名为class.yaml的文件,用于创建storageClass,内容如下:
[root@vms10 deploy]# cat class.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
provisioner: fuseim.pri/ifs
parameters:
  archiveOnDelete: "false"

[root@vms10 deploy]#
这里provisioner的值fuseim.pri/ifs是由deployment.yaml文件里指定的分配器的名字,这个yaml文件的意思是创建一个名字是managed-nfs-storage的storageClass,使用名字为fuseim.pri/ifs的分配器。

步骤8:查看现在是否存在storageClass。
[root@vms10 deploy]# kubectl get sc
No resources found
[root@vms10 deploy]#

步骤9:部署并查看storageClass。
[root@vms10 deploy]# kubectl apply -f class.yaml
storageclass.storage.k8s.io/managed-nfs-storage created
[root@vms10 deploy]#
[root@vms10 deploy]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ...
managed-nfs-storage fuseim.pri/ifs Delete Immediate ... [root@vms10 deploy]#

步骤10:查看当前是否存在pvc和pv。
[root@vms10 deploy]# kubectl get pvc
No resources found in volume namespace.
[root@vms10 deploy]# kubectl get pv
No resources found
[root@vms10 deploy]#
当前不存在任何pv和pvc。
步骤11:下面开始创建pvc。
[root@vms10 deploy]# cp test-claim.yaml pvc1.yaml
[root@vms10 deploy]# cat pvc1.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc1
  annotations:
    volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi

[root@vms10 deploy]#
这里在annotations里指定了使用哪个storageClass,也可以写成如下内容:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc1
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi
  storageClassName: managed-nfs-storage

在1.20里修改kube-apiserver.yaml

  • --feature-gates=RemoveSelfLink=false
    步骤12:下面开始创建pvc。
    [root@vms10 deploy]# kubectl apply -f pvc1.yaml
    persistentvolumeclaim/pvc1 created
    [root@vms10 deploy]#

步骤13:查看是否创建出来了pvc。
[root@vms10 deploy]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc1 Bound pvc-edce9ee1-e0c0-4527-a3e8-15b94bf45fc0 1Mi RWX managed-nfs-storage 4s
步骤14:查看pv。
[root@vms10 deploy]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-edce9ee1-e0c0-4527-a3e8-15b94bf45fc0 1Mi RWX Delete Bound volume/pvc1 managed-nfs-storage 9s
[root@vms10 deploy]#
从这里可以看到不仅把pvc1创建出来了,也创建出来一个名字叫做pvc-edce9ee1-e0c0-4527-a3e8-15b94bf45fc0的pv和pvc1关联在一起了。

步骤15:查看这个pv的属性。
[root@vms10 deploy]# kubectl describe pv pvc-edce9ee1-e0c0-4527-a3e8-15b94bf45fc0
...输出...
Source:
Type: NFS (an NFS mount that lasts the lifetime of a pod)
Server: 192.168.26.30
Path: /vdisk/ns1-pvc1-pvc-edce9ee1-e0c0-4527-a3e8-15b94bf45fc0
ReadOnly: false
Events:
[root@vms10 deploy]#
可以看到这个pv是所使用的存储类型为nfs。

相关新闻

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

                                                                                                                                    RHCE9学习指南连载,点击阅读