2. CSI驱动与VolumeSnapshot:CSI规范对快照的支持、CSI Driver与VolumeSnapshot的交互流程

Kubernetes 从 v1.12 引入 Volume Snapshot 的 alpha 支持,并在 v1.20 正式 GA。其底层依赖 CSI(Container Storage Interface)规范对快照操作的原生定义。理解 CSI 驱动如何实现快照能力,以及控制面与数据面的交互流程,是掌握 VolumeSnapshot 版本差异校验的基础。

2.1 CSI规范对快照的支持

CSI 规范自 v1.0 起定义了 CreateSnapshot、DeleteSnapshot、ListSnapshots 三个 RPC 方法,以及对应的 VolumeSnapshotContent 资源模型。CSI 驱动必须实现这些 RPC 才能被 Kubernetes 快照控制器调用。

CSI RPC 方法 功能描述 Kubernetes 对应资源 版本要求
CreateSnapshot 在存储后端创建指定卷的时间点快照 VolumeSnapshotContent CSI v1.0+
DeleteSnapshot 删除存储后端上已存在的快照 VolumeSnapshotContent CSI v1.0+
ListSnapshots 列举存储后端上的快照列表(支持过滤) VolumeSnapshotContent 列表 CSI v1.0+
版本差异校验要点: CSI 驱动在 v1.0 到 v1.5 之间对快照 RPC 的输入输出字段有多次调整。例如,CreateSnapshotRequest 在 CSI v1.1 新增了 SourceVolumeID 校验,v1.3 增加了 Secrets 字段。校验时需确认 CSI 驱动版本与 Kubernetes 快照控制器版本匹配。

2.2 CSI Driver与VolumeSnapshot的交互流程

一次完整的 VolumeSnapshot 创建流程涉及 API Server、快照控制器(snapshot-controller)、CSI 驱动(CSI Driver) 以及 存储后端 四个角色。下图展示了核心交互步骤:

CSI Driver与VolumeSnapshot交互流程 CSI Driver 与 VolumeSnapshot 交互流程 API Server etcd 存储 snapshot-controller 控制面协调 CSI Driver Sidecar 容器 存储后端 快照存储 ① 创建 VolumeSnapshot ② 调用 CreateSnapshot RPC ③ 后端快照创建 ④ 返回快照 ID ⑤ 更新 VolumeSnapshotContent ⑥ 状态持久化 版本差异校验关键点: • CSI v1.0~v1.2:CreateSnapshot 返回 snapshot_id 即可,无 ReadyToUse 字段 • CSI v1.3+:必须返回 ReadyToUse=true 或通过 ListSnapshots 轮询确认 • Kubernetes v1.20+:快照控制器依赖 ReadyToUse 字段判断快照是否可用

2.3 交互步骤详解

  1. 用户创建 VolumeSnapshot 对象:用户通过 kubectl 或 API 创建 VolumeSnapshot CR,指定 source(PVC 名称)和 volumeSnapshotClassName。
  2. snapshot-controller 监听并协调:控制器 watch 到 VolumeSnapshot 对象后,查找对应的 VolumeSnapshotClass,并调用 CSI 驱动的 CreateSnapshot RPC。
  3. CSI Driver 调用存储后端:CSI 驱动将 RPC 请求转换为存储后端的快照 API(如 AWS EBS CreateSnapshot、Ceph RBD snap create)。
  4. 存储后端返回快照标识:后端创建完成后返回 snapshot_id 和 creation_time。
  5. CSI Driver 返回响应:CSI 驱动将后端返回的信息封装为 CreateSnapshotResponse,包含 snapshot_id、ready_to_use、creation_time 等字段。
  6. snapshot-controller 创建 VolumeSnapshotContent:控制器根据 CSI 响应创建 VolumeSnapshotContent 对象,绑定到 VolumeSnapshot,并更新状态为 ReadyToUse。
版本差异校验实践: 在 Kubernetes v1.19 及之前版本,快照控制器不会检查 ready_to_use 字段,而是直接认为快照可用。从 v1.20 开始,控制器必须等待 ready_to_use=true 才标记 VolumeSnapshot 为就绪。升级 CSI 驱动时,需确认驱动版本是否支持 ready_to_use 语义。

2.4 CSI Driver Sidecar 容器角色

CSI 驱动通常以 DaemonSet 形式部署,但快照相关的控制面操作由 csi-snapshotter sidecar 容器完成。该 sidecar 负责:

  • 监听 VolumeSnapshotContent 对象的创建/删除事件
  • 调用 CSI 驱动的 Unix Domain Socket 执行快照 RPC
  • 将 CSI 响应写回 VolumeSnapshotContent 的 status 字段
Sidecar 组件 镜像名称 负责的 CSI RPC Kubernetes 版本兼容
csi-snapshotter registry.k8s.io/sig-storage/csi-snapshotter CreateSnapshot, DeleteSnapshot, ListSnapshots v1.20+ (GA)
csi-provisioner registry.k8s.io/sig-storage/csi-provisioner CreateVolume, DeleteVolume v1.14+
csi-attacher registry.k8s.io/sig-storage/csi-attacher ControllerPublishVolume, ControllerUnpublishVolume v1.14+
版本差异校验警告: csi-snapshotter 的版本必须与 Kubernetes 快照控制器版本匹配。例如,csi-snapshotter v3.x 仅支持 Kubernetes v1.20+,而 v2.x 支持 v1.17~v1.19。使用不匹配的版本会导致快照创建失败或状态不一致。

2.5 快照删除与回收流程

VolumeSnapshot 的删除流程与创建类似,但方向相反:

  1. 用户删除 VolumeSnapshot 对象(或设置 deletionPolicy: Delete)
  2. snapshot-controller 检测到删除事件,调用 CSI 驱动的 DeleteSnapshot RPC
  3. CSI 驱动通知存储后端删除快照数据
  4. 存储后端确认删除后,CSI 驱动返回成功响应
  5. snapshot-controller 删除对应的 VolumeSnapshotContent 对象

当 deletionPolicy: Retain 时,VolumeSnapshotContent 会保留在集群中,但 VolumeSnapshot 对象被删除,用户需要手动管理 VolumeSnapshotContent 的生命周期。

版本差异校验清单:
  • CSI 驱动版本 ≥ 1.0 且实现了 CreateSnapshot/DeleteSnapshot RPC
  • csi-snapshotter sidecar 版本与 Kubernetes 版本兼容
  • snapshot-controller 版本 ≥ v4.0(Kubernetes v1.20+)
  • VolumeSnapshotClass 中 driver 字段与 CSI 驱动名称一致
  • 存储后端支持快照功能(如 Ceph RBD、AWS EBS、GCE PD)