卷快照
在 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
是对这些资源的请求。VolumeSnapshotContents
和 VolumeSnapshots
之间的交互遵循以下生命周期
预配卷快照
快照可以通过两种方式预配:预先预配或动态预配。
预先预配
集群管理员创建一些 VolumeSnapshotContents
。它们携带存储系统上真实卷快照的详细信息,可供集群用户使用。它们存在于 Kubernetes API 中,可供使用。
动态
你可以请求从 PersistentVolumeClaim 动态获取快照,而不是使用预先存在的快照。VolumeSnapshotClass 指定了存储提供商在获取快照时要使用的特定参数。
Binding
在预先预配和动态预配场景中,快照控制器处理 VolumeSnapshot
对象与适当的 VolumeSnapshotContent
对象的绑定。绑定是一对一映射。
在预先预配绑定的情况下,VolumeSnapshot 将保持未绑定状态,直到创建请求的 VolumeSnapshotContent 对象为止。
Persistent Volume Claim 作为快照源的保护
此保护的目的是确保在使用中的 PersistentVolumeClaim API 对象在其快照正在被获取时不会从系统中移除(因为这可能导致数据丢失)。
当 PersistentVolumeClaim 的快照正在被获取时,该 PersistentVolumeClaim 正在使用中。如果你删除一个作为快照源的正在活跃使用的 PersistentVolumeClaim API 对象,该 PersistentVolumeClaim 对象不会立即被移除。相反,PersistentVolumeClaim 对象的移除会被推迟,直到快照处于 readyToUse 状态或已中止。
删除
删除通过删除 VolumeSnapshot
对象触发,并将遵循 DeletionPolicy
。如果 DeletionPolicy
是 Delete
,则底层存储快照将随 VolumeSnapshotContent
对象一起删除。如果 DeletionPolicy
是 Retain
,则底层快照和 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
字段的值可以是 Filesystem
或 Block
。如果未指定源卷模式,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 字段来预配一个用快照中的数据预填充的新卷。
有关详细信息,请参阅卷快照和从快照恢复卷。