卷快照

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

简介

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

一个 `VolumeSnapshotContent` 是从集群中由管理员配置的卷中拍摄的快照。它是一个集群中的资源,就像 PersistentVolume 是一个集群资源一样。

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

`VolumeSnapshotClass` 允许您指定属于 `VolumeSnapshot` 的不同属性。这些属性可能因从存储系统上的同一个卷中拍摄的快照而异,因此无法通过使用相同 `StorageClass` 的 `PersistentVolumeClaim` 来表达。

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

用户在使用此功能时需要注意以下几点

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

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

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

配置卷快照

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

预配置

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

动态

您可以请求从 PersistentVolumeClaim 动态拍摄快照,而不是使用现有快照。该 VolumeSnapshotClass 指定在拍摄快照时要使用的特定于存储提供者的参数。

Binding

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

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

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

此保护的目的是确保正在使用的 PersistentVolumeClaim API 对象不会从系统中删除,而从其拍摄快照(因为这会导致数据丢失)。

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

删除

删除由删除 `VolumeSnapshot` 对象触发,并将遵循 `DeletionPolicy`。如果 `DeletionPolicy` 为 `Delete`,则底层存储快照将与 `VolumeSnapshotContent` 对象一起删除。如果 `DeletionPolicy` 为 `Retain`,则底层快照和 `VolumeSnapshotContent` 都将保留。

VolumeSnapshots

每个 VolumeSnapshot 都包含一个规范和一个状态。

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 都包含一个规范和状态。在动态配置中,快照通用控制器创建 `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` 字段的值可以是 `Filesystem` 或 `Block`。如果未指定源卷模式,则 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* 字段来配置一个新卷,该卷预先填充了快照中的数据。

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

上次修改时间:2023 年 2 月 9 日,太平洋标准时间下午 11:25:更新文档中的卷模式更改注释 (9ab8cd6c0b)