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 服务:
- Identity 服务:返回驱动信息、探测能力(是否支持卷扩展、快照等)。
- Controller 服务:运行在控制平面,负责创建/删除/快照/扩容卷。
- Node 服务:运行在每个 Worker 节点,负责挂载/卸载/格式化卷。
2.5 访问模式与回收策略
这两个属性直接影响容量规划模型和变更风险:
- 访问模式:
ReadWriteOnce (RWO):单节点读写,最常用,但无法跨 Pod 共享。ReadOnlyMany (ROX):多节点只读,适合配置分发。ReadWriteMany (RWX):多节点读写,依赖 NFS、CephFS 等共享存储,性能瓶颈常见。
- 回收策略:
Retain:PV 释放后保留后端存储,需手动清理。适合有状态数据库,但容易造成容量泄漏。Delete:PV 释放时自动删除后端存储。适合无状态应用,但需确保快照备份。Recycle(已弃用):仅用于 NFS,执行rm -rf清理。
压测沙盘模拟点:在沙盘中,我们将构造“Retain 策略下 PVC 删除后 PV 仍占用容量”的场景,验证容量预测模型是否能正确识别这种“幽灵容量”。
2.6 核心概念关系总览
下图展示了从用户请求到后端存储的完整链路,以及各组件在容量规划中的角色:
2.7 常见误区与 SRE 避坑清单
| 误区 | 后果 | 正确做法 |
|---|---|---|
| PVC 与 PV 容量完全相等 | 无法应对存储增长,频繁触发扩容 | PV 容量预留 20% 余量,或启用在线扩容 |
| 所有 PVC 使用默认 StorageClass | 性能不匹配,关键业务与批处理任务争抢资源 | 按性能等级定义多个 StorageClass,并设置默认值 |
| 忽略 CSI 驱动的资源限制 | 大规模并发创建 PVC 时 Controller 超时 | 为 CSI Controller 配置 HPA,并监控 gRPC 调用延迟 |
| Retain 策略下不清理残留 PV | 容量泄漏,后端存储被占满 | 定期巡检 Released 状态的 PV,结合自动化脚本清理 |