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

在深入卷扩容清单化验收之前,必须重新校准Kubernetes存储体系的四个核心抽象。这些抽象层共同构成了声明式存储供给与生命周期管理的基础,也是版本漂移校准中需要逐层检查的关键对象。

2.1 四层存储抽象模型

Kubernetes将存储从“物理设备”解耦为“资源声明”与“实际供给”两层,再通过动态供给机制和插件接口实现标准化。下表总结了每个抽象层的职责与典型对象:

抽象层 API对象 核心职责 版本漂移关注点
存储资源 PersistentVolume (PV) 集群管理员预置或动态创建的存储后端抽象,包含容量、访问模式、回收策略 PV的provisioner、volumeMode、nodeAffinity字段版本差异
资源请求 PersistentVolumeClaim (PVC) 用户对存储资源的请求声明,指定容量、访问模式、StorageClass选择器 PVC的storageClassName、volumeName绑定逻辑在1.20+的变化
动态供给模板 StorageClass 定义动态PV的provisioner、参数、回收策略、卷绑定模式、扩容策略 allowVolumeExpansion、reclaimPolicy、mountOptions的版本兼容性
存储插件接口 CSIDriver / CSINode 容器存储接口(CSI)驱动注册、节点拓扑、卷挂载能力声明 CSIDriver的attachRequired、podInfoOnMount、volumeLifecycleModes版本演进
校准提示: 在版本漂移场景中,PV/PVC/StorageClass的API版本(v1稳定版)通常不变,但CSI驱动的VolumeGroupSnapshot、VolumePopulator等特性门控在不同K8s版本间差异显著,是扩容验收的隐性风险点。

2.2 声明式存储供给流程

下图展示了从PVC创建到PV绑定、Pod挂载的完整声明式流程,以及CSI驱动在其中扮演的桥梁角色:

K8s声明式存储供给流程 声明式存储供给流程(PVC → PV → Pod) 用户/开发者 创建PVC PersistentVolumeClaim 动态供给 StorageClass 调用CSI CSI Driver 创建PV并绑定 PersistentVolume 引用PVC Pod 卷挂载 容器 /data 说明: 动态供给流程中,StorageClass引用CSI驱动创建PV,PVC与PV完成绑定后,Pod通过volumeMount引用PVC实现存储挂载。

2.3 CSI驱动架构与版本漂移关键点

CSI(Container Storage Interface)是Kubernetes与外部存储系统之间的标准插件协议。CSI驱动的版本与Kubernetes集群版本之间的兼容性,是卷扩容验收中最容易忽略的漂移源。

CSI驱动架构包含三个核心组件:

  • Driver Registrar(注册器):以DaemonSet运行,负责将CSI驱动注册到kubelet的插件注册机制中。
  • Controller Plugin(控制器插件):以Deployment运行,处理CreateVolume、DeleteVolume、ControllerExpandVolume等控制面操作。
  • Node Plugin(节点插件):以DaemonSet运行,处理NodePublishVolume、NodeExpandVolume等节点级挂载与扩容操作。
版本漂移校准要点: CSI驱动的ControllerExpandVolume能力在K8s 1.16+(alpha)、1.18+(beta)、1.24+(GA)逐步稳定。如果集群版本低于1.24且未开启ExpandCSIVolumes特性门控,则卷扩容操作将无法通过CSI驱动完成,这是清单化验收中必须前置检查的项目。

2.4 卷扩容的存储类配置

StorageClass中的allowVolumeExpansion字段是卷扩容的“开关”。该字段在K8s 1.11引入(alpha),1.16进入beta并默认启用。以下是一个支持在线扩容的StorageClass示例:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: csi-expandable-sc
provisioner: csi.example.com
parameters:
  type: ssd
  iopsPerGB: "10"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true    # 关键字段:启用卷扩容
mountOptions:
  - discard
验收风险提示: 即使StorageClass设置了allowVolumeExpansion: true,如果CSI驱动未实现ControllerExpandVolume或NodeExpandVolume的RPC接口,扩容请求仍会静默失败。验收清单中必须包含CSI驱动版本与集群版本的兼容性校验步骤。

2.5 PV/PVC/StorageClass版本演进对照

下表整理了K8s主要版本中存储核心对象的API版本与特性状态变化,帮助识别版本漂移的边界:

K8s版本 PV/PVC API版本 StorageClass API版本 CSIDriver API版本 卷扩容特性状态
1.13 v1 (GA) v1 (GA) v1beta1 alpha (特性门控)
1.16 v1 v1 v1beta1 beta (默认开启)
1.18 v1 v1 v1beta1 beta (ExpandCSIVolumes)
1.22 v1 v1 v1 (GA) beta
1.24 v1 v1 v1 GA (无需特性门控)
1.28+ v1 v1 v1 GA + 在线扩容增强

2.6 存储对象生命周期关系图

下图展示了PV、PVC、StorageClass、CSI驱动之间的生命周期依赖关系,以及卷扩容操作在其中的触发路径:

存储对象生命周期与扩容路径 存储对象生命周期与卷扩容触发路径 StorageClass allowVolumeExpansion PersistentVolumeClaim spec.resources.requests.storage PersistentVolume spec.capacity.storage CSI Driver ControllerExpandVolume 引用 绑定 扩容请求 更新PV容量 Node Plugin NodeExpandVolume 文件系统扩容 扩容路径: 用户修改PVC的storage字段 → kube-controller-manager检测到变化 → 调用CSI ControllerExpandVolume → 更新PV容量 → 节点上执行NodeExpandVolume完成文件系统扩容。

2.7 核心概念总结清单

在进入卷扩容清单化验收之前,请确保对以下概念形成清晰的认知:

  1. PV是资源,PVC是请求:PV由管理员或动态供给创建,PVC是用户对存储资源的声明,两者通过容量、访问模式、StorageClass完成绑定。
  2. StorageClass是动态供给模板:它定义了provisioner、参数、回收策略和扩容开关(allowVolumeExpansion),是版本漂移校准的第一道检查点。
  3. CSI驱动是存储插件标准:CSI驱动版本必须与K8s集群版本兼容,特别是ControllerExpandVolume和NodeExpandVolume的RPC实现状态。
  4. 卷扩容是三层联动:PVC修改 → 控制器扩容PV → 节点扩容文件系统,任何一层出现版本不匹配都会导致扩容失败。
  5. 版本漂移的隐蔽性:PV/PVC/StorageClass的API版本长期稳定,但CSI驱动的特性门控、RPC版本、节点注册机制在不同K8s版本间存在差异,必须纳入验收清单。