卷快照
在 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 的边车帮助程序容器,该容器将与 CSI 驱动程序一起部署。快照控制器监视VolumeSnapshot
和VolumeSnapshotContent
对象,并负责创建和删除VolumeSnapshotContent
对象。边车 csi-snapshotter 监视VolumeSnapshotContent
对象,并针对 CSI 端点触发CreateSnapshot
和DeleteSnapshot
操作。 - 还有一个验证 Webhook 服务器,该服务器为快照对象提供更严格的验证。这应该由 Kubernetes 发行版与快照控制器和 CRD 一起安装,而不是 CSI 驱动程序。它应该安装在所有启用快照功能的 Kubernetes 集群中。
- CSI 驱动程序可能已经或尚未实现卷快照功能。已提供卷快照支持的 CSI 驱动程序很可能会使用 csi-snapshotter。有关详细信息,请参阅 CSI 驱动程序文档。
- CRD 和快照控制器的安装是 Kubernetes 发行版的责任。
对于高级用例,例如创建多个卷的组快照,请参阅外部 CSI 卷组快照文档。
卷快照和卷快照内容的生命周期
VolumeSnapshotContents
是集群中的资源。VolumeSnapshots
是对这些资源的请求。VolumeSnapshotContents
和 VolumeSnapshots
之间的交互遵循以下生命周期
配置卷快照
快照的配置方式有两种:预配置或动态配置。
预配置
集群管理员创建多个 VolumeSnapshotContents
。它们携带存储系统上实际卷快照的详细信息,供集群用户使用。它们存在于 Kubernetes API 中,并且可供使用。
动态
除了使用预先存在的快照,你还可以请求从 PersistentVolumeClaim 动态获取快照。VolumeSnapshotClass 指定在拍摄快照时使用的存储提供程序特定参数。
绑定
快照控制器负责将 VolumeSnapshot
对象与适当的 VolumeSnapshotContent
对象绑定,无论是在预配置还是动态配置场景中。绑定是一对一的映射。
在预配置绑定的情况下,在创建请求的 VolumeSnapshotContent 对象之前,VolumeSnapshot 将保持未绑定状态。
持久卷申领作为快照源保护
此保护的目的是确保在从正在使用的 PersistentVolumeClaim API 对象正在获取快照时,不会从系统中删除这些对象(因为这可能会导致数据丢失)。
在获取 PersistentVolumeClaim 的快照时,该 PersistentVolumeClaim 正在使用中。如果在用作快照源时删除正在使用的 PersistentVolumeClaim API 对象,则不会立即删除 PersistentVolumeClaim 对象。相反,删除 PersistentVolumeClaim 对象的操作将推迟到快照准备好使用或中止为止。
删除
通过删除 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
字段的值可以是 Filesystem
或 Block
。如果未指定源卷模式,则 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 字段来配置一个新卷,该卷预先填充了来自快照的数据。
有关更多详细信息,请参阅卷快照和从快照还原卷。