3. CSI 规范版本演进:v0.x → v1.x → v2.x 关键变化与特性对比
CSI(Container Storage Interface)规范自发布以来,经历了从 v0.x 原型验证到 v1.x 生产就绪,再到 v2.x 功能增强的演进过程。理解各版本之间的关键差异,有助于开发者在选择 CSI 驱动基线版本、设计存储插件架构时做出正确决策。
3.1 版本演进路线图
CSI 规范由 Kubernetes SIG-Storage 与容器社区共同推动,其版本演进遵循语义化版本控制(SemVer)原则。下图展示了从 v0.x 到 v2.x 的核心里程碑与关键特性变化。
版本选择建议:当前生产环境应优先使用 CSI v1.x 或 v2.x 规范。v0.x 仅用于历史兼容或学习参考,不建议在新项目中采用。
3.2 v0.x → v1.x:从原型到生产就绪
CSI v0.x 是社区早期探索阶段发布的版本,主要用于验证接口设计的可行性。v1.0.0 于 2018 年正式发布,标志着 CSI 进入生产就绪阶段。两者之间的变化是颠覆性的,主要体现在以下方面:
| 对比维度 | CSI v0.x | CSI v1.x |
|---|---|---|
| 接口稳定性 | 实验性,频繁变更 | GA(General Availability),向后兼容 |
| RPC 分组 | Identity、Controller、Node 三组 | 保留三组,但接口签名重新设计 |
| 动态 Provisioning | 不支持 | 支持 CreateVolume/DeleteVolume |
| 卷挂载 | 仅支持预挂载 | 支持 NodePublishVolume/NodeUnpublishVolume |
| 卷扩展 | 不支持 | 支持 ControllerExpandVolume |
| 错误处理 | 错误码不完整 | 标准化 gRPC 错误码与重试语义 |
| gRPC 版本 | v1.0.x | v1.1.x+ |
迁移要点:从 v0.x 迁移到 v1.x 时,几乎所有 RPC 接口的请求/响应消息结构都发生了变化。建议直接基于 v1.x 重新实现 CSI 驱动,而非尝试增量修改。
3.3 v1.x → v2.x:功能增强与生态扩展
CSI v2.0 于 2019 年发布,在保持 v1.x 核心接口稳定的基础上,引入了多项关键功能扩展。v2.x 并非对 v1.x 的颠覆,而是兼容性增强版本。
3.3.1 新增核心功能
- 卷快照(Volume Snapshot):新增
CreateSnapshot/DeleteSnapshot/ListSnapshots接口,支持从快照恢复卷。 - 卷克隆(Volume Clone):通过
CreateVolume的volume_content_source参数,支持从已有卷创建克隆。 - 拓扑感知调度(Topology-aware Scheduling):新增
topology字段,允许存储系统向调度器暴露拓扑约束。 - 卷扩展增强(Volume Expansion):支持在线扩展(无需卸载卷)和离线扩展。
- 卷健康监控(Volume Health):新增
NodeGetVolumeStats接口,提供卷使用量与健康状态。
3.3.2 接口变更清单
| RPC 接口 | v1.x 状态 | v2.x 变化 |
|---|---|---|
CreateVolume |
已有 | 新增 volume_content_source 参数(支持克隆) |
CreateSnapshot |
不存在 | 新增 |
DeleteSnapshot |
不存在 | 新增 |
ListSnapshots |
不存在 | 新增 |
ControllerExpandVolume |
已有 | 新增 volume_capability 验证增强 |
NodeGetVolumeStats |
不存在 | 新增 |
ValidateVolumeCapabilities |
已有 | 返回信息扩展 |
3.4 版本兼容性矩阵
CSI 规范版本与 Kubernetes 版本之间存在对应关系。下表列出了主流 CSI 版本与 Kubernetes 的兼容性:
| CSI 规范版本 | 最低 Kubernetes 版本 | 推荐 Kubernetes 版本 | 备注 |
|---|---|---|---|
| v0.3 | 1.9 | 1.10 | Alpha 特性,需显式启用 |
| v1.0 | 1.13 | 1.14+ | GA,默认启用 |
| v1.1 | 1.14 | 1.15+ | 卷扩展支持 |
| v1.2 | 1.15 | 1.16+ | 拓扑感知支持 |
| v2.0 | 1.17 | 1.18+ | 卷快照/克隆支持 |
| v2.1 | 1.19 | 1.20+ | 卷健康监控支持 |
注意:CSI 驱动实现时,应声明其支持的规范版本范围。Kubernetes 侧通过
CSIDriver 对象的 version 字段进行版本协商。不匹配的版本可能导致卷操作失败。
3.5 版本选择决策树
在实际项目中,选择 CSI 规范版本应综合考虑存储后端能力、Kubernetes 集群版本以及所需功能。下图提供了版本选择的决策参考:
3.6 关键版本特性总结
下表汇总了 CSI 各主要版本的核心能力差异,便于快速对比:
| 特性 | v0.x | v1.0 | v1.1 | v1.2 | v2.0 | v2.1 |
|---|---|---|---|---|---|---|
| 动态 Provisioning | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 卷挂载/卸载 | 部分 | ✓ | ✓ | ✓ | ✓ | ✓ |
| 卷扩展 | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ |
| 拓扑感知 | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ |
| 卷快照 | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ |
| 卷克隆 | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ |
| 卷健康监控 | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ |
最佳实践:新开发的 CSI 驱动应至少基于 v1.2 规范实现,以获得拓扑感知能力。若存储后端支持快照/克隆功能,建议直接采用 v2.0+ 规范。所有 v1.x 驱动均可通过增量添加新接口的方式升级到 v2.x,无需重构。