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 动态快照与预置快照的区别
动态快照和预置快照是两种截然不同的快照供给模式,直接影响运维流程和回退策略。
运维建议:生产环境优先使用动态快照实现自动化备份;预置快照适用于跨集群迁移、存储阵列已有快照导入等场景。
4.5 核心差异对比表
| 对比维度 | 动态快照 | 预置快照 |
|---|---|---|
| 创建入口 | 用户创建 VolumeSnapshot | 管理员先创建 VolumeSnapshotContent |
| CSI 调用 | 必须调用 CreateSnapshot 创建新快照 |
不调用 CSI,直接引用已有后端快照 |
| VolumeSnapshotContent 来源 | 控制器自动生成 | 管理员手动定义或从其他集群导入 |
| 适用场景 | 日常备份、定时快照、自动化运维 | 跨集群迁移、存储阵列已有快照复用、灾难恢复 |
| deletionPolicy 影响 | Delete 时级联删除后端快照 | Retain 可保留后端快照,防止误删 |
| 绑定时机 | 异步绑定,需等待 ReadyToUse | 同步绑定,创建即 ReadyToUse |
4.6 绑定生命周期与状态机
VolumeSnapshot 与 VolumeSnapshotContent 的绑定状态通过 status.readyToUse 和 status.boundVolumeSnapshotContentName 反映。以下是动态快照的典型状态转换:
- Pending:VolumeSnapshot 已创建,但尚未找到匹配的 VolumeSnapshotContent。
- Creating:控制器调用 CSI
CreateSnapshot,后端快照正在创建。 - Bound:VolumeSnapshotContent 生成并绑定成功,
readyToUse=false表示后端数据尚未就绪。 - Ready:后端快照完成,
readyToUse=true,可用于恢复或克隆。 - 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 创建快照的网络延迟。