在 Kubernetes (K8s) 中,卷(Volume)、持久卷(Persistent Volume,PV)和持久卷声明(Persistent Volume Claim,PVC)是与数据存储和管理相关的重要概念,它们为容器提供了数据持久化和存储资源管理的能力。
Volume
概念
Kubernetes 中的 Volume 是附加到 Pod 中的一个或多个容器的存储区域。Volume 的生命周期与 Pod 绑定,它超出了单个容器的文件系统的限制,允许数据在容器重启后持久化,并且可以在 Pod 的多个容器之间共享。
核心特性
- 数据持久化:即使容器崩溃,Volume 中的数据也可以保留。
- 共享数据:Volume 可以被 Pod 中的多个容器挂载和访问。
- 多种 Volume 类型:Kubernetes 支持多种类型的 Volume,包括 hostPath(将节点上的文件系统挂载到 Pod 中)、configMap、secret、nfs、cloud storage(如 AWS EBS、GCP Persistent Disk 等)等。
使用场景
- 临时存储容器之间需要共享的数据。
- 存储日志或检查点数据,以便在容器重启后进行恢复。
- 挂载配置文件或敏感信息(通过 ConfigMap 或 Secret)。
Persistent Volume (PV)
概念
PV 是集群中预先配置的一段网络存储,它与 Volume 类似,但是具有独立于 Pod 生命周期的持久性。管理员可以提前配置一系列的 PV,或者通过 StorageClass 动态地创建。
核心特性
- 集群资源:PV 是集群级别的资源,类似于节点,独立于单个 Pod。
- 生命周期独立:PV 的生命周期独立于任何使用它的 Pod,这意味着删除 Pod 并不会导致 PV 中的数据丢失。
- 支持多种存储后端:可以是网络存储系统如 NFS、iSCSI 或特定云提供商的存储解决方案。
Persistent Volume Claim (PVC)
概念
PVC 是用户对存储的请求或声明,它类似于 Pod 对计算资源(CPU 和内存)的请求。Pod 通过 PVC 来请求存储资源,而无需了解背后的存储系统的复杂性。
核心特性
- 抽象化存储:PVC 为 Pod 和存储之间提供了一个抽象层,使得应用无需关心具体的存储细节。
- 动态存储分配:如果使用了支持动态分配的 StorageClass,当 PVC 被创建时,存储系统可以自动创建相应的 PV 来满足 PVC 的请求。
- 存储资源请求:可以请求特定大小和访问模式(如 ReadWriteOnce、ReadOnlyMany、ReadWriteMany)的存储。
使用示例
# PersistentVolume 示例
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-example
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: standard
nfs:
path: /path/to/nfs
server: nfs-server.example.com
# PersistentVolumeClaim 示例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-example
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: standard
在这个例子中,PV pv-example
由管理员提前创建,它使用 NFS 作为存储后端。用户通过创建 PVC pvc-example
来请求存储资源,Kubernetes 会自动绑定符合条件的 PV 给这个 PVC,然后 Pod 可以通过引用 PVC 来使用这个存储资源。
通过使用 PV 和 PVC,Kubernetes 提供了灵活且强大的存储资源管理能力,使得应用可以以可移植的方式使用持久化数据。
在 Kubernetes 中,持久卷(Persistent Volume,简称 PV)和持久卷声明(Persistent Volume Claim,简称 PVC)之间的关系非常紧密,它们共同管理和抽象化了存储资源的使用。这种关系可以类比于计算资源中 Pod 和 Node 的关系,其中 PV 类似于 Node(提供资源),而 PVC 类似于 Pod(消耗资源)。以下是 PV 和 PVC 关系的几个关键点:
1. 抽象化和封装
- PV 是集群中预先配置的或通过动态供给动态创建的一段网络存储空间。它封装了存储的细节,比如存储的实际类型(如 NFS、云存储等)、容量、存取模式等。
- PVC 是用户对存储的请求或声明,它通过声明所需的存储容量和存取模式(如 ReadWriteOnce、ReadOnlyMany、ReadWriteMany)来请求存储资源,但不需要关心具体的存储实现细节。
2. 资源请求与供给
- 用户创建 PVC 来请求存储资源,就像在 Pod 定义中请求计算资源(CPU 和内存)一样。PVC 定义了所需的存储容量和访问模式。
- PV 是满足这些请求的存储资源,当 PVC 被创建时,Kubernetes 的控制平面会寻找一个符合 PVC 请求的 PV 并将其绑定给 PVC。一旦 PV 被 PVC 绑定,它就被该 PVC 独占,直到 PVC 被删除或手动解除绑定。
3. 生命周期管理
- PV 的生命周期通常由管理员或动态供给系统管理,它独立于任何单个 PVC 的生命周期。PV 可以在没有被任何 PVC 使用时预先创建,等待绑定;也可以在 PVC 创建时动态供给。
- PVC 的生命周期由用户管理,当 PVC 不再需要时,用户可以删除 PVC。根据 PV 的回收策略,相应的 PV 可以被删除、回收再利用或保持不变。
4. 动态供给
在动态供给的环境中,用户只需创建 PVC,存储系统会自动创建一个满足 PVC 请求的 PV。这大大简化了存储资源的管理,使得用户无需担心存储资源的预配问题。
总结
PV 和 PVC 之间的关系通过提供一个层次化和抽象化的接口来管理存储资源,使得用户可以灵活地请求所需的存储资源,而不必关心底层的存储细节。这种模型提高了 Kubernetes 应用的可移植性和灵活性,允许存储资源按需供给和回收,从而提高资源的利用率和管理效率。