2. K8s 存储基础回顾:PV、PVC、StorageClass、CSI 驱动核心概念与关系

在进行容量规划之前,必须理清 Kubernetes 存储体系中的四个核心抽象层。它们共同构成了从“应用声明”到“实际存储资源”的完整映射链路。理解每个组件的职责以及它们之间的协作关系,是后续所有容量估算与资源建模的基石。

2.1 核心概念速览

概念 缩写 层级 核心职责 生命周期
PersistentVolume PV 集群资源 代表底层存储设备(NFS、Ceph、云盘等)的抽象实例 独立于 Pod,由管理员或动态供给创建
PersistentVolumeClaim PVC 命名空间资源 用户对存储资源的请求(容量、访问模式) 与 Pod 绑定,Pod 删除后 PVC 可保留
StorageClass SC 集群资源 定义存储的“类别”(性能、后端类型、回收策略)及动态供给模板 持久存在,由集群管理员配置
Container Storage Interface CSI 插件层 K8s 与第三方存储系统之间的标准接口协议 以 DaemonSet 或 Deployment 形式运行
容量规划视角: PVC 是“需求端”,PV 是“供给端”,StorageClass 是“供给策略”,CSI 是“供给执行器”。规划的本质就是让这四者在容量维度上对齐。

2.2 概念关系与工作流

下图展示了从用户创建 PVC 到最终挂载到 Pod 的完整链路,以及 StorageClass 和 CSI 在其中扮演的角色。

K8s 存储核心概念关系与工作流 PV / PVC / StorageClass / CSI 关系与工作流 用户 / 应用 PVC (请求) 容量 / 访问模式 / SC 调度 / 绑定 匹配 PV 或触发动态供给 PV (资源) 实际存储后端抽象 CSI 驱动 创建/挂载/格式化 存储后端 NFS / Ceph / 云盘 StorageClass provisioner / 参数 / 回收策略 说明 PVC 引用 StorageClass 调度器根据 SC 选择 CSI CSI 驱动创建 PV

2.3 关键交互机制

2.3.1 PVC 与 PV 的绑定规则

PVC 寻找 PV 时遵循严格的匹配逻辑,容量规划必须确保集群中存在满足条件的 PV 或动态供给能力。

  • 容量匹配:PV 的容量必须 大于等于 PVC 请求的容量。规划时需注意,PV 的容量通常是固定值(如 100Gi),而 PVC 请求 10Gi 时,会绑定一个 100Gi 的 PV,造成 90Gi 的浪费。
  • 访问模式匹配:必须完全一致(ReadWriteOnce / ReadOnlyMany / ReadWriteMany)。
  • StorageClass 匹配:PVC 指定 StorageClass 时,只能绑定同 SC 的 PV;未指定 SC 的 PVC 只能绑定未设置 SC 的 PV。
  • 标签选择器:可选,用于更精细的匹配。
容量规划陷阱:如果集群中所有 PV 的容量都远大于 PVC 请求,会导致大量存储碎片。建议通过 StorageClass 动态供给按需创建 PV,避免手动创建大块 PV 带来的浪费。

2.3.2 StorageClass 与动态供给

StorageClass 是容量规划中最关键的策略点。它定义了如何动态创建 PV,直接影响存储资源的分配效率。

StorageClass 字段 对容量规划的影响
provisioner 指定 CSI 驱动,决定后端存储类型(如 ebs.csi.aws.com、rbd.csi.ceph.com)
parameters 传递后端参数(如云盘类型 gp3、io2,副本数等),影响性能与成本
reclaimPolicy Delete 或 Retain。规划时需考虑 PVC 删除后 PV 是否释放容量
allowVolumeExpansion 是否允许在线扩容。开启后可在容量不足时动态调整,降低规划压力

2.3.3 CSI 驱动的角色

CSI 驱动是 K8s 与存储后端之间的“翻译官”。它负责执行实际的卷创建、挂载、格式化、快照等操作。在容量规划中,CSI 驱动的以下特性需要关注:

  • 卷创建延迟:不同后端创建卷的速度差异很大(云盘通常秒级,NFS 可能毫秒级),影响扩容响应时间。
  • 容量上限:单个卷的最大容量、每个节点的最大挂载数、集群的总卷数上限,这些由 CSI 驱动和后端共同决定。
  • 指标暴露:部分 CSI 驱动支持暴露存储容量指标(如 kubelet_volume_stats_available_bytes),可用于监控和规划。

2.4 概念关系总结

下图以更简洁的方式总结了四个核心概念之间的依赖与数据流关系,帮助建立全局视角。

PV / PVC / StorageClass / CSI 概念关系总结 四层存储抽象关系图 PVC (需求) PV (资源) CSI 驱动 (执行) StorageClass (策略) 规划要点 PVC 定义需求容量 PV 代表实际分配容量 SC 控制供给策略与成本 CSI 决定后端能力上限

2.5 典型交互代码示例

以下是一个完整的 PVC 创建示例,展示了如何引用 StorageClass 并触发动态供给:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: app-data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi
  storageClassName: fast-ssd
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: ebs.csi.aws.com
parameters:
  type: gp3
  iops: "3000"
  throughput: "125"
reclaimPolicy: Delete
allowVolumeExpansion: true
规划提醒:上述示例中 storageClassName: fast-ssd 是关键。如果集群中不存在名为 fast-ssd 的 StorageClass,PVC 将一直处于 Pending 状态。容量规划的第一步,就是确保 StorageClass 的定义与后端容量供给能力匹配。