PV生命周期的各个阶段
◎ Available:可用状态,还未与某个PVC绑定。
◎ Bound:已与某个PVC绑定。
◎ Released:绑定的PVC已经删除,资源已释放,但没有被集群回收。
◎ Failed:自动资源回收失败
◎Terminating:pv已经终结
一般情况下,bound是表示正常的,如果使用了default的StorageClass,那么,pv由于是StorageClass自动启停管理的,因此,Terminating 也是表示正常的。
6、挂载参数(Mount Options)
在将PV挂载到一个Node上时,根据后端存储的特点,可能需要设置额外的挂载参数,可根据PV定义中的mountOptions字段进行设置。本例中没有用到。
(2)pvc
pvc=PersistentVolumeClaim,也是一个缩写,中文意思持久存储需求清单
PVC是用户对存储资源的一个“申请”,就像Pod消费Node资源一样,PVC能够消费PV资源。PVC可以申请特定的存储空间和访问模式。
示例:
[root@master mysql]# cat pvc_mysql.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nfs-pvc-test namespace: database spec: accessModes: - ReadWriteOnce resources: requests: storage: 1.5Gi storageClassName: nfs
kubectl apply -f pvc_mysql.yaml就可以创建这个名叫nfs-pvc-test的pvc。
[root@master mysql]# k get pvc -A NAMESPACE NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE database mysql-pvc-test Bound mysql-pv-test 1Gi RWO nfs-provisioner 35h database nfs-pvc-test Bound nfs-pv-test 1536Mi RWO nfs 4h35m
可以看到,pvc和命名空间有关了,也自动绑定了nfs-pv-test这个pv了。最后面也提示了使用了StorageClass ,名称叫nfs。
关键配置
1、资源请求(Resources)
描述对存储资源的请求,目前仅支持request.storage的设置,即是存储空间的大小,本例没有配置
2、访问模式(AccessModes)
用于描述对存储资源的访问权限,与PV设置相同,本例仍然配置的是once
3、存储卷模式(Volume Modes)
用于描述希望使用的PV存储卷模式,包括文件系统和块设备。本例使用的是默认,仍然是filesystem
4、PV选择条件(Selector)
通过对Label Selector的设置,可使PVC对于系统中已存在的各种PV进行筛选。
选择条件可以使用matchLabels和matchExpressions进行设置,如果两个字段都设置了,则Selector的逻辑将是两组条件同时满足才能完成匹配
本例没有配置
5、存储类别(Class)
PVC 在定义时可以设定需要的后端存储的类别(通过storageClassName字段指定),以减少对后端存储特性的详细信息的依赖。只有设置了该Class的PV才能被系统选出,并与该PVC进行绑定
PVC也可以不设置Class需求。如果storageClassName字段的值被设置为空(storageClassName=""),则表示该PVC不要求特定的Class,系统将只选择未设定Class的PV与之匹配和绑定。PVC也可以完全不设置storageClassName字段,此时将根据系统是否启用了名为DefaultStorageClass的admission controller进行相应的操作
本例配置了StorageClass,并且使用的是default。
6、未启用DefaultStorageClass
等效于PVC设置storageClassName的值为空(storageClassName=""),即只能选择未设定Class的PV与之匹配和绑定。
本例中可以指定为非default,比如nfs-sc
[root@master nfs-sc]# k get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE mynfs mynfs Delete Immediate true 4h57m nfs (default) nfs Delete Immediate true 4h59m nfs-provisioner choerodon.io/nfs-client-provisioner Delete Immediate false 3d21h nfs-sc storage.pri/nfs Delete Immediate true 5h45m
二、什么时候需要使用StorageClass
1.关键配置
StorageClass作为对存储资源的抽象定义,对用户设置的PVC申请屏蔽后端存储的细节,一方面减少了用户对存储资源细节的关注,另一方面减少了管理员手工管理PV的工作,由系统自动完成PV的创建和绑定,实现了动态的资源供应。
StorageClass的定义主要包括名称、后端存储的提供者(privisioner)和后端存储的相关参数配置。StorageClass一旦被创建,就无法修改,如需修改,只能删除重建。例如,生成一个全新的StorageClass:
[root@master nfs-sc]# cat storageclass-nfs.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: mynfs provisioner: mynfs reclaimPolicy: Delete allowVolumeExpansion: True #允许pvc创建后扩容
关键配置
1、提供者(Privisioner)
描述存储资源的提供者,也可以看作后端存储驱动。
2、参数(Parameters)
后端存储资源提供者的参数设置,不同的Provisioner包括不同的参数设置。某些参数可以不显示设定,Provisioner将使用其默认值。本例使用的是默认配置,没有使用参数。一般也不需要设置参数。
3,allowVolumeExpansion: True #允许pvc创建后扩容
如果你不确定存储空间是否够用(比如,nfs),请设置为true。
4,reclaimPolicy: Delete 这里还是看自己的需求,delete基本够用,如果对数据比较在意,那么就retain。
2.设置默认的StorageClass
例如,我现有4个StorageClass,通过k get sc -A 命令查出来的:
[root@master nfs-sc]# k get sc -A NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE mynfs mynfs Delete Immediate true 5h13m nfs (default) nfs Delete Immediate true 5h15m nfs-provisioner choerodon.io/nfs-client-provisioner Delete Immediate false 3d21h nfs-sc storage.pri/nfs Delete Immediate true 6h
那么,我想设定nfs-sc这个是默认的default,怎么设定呢?
kubectl patch storageclass nfs-sc -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
再次查询:
[root@master nfs-sc]# k get sc -A NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE mynfs mynfs Delete Immediate true 5h16m nfs (default) nfs Delete Immediate true 5h17m nfs-provisioner choerodon.io/nfs-client-provisioner Delete Immediate false 3d21h nfs-sc (default) storage.pri/nfs Delete Immediate true 6h3m
这个就不行了,两个default,那么,以后使用肯定会有各种问题了(k8s不知道到底用哪个了嘛),把nfs(default)去掉default,简单:
kubectl patch storageclass nfs -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
再次查询,就达到目的了:
[root@master nfs-sc]# k get sc -A NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE mynfs mynfs Delete Immediate true 5h18m nfs nfs Delete Immediate true 5h20m nfs-provisioner choerodon.io/nfs-client-provisioner Delete Immediate false 3d21h nfs-sc (default) storage.pri/nfs Delete Immediate true 6h6m
总结
pv,pvc和StorageClass三者的关系是比较紧密的,但还有一些运行规则需要重点提示:
(1)资源供应
k8s支持两种资源的供应模式:静态模式(Static)和动态模式(Dynamic)。资源供应的结果就是创建好的PV。
静态模式:集群管理员手工创建许多PV,在定义PV时需要将后端存储的特性进行设置。
动态模式:集群管理员无需手工创建PV,而是通过StorageClass的设置对后端存储进行描述,标记为某种类型。此时要求PVC对存储的类型进行声明,系统将自动完成PV的创建及与PVC的绑定。PVC可以声明Class为"",说明该PVC禁止使用动态模式。
(2)资源绑定
在定义好PVC之后,系统将根据PVC对存储资源的要求(存储空间和访问模式)在已存在的PV中选择一个满足PVC要求的PV,一旦找到,就将该PV与定义的PVC进行绑定,应用就可以使用这个PVC了。如果系统中没有这个PV,则PVC则会一直处理Pending状态,直到系统中有符合条件的PV。PV一旦绑定到PVC上,就会被PVC独占,不能再与其他PVC进行绑定。当PVC申请的存储空间比PV的少时,整个PV的空间就都能够为PVC所用,可能会造成资源的浪费。如果资源供应使用的是动态模式,则系统在为PVC找到合适的StorageClass后,将自动创建一个PV并完成与PVC的绑定。
(3)资源使用
Pod使用Volume定义,将PVC挂载到容器内的某个路径进行使用。Volume的类型为Persistent VolumeClaim,在容器挂载了一个PVC后,就能被持续独占使用。多个Pod可以挂载到同一个PVC上。
volumes: - name: pv persistentVolumeClaim: claimName: pvc
4)资源释放
当存储资源使用完毕后,可以删除PVC,与该PVC绑定的PV会被标记为“已释放”,但还不能立刻与其他PVC进行绑定。通过之前PVC写入的数据可能还被保留在存储设备上,只有在清除之后该PV才能被再次使用。
(5)资源回收
对于PV,管理员可以设定回收策略,用于设置与之绑定的PVC释放资源之后如何处理遗留数据的问题。只有PV的存储空间完成回收,才能供新的PVC绑定和使用。
在静态资源供应模式下,通过PV和PVC完成绑定,并供Pod使用的存储管理机制
在动态资源供应模式下,通过StorageClass和PVC完成资源动态绑定(系统自动生成PV),并供Pod使用的存储管理机制。
(6)
如果,启用DefaultStorageClass要求集群管理员已定义默认的StorageClass。如果在系统中不存在默认StorageClass,则等效于不启用DefaultStorageClass的情况。如果存在默认的StorageClass,则系统将自动为PVC创建一个PV(使用默认StorageClass的后端存储),并将它们进行绑定。集群管理员设置默认StorageClass的方法见总结的上面一点,如果管理员将多个StorageClass都定义为default,则由于不唯一,系统将无法为PVC创建相应的PV。
(7)未启用DefaultStorageClass
等效于PVC设置storageClassName的值为空(storageClassName=""),即只能选择未设定Class的PV与之匹配和绑定。
这些规则非常重要,也比较绕口,需要仔细的多加实践,从而对k8s有一个正确的认识。