卷快照

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

介绍

与 API 资源 `PersistentVolume` 和 `PersistentVolumeClaim` 用于为用户和管理员提供卷的方式类似, `VolumeSnapshotContent` 和 `VolumeSnapshot` API 资源用于为用户和管理员创建卷快照。

一个 `VolumeSnapshotContent` 是从集群中由管理员提供的卷中获取的快照。它是一个集群中的资源,就像 PersistentVolume 是一个集群资源一样。

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

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

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

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

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

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

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

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

提供卷快照

快照可以通过两种方式提供:预配置或动态配置。

预配置

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

动态

您可以请求从 PersistentVolumeClaim 动态创建快照,而不是使用预先存在的快照。 VolumeSnapshotClass 指定了创建快照时要使用的存储提供商特定参数。

绑定

在预配置和动态配置场景中,快照控制器处理 VolumeSnapshot 对象与适当的 VolumeSnapshotContent 对象的绑定。绑定是一对一的映射。

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

作为快照源的持久卷声明保护

此保护的目的是确保在使用中的 PersistentVolumeClaim API 对象在从其创建快照时不会从系统中移除(因为这可能导致数据丢失)。

当从 PersistentVolumeClaim 创建快照时,该 PersistentVolumeClaim 处于使用中。如果您删除作为快照源正在使用的 PersistentVolumeClaim API 对象,则 PersistentVolumeClaim 对象不会立即移除。相反,PersistentVolumeClaim 对象的移除将推迟到快照变为 readyToUse 或中止。

删除

删除操作通过删除 `VolumeSnapshot` 对象触发,并将遵循 `DeletionPolicy`。如果 `DeletionPolicy` 为 `Delete`,则底层存储快照将与 `VolumeSnapshotContent` 对象一起删除。如果 `DeletionPolicy` 为 `Retain`,则底层快照和 `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`,但其卷模式与源卷模式不同,则需要将注解 `snapshot.storage.kubernetes.io/allow-volume-mode-change: "true"` 添加到与 `VolumeSnapshot` 对应的 `VolumeSnapshotContent` 中。

对于预配置快照,`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 PST:添加卷组快照的文档链接 (5e5f909d24)