籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》
一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:Kubernetes认证考试自学系列 | 汇总_热爱编程的通信人的博客-CSDN博客
6.5.1 storageClass的工作流程
定义storageClass时必须要包含一个分配器(provisioner),不同的分配器指定了动态创建pv时使用什么后端存储。
可以是以aws-ebs作为pv的后端存储,也可以是以lv作为pv的后端存储,也可以是以hostPath作为pv的后端存储。
在用storageClass动态创建pv的时候,根据使用后端存储的不同,应该选择一个合适的分配器,但是像
http://lvmplugin.csi.alibabacloud.com和http://hostpath.csi.k8s.io这样的分配器,既然不是kubernetes自带的,那是哪里来的呢?
这些非内置的分配器暂且称为外部分配器,这些外部分配器由第三方提供,是通过自定义CSIDriver(容器存储接口驱动)来实现的分配器。
所以整个流程就是,管理员创建storageClass时会通过.provisioner字段指定分配器。管理员创建好storageClass之后,用户在定义pvc时需要通过.spec.storageClassName指定使用哪个storageClass,如图6-8所示。
当创建pvc的时候,系统会通知storageClass,storageClass会通过它所关联的分配器来获取后端存储类型,然后动态地创建一个pv和此pvc进行绑定。
6.5.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.yaml里指定的命名空间更换为nsvolume,然后部署rbac。
[root@vms10 deploy]# sed -i 's/namespace: default/namespace: nsvolume/g' rbac.yaml
[root@vms10 deploy]#
[root@vms10 deploy]# kubectl apply -f rbac.yaml
... 输出 ...
[root@vms10 deploy]#
步骤5:修改
/etc/kubernetes/manifests/kube-apiserver.yaml。
在kubernetes v1.20及之后的版本里,还需要修改
/etc/kubernetes/manifests/kube-apiserver.yaml,增加:
- --feature-gates=RemoveSelfLink=false
然后重启kubelet。
6.5.3 部署NFS分配器
因为NFS分配器不是自带的,所以这里需要先把NFS分配器创建出来。
步骤1:用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: nsvolume
... 输出 ...
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
步骤2:部署NFS分配器。
[root@vms10 deploy]# kubectl apply -f deployment.yaml
deployment.apps/nfs-client-provisioner created
[root@vms10 deploy]#
步骤3:查看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]#
6.5.4 部署storageClass
创建了NFS分配器之后,下面开始创建一个使用这个分配器的storageClass。
步骤1:创建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]#
这个yaml文件的意思是创建一个名字是managed-nfs-storage的storageClass,使用名字为fuseim.pri/ifs的分配器。
步骤2:查看现在是否存在storageClass。
[root@vms10 deploy]# kubectl get sc
No resources found
[root@vms10 deploy]#
步骤3:部署并查看storag Class。
[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
NANE PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ...
managed-nfs-storage fuseim.pri/ifs Delete Immediate
... [root@vms10 deploy]#
步骤4:查看当前是否存在pvc和pv。
[root@vms10 deploy]# kubectl get pvc
No resources found in nsvolume namespace.
[root@vms10 deploy]# kubectl get pv
No resources found
[root@vms10 deploy]#
当前不存在任何pv和pvc。
步骤5:下面开始创建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
步骤6:下面开始创建pvc。
[root@vms10 deploy]# kubectl apply -f pvc1.yaml
persistentvolumeclaim/pvc1 created
[root@vms10 deploy]#
步骤7:查看是否创建出来了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
步骤8:查看pv。
[root@vms10 deploy]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-edce9ee1-eeco-4527-a3e8-15b94bf45fc0 1Mi RWX Delete Bound volume/pvc1 managed-nfs-storage 9s
[root@vms10 deploy]#
从这里可以看到,不仅把pvc1创建出来了,也创建出来一个名字叫作
pvc-edce9ee1-e0c0-4527-a3e8-15b94bf45fco的pv,并且和pvc1关联在一起了。
步骤9:查看这个pv的属性。
[root@vms10 deploy]# kubectl describe pv pvc-edce9ee1-e0c0-4527-a3e8-15b94bf45fc0
... 输出 ...
Source:
Type: NFS(an NFS mount that lasts the lifetime of apod)
Server: 192.168.26.30
Path: /vdisk/ns1-pvc1-pvc-edce9ee1-e0c0-4527-a3e8-15b94bf45fc0
ReadOnly: false
Events: <none>
[root@vms10 deploy]#
可以看到这个pv所使用的存储类型为NFS。