在Kubernetes(简称k8s)环境中,存储资源是应用程序的关键组件。Persistent Volume(PV)和Persistent Volume Claim(PVC)是k8s中的两个核心概念,它们共同构成了一个强大的存储管理机制。PV代表着集群中可供使用的物理或逻辑存储空间,而PVC则代表了Pod对这些资源的请求。
PV与PVC基本概念
Persistent Volumes 是指集群中的实际存储资源,它可以是一个硬盘、一个网络文件系统或者其他任何形式的持久化数据源。每个PV都有其唯一标识符、容量大小和访问模式等属性。当创建PV时,管理员需要指定它所支持的访问模式,如读写(ReadWriteOnce)、多读写(ReadOnlyMany、ReadWriteMany)以及只读访问(ReadOnlyOnce)。
Persistent Volume Claims 是Pod请求特定类型和数量的存储资源的一种方式。当创建PVC时,你需要指定你想要分配给你的应用程序所需的容量大小以及访问模式。如果集群中有足够多符合条件的PV,则将会动态分配给该PVC。
PV与PVC生命周期
创建PV
创建PV通常由管理员完成,他们需要定义如何配置和供应持久化卷,并确保它们满足特定的需求,比如磁盘类型或网络路径。这一过程可能涉及到外部插件,如CSI(Compute Storage Interface)提供商,这些插件负责在k8s上实现具体设备操作。
绑定与解绑
当用户请求一个匹配他们要求的一个PVC时,k8s调度器会尝试为这个声明找到最合适的未被使用或已被释放掉的Volume进行绑定。一旦成功地绑定了,就不能再改变此次匹配关系。但如果没有合适匹配,也可以选择等待直到有合适Volume出现。在某些情况下,可以手动删除当前绑定的状态并重新提交新的声明来寻找另一种可能更好的匹配。
删除与回收
当不再需要使用某个Storage Class上的卷后,可以通过删除相应 的 PVC 来释放它。不过,如果该卷已经被挂载至pod上,那么必须先从所有使用该卷的地方移除,然后才能安全地删除这个 PVC。此外,还有一种方式,即直接删除整个pv本身,但是这样做会导致所有相关联pvc自动变成失败状态,因为它们失去了用于挂载其数据的地方。
动态分配策略
为了提高效率并减少手动干预,k8s 提供了一种名为“Dynamic Provisioning”的功能,该功能允许根据需求自动分配合适大小和类型的大型数据集。这意味着用户无需事先了解哪些persistent volume可用,只需提交一个claim,并且系统就会根据claim中的要求自动生成相应大小和类型的一块persistent storage。大部分StorageClass都支持dynamic provisioning,但这取决于底层storage provider是否支持这种机制。
使用示例
要开始使用 Persistent Volumes,我们首先要定义 StorageClass,这将告诉 kubernetes 如何提供 persistent storage:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage-class
provisioner: kubernetes.io/no-provisioner # 如果您正在使用 CSI 驱动程序,请替换为您的驱动程序名称。
volumeBindingMode: WaitForFirstConsumer # 这表示我们希望等待第一个消费者 Pod 来确定具体应该是什么样的 PV。
然后,我们可以基于这个StorageClass创建我们的Claim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-claim-local-storage-class-pvc-1
spec:
accessModes:
- ReadWriteOnce # 或者 ReadOnlyMany,ReadWriteMany, ReadOnlyOnce 根据您的需求调整。
resources:
requests:
storage: "10Gi" # 存储要求,以 Gi 为单位。
最后,在我们的 Pod 中引用这个 claim 并设置 volumes 字段以挂载到 pod 内部目录:
apiVersion: v1
kind: Pod
metadata:
name: my-pod-with-local-storage-class-volume-binding-mode-wait-for-first-consumer-pvc-1
spec:
containers:
- image : nginx/nginx-ingress-controller:v0.9.0-beta.6
name : nginx-ingress-controller
volumeMounts:
- mountPath:/usr/share/nginx/html
volumes:
- name : my-local-storage-volume-binding-mode-wait-for-first-consumer-vol
persistentVolumeClaim:
name : my-claim-local-storage-class-pvc-1
结论
总结来说,Persistent Volumes 和 Persistent Volume Claims 在 Kubernetes 集群中扮演着重要角色,它们帮助我们高效地管理持久化数据,同时保证了应用程序能够按需获取必要的大规模数据处理能力。通过理解如何正确配置这些元素,以及如何利用 Dynamic Provisioning 功能,我们可以最大限度地优化我们的工作流程,从而提高整体运维效率。