协会地址:上海市长宁区古北路620号图书馆楼309-313室
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 中新增了哪些内容?
VolumeGroupSnapshot、VolumeGroupSnapshotContent和VolumeGroupSnapshotClass的 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)。欢迎新参会者加入我们的讨论。







