2. K8s存储架构基础:PV/PVC/StorageClass核心概念、CSI架构组件与交互流程
2.1 存储抽象层:从物理卷到声明式消费
Kubernetes 存储体系的核心设计哲学是“存储供给与消费分离”。集群管理员负责准备存储资源,应用开发者只需声明需求。这一层抽象由三个核心资源对象完成:PersistentVolume (PV)、PersistentVolumeClaim (PVC) 和 StorageClass。
| 资源对象 | 角色 | 生命周期 | 创建者 |
|---|---|---|---|
| PV | 存储后端(NFS、Ceph、云盘等)的集群级抽象 | 独立于 Pod,删除 PVC 后 PV 可保留或回收 | 集群管理员 或 动态供给驱动 |
| PVC | 用户对存储的请求(容量、访问模式) | 与 Pod 绑定,Pod 删除后 PVC 默认保留 | 应用开发者 / 运维 |
| StorageClass | 存储类模板(类型、参数、回收策略) | 持久存在,供动态供给使用 | 集群管理员 |
关键原则:PV 是资源,PVC 是请求。PVC 与 PV 通过
spec 匹配(容量、访问模式、StorageClass 名称)完成绑定。绑定后,Pod 通过 volumes 引用 PVC 即可使用存储。
2.2 动态供给与 StorageClass 驱动
手动创建 PV 的方式称为静态供给,在大规模集群中不可持续。动态供给允许 PVC 按需自动创建 PV,其核心是 StorageClass 中定义的 provisioner 字段。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: csi-driver.example.com # 指向 CSI 驱动
parameters:
type: pd-ssd
replication-type: none
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
- provisioner:指定 CSI 驱动的标识符,K8s 控制平面通过该标识符调用 CSI 接口创建/删除卷。
- parameters:传递给 CSI 驱动的后端存储参数(如云盘类型、IOPS 限制)。
- reclaimPolicy:PV 被释放后的处理方式(Delete / Retain)。
- volumeBindingMode:控制 PVC 与 PV 绑定时机(Immediate / WaitForFirstConsumer)。
升级场景提示:CSI 驱动升级时,StorageClass 中的
provisioner 字段通常不变,但驱动内部实现的 API 版本可能发生漂移。这是“版本漂移校准”问题的根源之一。
2.3 CSI 架构组件全景
Container Storage Interface (CSI) 是 K8s 与存储后端之间的标准插件接口。CSI 驱动在 K8s 集群中部署为三个核心组件:
版本漂移风险点:CSI Controller 和 CSI Node Driver 可能运行在不同版本。升级时若只升级 Controller 而未升级 Node Driver,或版本不兼容,会导致
NodeStageVolume / NodePublishVolume 调用失败,引发 Pod 挂载超时。
2.4 CSI 交互流程:从 PVC 创建到 Pod 挂载
一个完整的 CSI 卷生命周期包含以下关键步骤:
- PVC 创建:用户提交 PVC,指定 StorageClass。
- External Provisioner 监听:Sidecar 容器检测到未绑定的 PVC,调用 CSI Controller 的
CreateVolumeRPC。 - 卷创建:CSI Controller 与后端存储交互,创建实际卷,返回卷 ID 和属性。
- PV 自动生成:Provisioner 根据返回信息在集群中创建对应的 PV 对象。
- PVC 绑定 PV:K8s 控制平面将 PVC 与 PV 绑定。
- Pod 调度:使用该 PVC 的 Pod 被调度到某个节点。
- ControllerPublishVolume:Attacher Sidecar 调用 CSI Controller,将卷挂载到节点(如云盘挂载到虚拟机)。
- NodeStageVolume:kubelet 调用 CSI Node Driver,在节点上执行格式化、挂载到全局目录。
- NodePublishVolume:kubelet 调用 CSI Node Driver,将卷绑定到 Pod 的容器路径。
2.5 版本漂移的根源:CSI 规范版本与驱动实现版本
CSI 驱动升级涉及两个维度的版本:
| 版本类型 | 说明 | 漂移风险 |
|---|---|---|
| CSI 规范版本 | CSI 社区定义的 RPC 接口版本(如 v1.5、v1.6) | K8s 1.20+ 要求 CSI 驱动至少支持 v1.0+;升级规范版本可能导致 RPC 签名变更 |
| 驱动实现版本 | 具体存储厂商的 CSI 驱动镜像版本(如 v3.2.1) | Controller 与 Node 组件版本不一致,或与 K8s 版本不兼容 |
| Sidecar 版本 | External Provisioner / Attacher / Resizer 版本 | Sidecar 与 CSI Controller 之间的 gRPC 通信协议版本不匹配 |
校准核心思路:在升级前,必须确认 CSI Controller、CSI Node Driver、所有 Sidecar 容器以及 K8s 集群版本之间的兼容性矩阵。本课程后续章节将详细讲解如何通过
CSIDriver 对象、VolumeAttachment 状态和 kubelet 日志 来检测和修复版本漂移。