4. VolumeSnapshot 与 VolumeSnapshotContent:API 对象详解

在 Kubernetes CSI 快照体系中,VolumeSnapshot 和 VolumeSnapshotContent 是核心的 API 资源,分别对应“用户视角的快照声明”和“集群视角的快照实例”。理解这两个对象的关系与差异,是掌握快照生命周期管理的基础。

4.1 对象层级与命名空间作用域

API 对象 作用域 核心职责 是否可被用户直接创建
VolumeSnapshot 命名空间级(Namespace) 声明快照请求,绑定源 PVC 与快照类 是(用户通过 YAML 或 kubectl 创建)
VolumeSnapshotContent 集群级(Cluster) 代表后端存储中实际存在的快照数据 否(由控制器自动生成或管理员预置)
关键设计原则:VolumeSnapshot 是“用户意图”,VolumeSnapshotContent 是“存储事实”。两者通过 spec.source 和 status.boundVolumeSnapshotContentName 建立双向绑定关系。

4.2 VolumeSnapshot 对象结构

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: my-snapshot
  namespace: production
spec:
  volumeSnapshotClassName: csi-hostpath-snapclass
  source:
    persistentVolumeClaimName: my-pvc
    # 或使用 volumeSnapshotContentName 引用预置快照
  • volumeSnapshotClassName:指定快照类,决定使用哪个 CSI 驱动及快照参数。
  • source.persistentVolumeClaimName:动态快照时指定源 PVC。
  • source.volumeSnapshotContentName:预置快照时指定已存在的 VolumeSnapshotContent。

4.3 VolumeSnapshotContent 对象结构

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
  name: snapcontent-abc123
spec:
  volumeSnapshotRef:
    name: my-snapshot
    namespace: production
  source:
    snapshotHandle: "csi-snap-20250315-001"
    # 或使用 volumeHandle 指定源卷
  driver: hostpath.csi.k8s.io
  deletionPolicy: Delete
  volumeSnapshotClassName: csi-hostpath-snapclass
  • volumeSnapshotRef:指向绑定的 VolumeSnapshot 对象。
  • source.snapshotHandle:CSI 驱动返回的后端快照唯一标识。
  • deletionPolicy:Delete 或 Retain,控制 VolumeSnapshot 删除时是否级联删除后端快照。

4.4 动态快照与预置快照的区别

动态快照和预置快照是两种截然不同的快照供给模式,直接影响运维流程和回退策略。

运维建议:生产环境优先使用动态快照实现自动化备份;预置快照适用于跨集群迁移、存储阵列已有快照导入等场景。
动态快照 vs 预置快照 工作流对比 动态快照流程 用户创建 VolumeSnapshot 快照控制器检测到对象 调用 CSI CreateSnapshot 生成 VolumeSnapshotContent 绑定完成,ReadyToUse=true 预置快照流程 管理员创建 VolumeSnapshotContent 指定 snapshotHandle 和 driver 用户创建 VolumeSnapshot 引用 volumeSnapshotContentName 直接绑定,无需调用 CSI

4.5 核心差异对比表

对比维度 动态快照 预置快照
创建入口 用户创建 VolumeSnapshot 管理员先创建 VolumeSnapshotContent
CSI 调用 必须调用 CreateSnapshot 创建新快照 不调用 CSI,直接引用已有后端快照
VolumeSnapshotContent 来源 控制器自动生成 管理员手动定义或从其他集群导入
适用场景 日常备份、定时快照、自动化运维 跨集群迁移、存储阵列已有快照复用、灾难恢复
deletionPolicy 影响 Delete 时级联删除后端快照 Retain 可保留后端快照,防止误删
绑定时机 异步绑定,需等待 ReadyToUse 同步绑定,创建即 ReadyToUse

4.6 绑定生命周期与状态机

VolumeSnapshot 与 VolumeSnapshotContent 的绑定状态通过 status.readyToUse 和 status.boundVolumeSnapshotContentName 反映。以下是动态快照的典型状态转换:

  1. Pending:VolumeSnapshot 已创建,但尚未找到匹配的 VolumeSnapshotContent。
  2. Creating:控制器调用 CSI CreateSnapshot,后端快照正在创建。
  3. Bound:VolumeSnapshotContent 生成并绑定成功,readyToUse=false 表示后端数据尚未就绪。
  4. Ready:后端快照完成,readyToUse=true,可用于恢复或克隆。
  5. Deleting:用户删除 VolumeSnapshot,根据 deletionPolicy 决定是否删除后端快照。
常见陷阱:动态快照在 readyToUse=true 之前,不能用于 PVC 恢复。预置快照如果 snapshotHandle 指向的后端快照不存在,绑定会失败且不会自动重试。

4.7 预置快照的典型 YAML 示例

# 步骤1:管理员创建 VolumeSnapshotContent(集群级)
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
  name: imported-snap-content
spec:
  deletionPolicy: Retain
  driver: hostpath.csi.k8s.io
  source:
    snapshotHandle: "existing-backup-20250315"
  volumeSnapshotRef:
    name: imported-snap
    namespace: production

---
# 步骤2:用户创建 VolumeSnapshot(命名空间级)
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: imported-snap
  namespace: production
spec:
  source:
    volumeSnapshotContentName: imported-snap-content
回退演练关联:在拓扑图回退场景中,预置快照常用于“跨可用区恢复”——将 A 区存储阵列的快照 handle 导入 B 区的 VolumeSnapshotContent,实现快速回退,避免重新调用 CSI 创建快照的网络延迟。