卷快照

在 Kubernetes 中,VolumeSnapshot 表示存储系统上卷的快照。本文档假设你已经熟悉 Kubernetes 持久卷

简介

类似于如何使用 API 资源 PersistentVolumePersistentVolumeClaim 为用户和管理员配置卷一样,VolumeSnapshotContentVolumeSnapshot API 资源被用来为用户和管理员创建卷快照。

VolumeSnapshotContent 是从集群中由管理员配置的卷中获取的快照。它是集群中的一种资源,就像 PersistentVolume 是集群资源一样。

VolumeSnapshot 是用户对卷快照的请求。它类似于 PersistentVolumeClaim。

VolumeSnapshotClass 允许你指定属于 VolumeSnapshot 的不同属性。这些属性在从存储系统上的同一卷获取的快照之间可能有所不同,因此不能使用 PersistentVolumeClaim 的相同 StorageClass 来表达。

卷快照为 Kubernetes 用户提供了一种标准化方式,可以在特定的时间点复制卷的内容,而无需创建全新的卷。例如,此功能使数据库管理员可以在执行编辑或删除修改之前备份数据库。

用户在使用此功能时需要注意以下事项

  • API 对象 VolumeSnapshotVolumeSnapshotContentVolumeSnapshotClassCRD,而不是核心 API 的一部分。
  • VolumeSnapshot 支持仅适用于 CSI 驱动程序。
  • 作为 VolumeSnapshot 部署过程的一部分,Kubernetes 团队提供了一个快照控制器以部署到控制平面中,以及一个名为 csi-snapshotter 的边车帮助程序容器,该容器将与 CSI 驱动程序一起部署。快照控制器监视 VolumeSnapshotVolumeSnapshotContent 对象,并负责创建和删除 VolumeSnapshotContent 对象。边车 csi-snapshotter 监视 VolumeSnapshotContent 对象,并针对 CSI 端点触发 CreateSnapshotDeleteSnapshot 操作。
  • 还有一个验证 Webhook 服务器,该服务器为快照对象提供更严格的验证。这应该由 Kubernetes 发行版与快照控制器和 CRD 一起安装,而不是 CSI 驱动程序。它应该安装在所有启用快照功能的 Kubernetes 集群中。
  • CSI 驱动程序可能已经或尚未实现卷快照功能。已提供卷快照支持的 CSI 驱动程序很可能会使用 csi-snapshotter。有关详细信息,请参阅 CSI 驱动程序文档
  • CRD 和快照控制器的安装是 Kubernetes 发行版的责任。

对于高级用例,例如创建多个卷的组快照,请参阅外部 CSI 卷组快照文档

卷快照和卷快照内容的生命周期

VolumeSnapshotContents 是集群中的资源。VolumeSnapshots 是对这些资源的请求。VolumeSnapshotContentsVolumeSnapshots 之间的交互遵循以下生命周期

配置卷快照

快照的配置方式有两种:预配置或动态配置。

预配置

集群管理员创建多个 VolumeSnapshotContents。它们携带存储系统上实际卷快照的详细信息,供集群用户使用。它们存在于 Kubernetes API 中,并且可供使用。

动态

除了使用预先存在的快照,你还可以请求从 PersistentVolumeClaim 动态获取快照。VolumeSnapshotClass 指定在拍摄快照时使用的存储提供程序特定参数。

绑定

快照控制器负责将 VolumeSnapshot 对象与适当的 VolumeSnapshotContent 对象绑定,无论是在预配置还是动态配置场景中。绑定是一对一的映射。

在预配置绑定的情况下,在创建请求的 VolumeSnapshotContent 对象之前,VolumeSnapshot 将保持未绑定状态。

持久卷申领作为快照源保护

此保护的目的是确保在从正在使用的 PersistentVolumeClaim API 对象正在获取快照时,不会从系统中删除这些对象(因为这可能会导致数据丢失)。

在获取 PersistentVolumeClaim 的快照时,该 PersistentVolumeClaim 正在使用中。如果在用作快照源时删除正在使用的 PersistentVolumeClaim API 对象,则不会立即删除 PersistentVolumeClaim 对象。相反,删除 PersistentVolumeClaim 对象的操作将推迟到快照准备好使用或中止为止。

删除

通过删除 VolumeSnapshot 对象触发删除,并将遵循 DeletionPolicy。如果 DeletionPolicyDelete,则底层存储快照将与 VolumeSnapshotContent 对象一起删除。如果 DeletionPolicyRetain,则底层快照和 VolumeSnapshotContent 都将保留。

卷快照

每个 VolumeSnapshot 包含一个 spec 和一个 status。

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: new-snapshot-test
spec:
  volumeSnapshotClassName: csi-hostpath-snapclass
  source:
    persistentVolumeClaimName: pvc-test

persistentVolumeClaimName 是快照的 PersistentVolumeClaim 数据源的名称。对于动态配置快照,此字段是必需的。

卷快照可以通过使用 volumeSnapshotClassName 属性指定 VolumeSnapshotClass 的名称来请求特定的类。如果未设置任何内容,则会使用默认类(如果可用)。

对于预配置的快照,你需要指定 volumeSnapshotContentName 作为快照的来源,如下例所示。对于预配置的快照,volumeSnapshotContentName 源字段是必需的。

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: test-snapshot
spec:
  source:
    volumeSnapshotContentName: test-content

卷快照内容

每个 VolumeSnapshotContent 都包含一个 spec 和一个 status。在动态配置中,快照通用控制器会创建 VolumeSnapshotContent 对象。这是一个示例

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
  name: snapcontent-72d9a349-aacd-42d2-a240-d775650d2455
spec:
  deletionPolicy: Delete
  driver: hostpath.csi.k8s.io
  source:
    volumeHandle: ee0cfb94-f8d4-11e9-b2d8-0242ac110002
  sourceVolumeMode: Filesystem
  volumeSnapshotClassName: csi-hostpath-snapclass
  volumeSnapshotRef:
    name: new-snapshot-test
    namespace: default
    uid: 72d9a349-aacd-42d2-a240-d775650d2455

volumeHandle 是存储后端上创建的卷的唯一标识符,由 CSI 驱动程序在卷创建期间返回。对于动态配置快照,此字段是必需的。它指定快照的卷来源。

对于预配置的快照,你(作为集群管理员)负责创建 VolumeSnapshotContent 对象,如下所示。

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
  name: new-snapshot-content-test
spec:
  deletionPolicy: Delete
  driver: hostpath.csi.k8s.io
  source:
    snapshotHandle: 7bdd0de3-aaeb-11e8-9aae-0242ac110002
  sourceVolumeMode: Filesystem
  volumeSnapshotRef:
    name: new-snapshot-test
    namespace: default

snapshotHandle 是在存储后端上创建的卷快照的唯一标识符。对于预配置的快照,此字段是必需的。它指定此 VolumeSnapshotContent 代表的存储系统上的 CSI 快照 ID。

sourceVolumeMode 是要拍摄快照的卷的模式。sourceVolumeMode 字段的值可以是 FilesystemBlock。如果未指定源卷模式,则 Kubernetes 会将快照视为源卷模式未知。

volumeSnapshotRef 是相应 VolumeSnapshot 的引用。请注意,当 VolumeSnapshotContent 作为预配置快照创建时,volumeSnapshotRef 中引用的 VolumeSnapshot 可能尚不存在。

转换快照的卷模式

如果你的集群上安装的 VolumeSnapshots API 支持 sourceVolumeMode 字段,则该 API 具有防止未经授权的用户转换卷模式的功能。

要检查你的集群是否具有此功能,请运行以下命令

$ kubectl get crd volumesnapshotcontent -o yaml

如果你希望允许用户从现有的 VolumeSnapshot 创建 PersistentVolumeClaim,但其卷模式与源模式不同,则需要在与 VolumeSnapshot 对应的 VolumeSnapshotContent 中添加注释 snapshot.storage.kubernetes.io/allow-volume-mode-change: "true"

对于预配置的快照,spec.sourceVolumeMode 需要由集群管理员填充。

启用此功能的 VolumeSnapshotContent 资源示例如下所示

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
  name: new-snapshot-content-test
  annotations:
    - snapshot.storage.kubernetes.io/allow-volume-mode-change: "true"
spec:
  deletionPolicy: Delete
  driver: hostpath.csi.k8s.io
  source:
    snapshotHandle: 7bdd0de3-aaeb-11e8-9aae-0242ac110002
  sourceVolumeMode: Filesystem
  volumeSnapshotRef:
    name: new-snapshot-test
    namespace: default

从快照配置卷

你可以通过使用 PersistentVolumeClaim 对象中的 dataSource 字段来配置一个新卷,该卷预先填充了来自快照的数据。

有关更多详细信息,请参阅卷快照和从快照还原卷

上次修改时间:太平洋标准时间 2024 年 10 月 18 日上午 11:51:为卷组快照添加文档链接 (5e5f909d24)