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 在其中扮演的角色。
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 概念关系总结
下图以更简洁的方式总结了四个核心概念之间的依赖与数据流关系,帮助建立全局视角。
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 的定义与后端容量供给能力匹配。