本文详细介绍 Kubernetes 存储相关的常见概念,涵盖访问模式、绑定模式、回收策略等关键概念,帮助您在使用存储前,提前了解存储的基本知识。
在 Kubernetes 集群中,容器内文件在磁盘上是临时存放的,这会给关键业务应用带来以下问题:
- 容器崩溃或重建时,内部文件会随之丢失,无法实现数据持久化。
- 同一 Pod 内多容器协同运行时,无法便捷、安全地实现文件共享与数据交换。
为解决上述问题,Kubernetes 抽象出 Volume(存储卷)资源。存储卷隶属于 Pod,并非独立可创建的资源对象,必须在 Pod 规格中定义并声明。Pod 内所有容器均可使用存储卷,但需通过挂载方式将存储卷关联至容器内指定目录。
- 一个 Pod 可同时挂载多个存储卷,但为保证稳定性与可维护性,不建议在单个 Pod 中挂载过多存储卷。
- 一个 Pod 支持同时挂载不同类型的存储卷,以适配多样化的数据存储需求。
- Pod 内挂载的存储卷可在多个容器间共享,实现容器间数据互通。
- 在 Kubernetes 生产环境中,推荐使用 PVC / PV 体系进行存储卷的挂载与管理。
存储卷访问模式(accessModes)是 Kubernetes 用于描述存储卷能被集群节点如何挂载使用的标准约束,用于定义存储卷的并发访问能力与权限范围。
Kubernetes 定义了三种官方标准访问模式,所有兼容 CSI 的存储服务均遵循该规范:
- ReadWriteOnce:简写为 RWO,即单节点读写。表示存储卷同一时间只能被单个集群节点以读写方式挂载。
- ReadOnlyMany:简写为 ROX,即多节点只读。表示存储卷可被集群内多个节点同时以只读方式挂载。
- ReadWriteMany:简写为 RWX,即多节点读写。表示存储卷可被集群内多个节点同时以读写方式挂载。
不同类型存储卷支持的访问模式,如下表所示。
存储卷绑定模式(volumeBindingMode)是 StorageClass 的核心配置项,用于控制 PVC 何时与 PV 绑定、以及动态 PV 何时创建 Kubernetes。它决定了存储资源的分配时机,直接影响 Pod 调度成功率与多可用区(多 AZ)场景的稳定性。Kubernetes 支持两种绑定模式,即 Immediate 和 WaitForFirstConsumer,未显式配置时默认使用 Immediate。
立即绑定模式,当用户创建 PVC 时,会在集群寻找符合要求的 PV 进行绑定,如果没有找到符合要求的 PV ,则会开启自动创建流程:
- 如果新创建的 PVC 定义了存储类名称,那么存储类对应的 Provisioner 插件将开始自动创建 PV。
- Provisioner 根据 PVC 定义的参数以及存储类定义的参数创建 PV。
- Provisioner 在存储资源池创建数据卷,完成后会结合数据卷信息创建 PV。
总的来说,如果存储类中定义以 Immediate 绑定模式完成 PV 和 PVC 的绑定,那么当 PVC 创建时会立即绑定现有的合适 PV,若没有合适的,则立即新建一个合适的 PV 以供绑定。
WaitForFirstConsumer 绑定模式
延迟绑定模式,当用户创建 PVC 时,不会立即执行绑定 PV 的动作,而是等待这个 PVC 被 Pod 消费,绑定的流程如下:
- 当 Pod 创建并消费到这个PVC 时,系统发现此 PVC 采用的是延迟绑定。
- 调度器继续完成调度功能,并把调度结果同步到 PVC 的 metadata 中。
- Provisioner 发现 PVC 中写入了调度信息,根据调度信息判断目标存储的相关信息。例如:节点、可用区等。
说明
云盘在挂载时,存在可用区的限制,只有可用区一致的的云盘和节点才能挂载在一起,这种限制可能导致使用时存在以下问题。
- 在 A 可用区创建了云盘,但是发现 A 可用区的节点资源不足,Pod 在 B 可用区的节点启动无法挂载。
- 当存在多可用区资源时,难以事先评估规划各个可用区合理的 PV 数量。
当存在多个可用区时,可以采用 WaitForFirstConsumer 绑定模式可以规避以上问题。当用户创建 PVC 时,Provisioner 将不再立即进行 PV 的绑定或新建,而是会等待这个 PVC 被 Pod 消费时才会执行创建过程。在此模式下,在 Pod 启动时,先进行 Pod 的调度,当确认 Pod 的运行位置后,再根据 Pod 所在可用区信息进行 PV 和云盘的创建,从而保障云盘 Pod 运行节点在相同可用区。所以,在具备多个可用区的集群环境下,更加推荐使用 WaitForFirstConsumer 绑定模式。
不同绑定模式的对比,如下表所示。
回收策略(persistentVolumeReclaimPolicy)是 PersistentVolume/StorageClass 的核心配置项,用于控制当绑定该 PV 的 PVC 被删除后,存储卷与数据如何处理,是持久化存储生命周期管理的关键配置。支持 Delete(删除策略)、Retain(保留策略)两种回收策略。