Kubernetes v1.36:将卷组快照推进到GA

原文链接:https://kubernetes.io/blog/2026/05/08/kubernetes-v1-36-volume-group-snapshot-ga/


卷组快照在 Kubernetes v1.27 中作为 Alpha 特性被引入,在 v1.32 中提升为 Beta,并在 v1.34 中进入第二个 Beta 阶段。我们很高兴地宣布,在 Kubernetes v1.36 版本中,卷组快照支持已达到 正式发布(GA

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

此特性仅适用于 CSI 卷驱动程序。

卷组快照概述

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

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

Kubernetes 卷插件系统已提供了一个强大的抽象层,能够自动化块存储和文件存储的供应、挂载、调整大小和快照操作。支撑所有这些特性的是 Kubernetes 的工作负载可移植性目标。

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

虽然您可以先静默应用,然后依次创建单独的快照,但这一过程可能耗时甚至不可行。一致性组支持提供了组内所有卷的崩溃一致性,无需应用静默。

用于卷组快照的 Kubernetes API

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

VolumeGroupSnapshot

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

VolumeGroupSnapshotContent

由快照控制器为动态创建的 VolumeGroupSnapshot 创建。它包含了预置的集群资源(组快照)的信息。该对象与其创建的 VolumeGroupSnapshot 以一对一方式绑定。

VolumeGroupSnapshotClass

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

这三种 API 种类被定义为 CustomResourceDefinitions(CRD)。在 GA 版本中,API 版本已提升为 v1

GA 中新增了哪些内容?

  • VolumeGroupSnapshotVolumeGroupSnapshotContentVolumeGroupSnapshotClass 的 API 版本已提升为 groupsnapshot.storage.k8s.io/v1
  • 基于 Beta 版本的反馈进行了稳定性增强和错误修复,包括 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

对于动态制备(dynamic provisioning),必须设置一个选择器(selector),以便快照控制器(snapshot controller)能够找到带有匹配标签的 PVC(持久卷声明)并一起进行快照。

apiVersion: groupsnapshot.storage.k8s.io/v1kind: VolumeGroupSnapshotmetadata:name: snapshot-daily-20260422namespace: demo-namespacespec:volumeGroupSnapshotClassName: csi-groupSnapclasssource:selector:matchLabels:group: myGroup


动态配置需要 `VolumeGroupSnapshotClass`(卷组快照类):

apiVersion: groupsnapshot.storage.k8s.io/v1kind: VolumeGroupSnapshotClassmetadata:name: csi-groupSnapclassdriver: example.csi.k8s.iodeletionPolicy: Delete


### 如何使用 group snapshot(组快照)进行恢复

在恢复时,请求从属于 `VolumeGroupSnapshot`(卷组快照)的 `VolumeSnapshot`(卷快照)对象创建一个新的 `PersistentVolumeClaim`(持久卷声明)。对所有属于该卷组快照的卷重复此操作。

apiVersion: v1kind: PersistentVolumeClaimmetadata:name: examplepvc-restored-2026-04-22namespace: demo-namespacespec:storageClassName: example-scdataSource:name: snapshot-0962a745b2bf930bb385b7b50c9b08af471f1a16780726de19429dd9c94eaca0kind: VolumeSnapshotapiGroup: snapshot.storage.k8s.ioaccessModes:- ReadWriteOncePodresources:requests:storage: 100Mi


## 作为一名存储厂商,如何为组快照添加支持?

要实现卷组快照(volume group snapshot)功能,CSI 驱动程序**必须**:

-   实现一个新的组控制器服务(group controller service)。
-   实现组控制器 RPC(Remote Procedure Call):`CreateVolumeGroupSnapshot`、`DeleteVolumeGroupSnapshot` 和 `GetVolumeGroupSnapshot`。
-   添加组控制器能力(group controller capability)`CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT`。

有关更多详细信息,请参阅 [CSI 规范](https://github.com/container-storage-interface/spec/blob/master/spec.md) 和 [Kubernetes-CSI 驱动开发者指南](https://kubernetes-csi.github.io/docs/)。

## 如何了解更多?

-   卷组快照功能的[设计规范](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3476-volume-group-snapshot)。
-   卷组快照 API 和控制器的[代码仓库](https://github.com/kubernetes-csi/external-snapshotter)。
-   关于组快照功能的 CSI [文档](https://kubernetes-csi.github.io/docs/)。

## 如何参与?

与所有 Kubernetes 项目一样,本项目是众多来自不同背景的贡献者共同努力的成果。代表 SIG Storage,我想向所有多年来挺身而出、帮助项目达到 GA(General Availability)的贡献者表示衷心的感谢:

-   Ben Swartzlander ([bswartz](https://github.com/bswartz))
-   Cici Huang ([cici37](https://github.com/cici37))
-   Darshan Murthy ([darshansreenivas](https://github.com/darshansreenivas))
-   Hemant Kumar ([gnufied](https://github.com/gnufied))
-   James Defelice ([jdef](https://github.com/jdef))
-   Jan Šafránek ([jsafrane](https://github.com/jsafrane))
-   Madhu Rajanna ([Madhu-1](https://github.com/Madhu-1))
-   Manish M Yathnalli ([manishym](https://github.com/manishym))
-   Michelle Au ([msau42](https://github.com/msau42))
-   Niels de Vos ([nixpanic](https://github.com/nixpanic))
-   Leonardo Cecchi ([leonardoce](https://github.com/leonardoce))
-   Rakshith R ([Rakshith-R](https://github.com/Rakshith-R))
-   Raunak Shah ([RaunakShah](https://github.com/RaunakShah))
-   Saad Ali ([saad-ali](https://github.com/saad-ali))
-   Wei Duan ([duanwei33](https://github.com/duanwei33))
-   Xing Yang ([xing-yang](https://github.com/xing-yang))
-   Yati Padia ([yati1998](https://github.com/yati1998))

如果您有兴趣参与 CSI 或 Kubernetes 存储系统任何部分的设计与开发,请加入 [Kubernetes 存储特别兴趣小组](https://github.com/kubernetes/community/tree/master/sig-storage)(SIG)。我们始终欢迎新贡献者。

我们还定期举行[数据保护工作组会议](https://github.com/kubernetes/community/tree/master/wg-data-protection)。欢迎新参会者加入我们的讨论。