在 Kubernetes 中,Persistent Volume (PV) 和 Persistent Volume Claim (PVC) 是用于管理存储资源的重要概念。它们提供了一种方式来抽象化存储的供应和消费,使得应用程序可以方便地请求和使用持久化存储,而无需关心底层存储的具体实现细节。
Persistent Volume (PV)
Persistent Volume (PV) 是集群中由管理员配置的一段网络存储。它是集群中的一个资源,就像节点是集群中的计算资源一样。PV 是一种独立于 Pod 生命周期存在的存储资源,并且可以在多个 Pod 之间共享(取决于访问模式)。
- 静态供应:管理员手动创建 PV。
- 动态供应:当用户请求 PVC 时,系统根据 StorageClass 自动创建 PV。
PV 的定义通常包括以下几个关键属性:
capacity
:指定 PV 的大小。accessModes
:定义了存储卷可以被访问的方式,比如 ReadWriteOnce(单个节点读写)、ReadOnlyMany(多个节点只读)、ReadWriteMany(多个节点读写)等。persistentVolumeReclaimPolicy
:当 PV 不再被使用时,决定如何处理该 PV,例如Retain
(保留数据)、Recycle
(清理后重用)或Delete
(删除)。storageClassName
:与 StorageClass 关联,用于动态供应 PV。volumeMode
:指定 PV 应该以文件系统(默认)还是块设备的形式挂载。spec
:具体的存储实现细节,如 NFS、iSCSI、GCE Persistent Disk 等。
Persistent Volume Claim (PVC)
Persistent Volume Claim (PVC) 是用户对存储的一种请求。它类似于 Pod 对 CPU 和内存资源的请求。PVC 消费者(通常是 Pod)通过 PVC 来请求特定大小和访问模式的存储资源。PVC 可以绑定到合适的 PV 上,一旦绑定,Pod 就可以通过 PVC 访问到相应的 PV。
PVC 的定义通常包括以下属性:
accessModes
:请求的访问模式,必须与所绑定的 PV 的访问模式兼容。resources.requests.storage
:请求的存储空间大小。volumeMode
:指定 PVC 应该以文件系统还是块设备的形式挂载。storageClassName
:指定 PVC 使用的 StorageClass,以便进行动态供应。
PV 与 PVC 之间的关系
-
匹配规则:PVC 根据其请求的存储大小和访问模式寻找合适的 PV。如果找到了满足条件的 PV,则 PVC 会绑定到这个 PV 上。如果没有找到合适的 PV 并且存在相应的 StorageClass,那么可能会触发动态供应机制来创建新的 PV。
-
绑定:一旦 PVC 绑定到了 PV,这个 PV 将不再能够被其他 PVC 所绑定。只有当 PVC 被删除或者释放后,PV 才可能被重新绑定给其他的 PVC 或者被回收。
-
生命周期管理:PV 的生命周期独立于 Pod,这意味着即使使用它的 Pod 已经终止,PV 仍然存在于集群中,直到被明确删除。PVC 的生命周期通常与使用它的 Pod 相关联,但也可以单独管理。
-
StorageClass:StorageClass 提供了一种方式来描述存储类别的参数。它可以用来动态地为 PVC 创建 PV。每个 StorageClass 包含 Provisioner 字段,该字段指定了应该使用的外部存储系统。
-
回收策略:当 PVC 被删除时,PV 的回收策略决定了 PV 如何处理。常见的策略有
Retain
(保留数据,需要手动清理)、Recycle
(清理数据并准备再次使用,已废弃)、Delete
(自动删除底层存储)。
通过 PV 和 PVC,Kubernetes 提供了一个灵活且可扩展的方式来管理持久化存储,支持多种类型的存储解决方案,并且允许开发者专注于应用逻辑而不是存储基础设施。