卷快照

在 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 发行版负责。

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

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

预配卷快照

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

预先预配

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

动态

您可以请求从 PersistentVolumeClaim 动态获取快照,而不是使用预先存在的快照。VolumeSnapshotClass 指定在获取快照时使用的存储提供程序特定参数。

Binding

快照控制器负责在预先预配和动态预配场景中将 VolumeSnapshot 对象与相应的 VolumeSnapshotContent 对象绑定。绑定是一对一映射。

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

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

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

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

删除

删除操作是通过删除 VolumeSnapshot 对象触发的,并且将遵循 DeletionPolicy。如果 DeletionPolicyDelete,则基础存储快照将与 VolumeSnapshotContent 对象一起删除。如果 DeletionPolicyRetain,则基础快照和 VolumeSnapshotContent 都将保留。

VolumeSnapshot

每个 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 字段的值可以是 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 字段来预配一个新卷,该卷预先填充了来自快照的数据。

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

上次修改时间:2023 年 2 月 9 日上午 11:25 PST:更新文档中的卷模式更改注释 (9ab8cd6c0b)