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

在深入压测沙盘与容量预测之前,必须重新夯实 Kubernetes 存储的四大核心抽象:PV(PersistentVolume)、PVC(PersistentVolumeClaim)、StorageClass 以及 CSI(Container Storage Interface)。它们是所有存储变更、容量规划与故障隔离的基石。

2.1 核心概念与职责边界

K8s 将存储的供给与消费彻底解耦,通过以下四个组件形成完整的生命周期管理链:

组件 职责 生命周期 典型操作对象
PV 集群资源,代表一块真实的存储后端(NFS、Ceph、云盘等) 独立于 Pod,由管理员或动态供给创建 容量、访问模式、回收策略、挂载路径
PVC 用户请求,描述对存储的需求(大小、访问模式、性能) 绑定到 PV 后与 Pod 同生命周期 资源请求、Selector、StorageClass 名称
StorageClass 存储模板,定义动态供给的驱动、参数、回收策略 集群级资源,预先配置 Provisioner、参数、ReclaimPolicy、MountOptions
CSI 驱动 插件化接口,连接 K8s 与具体存储厂商 以 DaemonSet + StatefulSet 形式运行 Identity、Controller、Node 服务
SRE 视角:PV 是“物理资产”,PVC 是“需求订单”,StorageClass 是“商品目录”,CSI 驱动是“物流系统”。容量规划的核心就是跟踪这四者的匹配效率与资源水位。

2.2 PV 与 PVC 绑定机制

绑定过程遵循匹配-绑定-使用三阶段。当 PVC 创建后,K8s 控制平面会尝试寻找满足条件的 PV:

  • 容量匹配:PV 的容量必须 ≥ PVC 请求的容量。
  • 访问模式匹配:必须至少包含 PVC 要求的访问模式(ReadWriteOnce / ReadOnlyMany / ReadWriteMany)。
  • StorageClass 匹配:若 PVC 指定了 StorageClass,则只能绑定到相同 StorageClass 的 PV;若未指定,则绑定到未标记 StorageClass 的 PV。
  • 标签选择器(可选):PVC 可通过 selector 进一步限定 PV 的标签。
# 示例:PVC 定义
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: fast-ssd-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Gi
  storageClassName: fast-ssd
容量规划陷阱:PV 与 PVC 是一对一绑定关系。即使 PV 剩余大量空间,也无法被第二个 PVC 使用。这会导致“容量碎片”——集群总 PV 容量充足,但单个 PVC 因找不到合适 PV 而 Pending。这是压测沙盘需要重点模拟的场景之一。

2.3 StorageClass 与动态供给

StorageClass 实现了存储的按需自助。当 PVC 引用一个 StorageClass 时,Provisioner 会自动创建对应的 PV,并绑定到 PVC。关键参数包括:

参数 说明 压测关注点
provisioner 指定 CSI 驱动名称,如 ebs.csi.aws.com 驱动响应延迟、并发创建上限
parameters 驱动特定参数,如 type: gp3、iops: 3000 参数错误导致创建失败、性能不达标
reclaimPolicy Delete 或 Retain 回收时是否清理后端存储,影响容量释放速度
allowVolumeExpansion 是否允许在线扩容 扩容操作对 IO 的影响、容量预测模型
mountOptions 挂载选项,如 noatime、nfsvers=4.1 错误选项导致挂载失败或性能劣化

2.4 CSI 驱动架构

CSI 是 K8s 存储的插件化标准,取代了早期的 in-tree 驱动。一个完整的 CSI 驱动包含三个 gRPC 服务:

  1. Identity 服务:返回驱动信息、探测能力(是否支持卷扩展、快照等)。
  2. Controller 服务:运行在控制平面,负责创建/删除/快照/扩容卷。
  3. Node 服务:运行在每个 Worker 节点,负责挂载/卸载/格式化卷。
CSI 驱动三层架构与 K8s 组件交互 CSI 驱动三层架构与 K8s 组件交互 K8s API Server PVC / PV / StorageClass Watch & Informer CSI Controller CreateVolume DeleteSnapshot CSI Node NodePublishVolume NodeUnpublishVolume 存储后端 Ceph / AWS EBS / NFS 关键数据流 ① PVC 创建 → API Server → CSI Controller → 存储后端创建卷 → 返回 PV 信息

2.5 访问模式与回收策略

这两个属性直接影响容量规划模型和变更风险:

  • 访问模式:
    • ReadWriteOnce (RWO):单节点读写,最常用,但无法跨 Pod 共享。
    • ReadOnlyMany (ROX):多节点只读,适合配置分发。
    • ReadWriteMany (RWX):多节点读写,依赖 NFS、CephFS 等共享存储,性能瓶颈常见。
  • 回收策略:
    • Retain:PV 释放后保留后端存储,需手动清理。适合有状态数据库,但容易造成容量泄漏。
    • Delete:PV 释放时自动删除后端存储。适合无状态应用,但需确保快照备份。
    • Recycle(已弃用):仅用于 NFS,执行 rm -rf 清理。
压测沙盘模拟点:在沙盘中,我们将构造“Retain 策略下 PVC 删除后 PV 仍占用容量”的场景,验证容量预测模型是否能正确识别这种“幽灵容量”。

2.6 核心概念关系总览

下图展示了从用户请求到后端存储的完整链路,以及各组件在容量规划中的角色:

PV/PVC/StorageClass/CSI 关系总览与容量规划触点 PV/PVC/StorageClass/CSI 关系总览与容量规划触点 用户 / 应用 创建 PVC PVC 请求 100Gi / RWO StorageClass provisioner / parameters PV 容量 100Gi / 状态 Bound CSI 驱动 Controller / Node 存储后端 EBS / Ceph RBD / NFS 容量规划触点:PVC 请求量 → PV 分配量 → 后端实际使用量 → CSI 驱动性能指标

2.7 常见误区与 SRE 避坑清单

误区 后果 正确做法
PVC 与 PV 容量完全相等 无法应对存储增长,频繁触发扩容 PV 容量预留 20% 余量,或启用在线扩容
所有 PVC 使用默认 StorageClass 性能不匹配,关键业务与批处理任务争抢资源 按性能等级定义多个 StorageClass,并设置默认值
忽略 CSI 驱动的资源限制 大规模并发创建 PVC 时 Controller 超时 为 CSI Controller 配置 HPA,并监控 gRPC 调用延迟
Retain 策略下不清理残留 PV 容量泄漏,后端存储被占满 定期巡检 Released 状态的 PV,结合自动化脚本清理