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。
正式发布中的新内容
VolumeGroupSnapshot、VolumeGroupSnapshotContent和VolumeGroupSnapshotClass的 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
如何使用组快照进行恢复
在恢复时,请求从属于 VolumeGroupSnapshot 的 VolumeSnapshot 对象创建新的 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):
CreateVolumeGroupSnapshot、DeleteVolumeGroupSnapshot和GetVolumeGroupSnapshot。 - 添加组控制器能力
CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT。
更多细节请参阅 CSI 规范 和 Kubernetes-CSI 驱动开发者指南。
如何了解更多信息?
如何参与?
与 Kubernetes 的所有项目一样,这个项目也是来自不同背景的众多贡献者共同努力的成果。 向多年来积极参与、助力本项目达到正式发布(GA)阶段的所有贡献者致以诚挚的谢意:
- Ben Swartzlander (bswartz)
- Cici Huang (cici37)
- Darshan Murthy (darshansreenivas)
- Hemant Kumar (gnufied)
- James Defelice (jdef)
- Jan Šafránek (jsafrane)
- Madhu Rajanna (Madhu-1)
- Manish M Yathnalli (manishym)
- Michelle Au (msau42)
- Niels de Vos (nixpanic)
- Leonardo Cecchi (leonardoce)
- Rakshith R (Rakshith-R)
- Raunak Shah (RaunakShah)
- Saad Ali (saad-ali)
- Wei Duan (duanwei33)
- Xing Yang (xing-yang)
- Yati Padia (yati1998)
如果你有兴趣参与 CSI 或 Kubernetes 存储系统任何部分的设计和开发,请加入 Kubernetes 存储特别兴趣小组(SIG)。 我们始终欢迎新的贡献者。
我们还定期召开数据保护工作组会议。 欢迎新成员加入我们的讨论。