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驱动在其中扮演的桥梁角色:
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驱动之间的生命周期依赖关系,以及卷扩容操作在其中的触发路径:
2.7 核心概念总结清单
在进入卷扩容清单化验收之前,请确保对以下概念形成清晰的认知:
- PV是资源,PVC是请求:PV由管理员或动态供给创建,PVC是用户对存储资源的声明,两者通过容量、访问模式、StorageClass完成绑定。
- StorageClass是动态供给模板:它定义了provisioner、参数、回收策略和扩容开关(allowVolumeExpansion),是版本漂移校准的第一道检查点。
- CSI驱动是存储插件标准:CSI驱动版本必须与K8s集群版本兼容,特别是ControllerExpandVolume和NodeExpandVolume的RPC实现状态。
- 卷扩容是三层联动:PVC修改 → 控制器扩容PV → 节点扩容文件系统,任何一层出现版本不匹配都会导致扩容失败。
- 版本漂移的隐蔽性:PV/PVC/StorageClass的API版本长期稳定,但CSI驱动的特性门控、RPC版本、节点注册机制在不同K8s版本间存在差异,必须纳入验收清单。