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 驱动组件架构 K8s 控制平面 kube-controller-manager kube-apiserver kube-scheduler CSI Controller CreateVolume / DeleteVolume ControllerPublish / Unpublish CreateSnapshot / DeleteSnapshot K8s 工作节点 kubelet kubelet 注册 CSI 驱动 NodeStage / NodePublish CSI Node Driver NodeGetInfo NodeStageVolume NodePublishVolume External Provisioner 监听 PVC → 调用 CSI Controller External Attacher 处理 VolumeAttachment External Resizer 处理 PVC 扩容请求 K8s 核心组件 CSI 控制器服务 K8s 节点代理 CSI 节点驱动 CSI Sidecar 容器
版本漂移风险点:CSI Controller 和 CSI Node Driver 可能运行在不同版本。升级时若只升级 Controller 而未升级 Node Driver,或版本不兼容,会导致 NodeStageVolume / NodePublishVolume 调用失败,引发 Pod 挂载超时。

2.4 CSI 交互流程:从 PVC 创建到 Pod 挂载

一个完整的 CSI 卷生命周期包含以下关键步骤:

  1. PVC 创建:用户提交 PVC,指定 StorageClass。
  2. External Provisioner 监听:Sidecar 容器检测到未绑定的 PVC,调用 CSI Controller 的 CreateVolume RPC。
  3. 卷创建:CSI Controller 与后端存储交互,创建实际卷,返回卷 ID 和属性。
  4. PV 自动生成:Provisioner 根据返回信息在集群中创建对应的 PV 对象。
  5. PVC 绑定 PV:K8s 控制平面将 PVC 与 PV 绑定。
  6. Pod 调度:使用该 PVC 的 Pod 被调度到某个节点。
  7. ControllerPublishVolume:Attacher Sidecar 调用 CSI Controller,将卷挂载到节点(如云盘挂载到虚拟机)。
  8. NodeStageVolume:kubelet 调用 CSI Node Driver,在节点上执行格式化、挂载到全局目录。
  9. NodePublishVolume:kubelet 调用 CSI Node Driver,将卷绑定到 Pod 的容器路径。
CSI 卷挂载交互流程 用户 / 运维 PVC External Provisioner CSI Controller 存储后端 External Attacher CSI Node Driver Pod 容器路径 ① CreateVolume ② ControllerPublish ③ NodeStage + NodePublish

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 日志 来检测和修复版本漂移。