卷快照

在 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 的 Sidecar 辅助容器,与 CSI 驱动程序一起部署。快照控制器监听 VolumeSnapshotVolumeSnapshotContent 对象,并负责创建和删除 VolumeSnapshotContent 对象。Sidecar 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 指定了存储提供商在获取快照时要使用的特定参数。

Binding

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

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

Persistent Volume Claim 作为快照源的保护

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

当 PersistentVolumeClaim 的快照正在被获取时,该 PersistentVolumeClaim 正在使用中。如果你删除一个作为快照源的正在活跃使用的 PersistentVolumeClaim API 对象,该 PersistentVolumeClaim 对象不会立即被移除。相反,PersistentVolumeClaim 对象的移除会被推迟,直到快照处于 readyToUse 状态或已中止。

删除

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

VolumeSnapshots

每个 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

Volume Snapshot Contents

每个 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 中添加 annotation 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 PST:添加卷组快照的文档链接 (5e5f909d24)