Kubernetes v1.36:卷组快照进入正式发布阶段

卷组快照(Volume Group Snapshots)作为 Alpha 功能在 Kubernetes v1.27 版本中引入, 在 v1.32 版本中进入 Beta 阶段, 并在 v1.34 版本中进入二次 Beta 阶段。 我们很高兴地宣布,在 Kubernetes v1.36 版本中,卷组快照已 正式发布(GA)

卷组快照的支持依赖于一组卷组快照的扩展 API。 这些 API 允许用户为一组卷创建崩溃一致性(crash-consistent)快照。 在后台,Kubernetes 使用标签选择器将多个 PersistentVolumeClaim 对象分组以进行快照。 其主要目标是允许用户将该组快照恢复到新卷,并基于崩溃一致性恢复点恢复工作负载。

此功能仅支持 CSI 卷驱动程序。

卷组快照概述

某些存储系统能够创建多个卷的崩溃一致性快照。组快照是指在同一时间点从多个卷创建的副本。 组快照可用于重建新卷(预填充快照数据),或将现有卷恢复到之前的状态(由快照表示)。

为什么要在 Kubernetes 中添加卷组快照?

Kubernetes 卷插件系统已经提供了一种强大的抽象机制,能够自动完成块存储和文件存储的配置、挂载、调整大小以及快照操作。 所有这些特性都植根于 Kubernetes 追求的工作负载可移植性这一目标。

现有的 VolumeSnapshot API 提供了对持久卷进行快照的功能,以防止数据丢失或损坏。 然而,一些存储系统支持一致性组快照,允许在同一时间点从多个卷创建快照,从而实现写入顺序的一致性。 这对于包含多个卷的应用程序非常有用。例如,应用程序的数据可能存储在一个卷中,而日志存储在另一个卷中。 如果这些卷的快照是在不同的时间创建的,则应用程序的数据将不一致,并且如果从这些快照恢复,则应用程序将无法正常运行。

虽然你可以先让应用程序进入静默状态,然后按顺序创建各个快照,但这个过程可能非常耗时,有时甚至根本无法实现。 一致的组支持可在无需让应用程序进入静默状态的情况下,确保组内所有卷的崩溃一致性。

Kubernetes 卷组快照 API

Kubernetes 对卷组快照的支持依赖于三种用于管理快照的 API:

VolumeGroupSnapshot :由 Kubernetes 用户(或自动化)创建,用于请求为多个持久卷声明创建卷组快照。

VolumeGroupSnapshotContent :由快照控制器为动态创建的 VolumeGroupSnapshot 创建。它包含有关已配置集群资源(组快照)的信息。 该对象与其创建的 VolumeGroupSnapshot 之间存在一对一映射关系。

VolumeGroupSnapshotClass :由集群管理员创建,用于描述应如何创建卷组快照,包括驱动程序信息、删除策略等。

这三种 API 类型被定义为自定义资源定义 (CRD)。在正式版发布中,API 版本已提升至 v1

正式发布中的新内容

  • VolumeGroupSnapshotVolumeGroupSnapshotContentVolumeGroupSnapshotClass 的 API 版本已升级为 groupsnapshot.storage.k8s.io/v1
  • 基于对 bete 测试版反馈的改进,增强了稳定性并修复了若干问题,其中包括 v1beta2 中引入的改进,以确保 restoreSize 报告的准确性。

如何使用 Kubernetes 卷组快照

使用 Kubernetes 创建新的组快照

定义好 VolumeGroupSnapshotClass 对象并选定要一起创建快照的卷后,你可以通过创建 VolumeGroupSnapshot 对象来请求生成新的组快照。

为你想要分组的 PVC 打标签:

% kubectl label pvc pvc-0 group=myGroup
persistentvolumeclaim/pvc-0 labeled

% kubectl label pvc pvc-1 group=myGroup
persistentvolumeclaim/pvc-1 labeled

对于动态配置,必须设置选择器,以便快照控制器可以找到具有匹配标签的 PVC,以便一起进行快照。

apiVersion: groupsnapshot.storage.k8s.io/v1
kind: VolumeGroupSnapshot
metadata:
  name: snapshot-daily-20260422
  namespace: demo-namespace
spec:
  volumeGroupSnapshotClassName: csi-groupSnapclass
  source:
    selector:
      matchLabels:
        group: myGroup

动态配置需要 VolumeGroupSnapshotClass

apiVersion: groupsnapshot.storage.k8s.io/v1
kind: VolumeGroupSnapshotClass
metadata:
  name: csi-groupSnapclass
driver: example.csi.k8s.io
deletionPolicy: Delete

如何使用组快照进行恢复

在恢复时,请求从属于 VolumeGroupSnapshotVolumeSnapshot 对象创建新的 PersistentVolumeClaim。 对属于该组快照的所有卷重复此操作。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: examplepvc-restored-2026-04-22
  namespace: demo-namespace
spec:
  storageClassName: example-sc
  dataSource:
    name: snapshot-0962a745b2bf930bb385b7b50c9b08af471f1a16780726de19429dd9c94eaca0
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOncePod
  resources:
    requests:
      storage: 100Mi

作为存储供应商,如何添加组快照支持?

要实现卷组快照功能,CSI 驱动程序 必须

  • 实现新的组控制器服务。
  • 实现组控制器远程过程调用 (RPC):CreateVolumeGroupSnapshotDeleteVolumeGroupSnapshotGetVolumeGroupSnapshot
  • 添加组控制器能力 CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT

更多细节请参阅 CSI 规范Kubernetes-CSI 驱动开发者指南

如何了解更多信息?

如何参与?

与 Kubernetes 的所有项目一样,这个项目也是来自不同背景的众多贡献者共同努力的成果。 向多年来积极参与、助力本项目达到正式发布(GA)阶段的所有贡献者致以诚挚的谢意:

如果你有兴趣参与 CSI 或 Kubernetes 存储系统任何部分的设计和开发,请加入 Kubernetes 存储特别兴趣小组(SIG)。 我们始终欢迎新的贡献者。

我们还定期召开数据保护工作组会议。 欢迎新成员加入我们的讨论。