所属技术领域:
K8s
|名词定义|
PersistentVolume(PV)用于为用户和管理员提供如何提供和消费存储的API,PV由管理员在集群中提供的存储。它就像Node一样是集群中的一种资源。PersistentVolume 也是和存储卷一样的一种插件,但其有着自己独立的生命周期。PersistentVolumeClaim (PVC)是用户对存储的请求,类似于Pod消费Node资源,PVC消费PV资源。Pod能够请求特定的资源(CPU和内存),声明请求特定的存储大小和访问模式。PV是一个系统的资源,因此没有所属的命名空间。
|技术特点|
为什么又要引入 PV 呢?
我们知道 pod 中声明的 volume 生命周期与 pod 是相同的,以下有几种常见的场景:
1.pod 销毁重建(如Deployment管理的Pod镜像升级)
2.宿主机故障迁移(如StatefulSet管理的Pod带远程volume迁移)
3.多个 pod共享一个数据volume
4.数据volume snapshot,resize等功能的扩展实现
以上场景中,通过 Pod Volumes 很难准确地表达它的复用/共享语义,对它的扩展也比较困难。因此 K8s 中又引入了 Persistent Volumes 概念,它可以将存储和计算分离,通过不同的组件来管理存储资源和计算资源,然后解耦 pod 和 Volume 之间生命周期的关联。这样,当把 pod 删除之后,它使用的 PV 仍然存在,还可以被新建的 pod 复用。
PV对象的产生
1.Static Volume Provisioning
静态 Provisioning:由集群管理员事先去规划这个集群中的用户会怎样使用存储,它会先预分配一些存储,也就是预先创建一些 PV;然后用户在提交自己的存储需求(也就是 PVC)的时候,K8s 内部相关组件会帮助它把 PVC 和 PV 做绑定;之后用户再通过 pod 去使用存储的时候,就可以通过 PVC 找到相应的 PV,它就可以使用了。
2.Dynamic Volume Provisioning
动态供给是什么意思呢?就是说现在集群管理员不预分配 PV,他写了一个模板文件,这个模板文件是用来表示创建某一类型存储(块存储,文件存储等)所需的一些参数,这些参数是用户不关心的,给存储本身实现有关的参数。用户只需要提交自身的存储需求,也就是 PVC 文件,并在 PVC 中指定使用的存储模板(StorageClass)。
PV Spec 重要字段解析
Capacity:存储总空间;
AccessModes:也是用户需要关心的,就是说我使用这个 PV 的方式。它有三种使用方式。
ReadWriteOnce只允许单 node 访问;
ReadOnlyMany允许多个node只读访问
ReadWriteMany允许多node读写访问
一个PV可以设置多个访问策略,PVC与PV bound时,PV Controller会优先找到AccessModes列表最短并且匹配PVC AccessModes列表的PV集合,然后从该集合中找到Capacity最小且最符合PVC size需求的PV对象。
PersistentVolumeReclaimPolicy:PV被release之后(与之bound的PVC被删除)回收再利用策略
Recycle(已废弃)
Delete:volume被released之后直接delete,需要volume plugin支持
Retain:默认策略,由系统管理员来手动管理该volume
StorageClassName:PVC可通过该字段找到相同值的字段的PV(静态provisioning),也可通过该字段对应的storageclass从而动态provisioning新PV对象PVC
NodeAffinity:限制可以访问该volume的nodes,对使用该volume的pod的调度有影响(因为使用该volume的pod只能调度能访问该PV的node上才能正常工作)