卷快照
在 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* 字段来配置一个新卷,该卷预先填充了快照中的数据。
有关更多详细信息,请参阅 卷快照和从快照还原卷.