提示:学习本篇教程前请先参阅《Kubernetes持久卷》。
一、卷快照介绍
PersistentVolume 和 PersistentVolumeClaim 这两个 API 资源用于给用户和管理员制备卷,而 VolumeSnapshotContent 和 VolumeSnapshot 这两个 API 资源则用于创建卷快照。
VolumeSnapshotContent 是从一个卷获取的一种快照,由管理员在集群中进行制备。类似于 PersistentVolume 是集群的资源,VolumeSnapshotContent 也是集群中的资源,可供集群内的其他用户或应用程序使用。
VolumeSnapshot 则是用户对卷进行快照的请求,并类似于 PersistentVolumeClaim。用户可以通过创建 VolumeSnapshot 来保存卷的状态,以便在需要时恢复该状态。与 PersistentVolumeClaim 类似,用户可以指定 VolumeSnapshot 的属性,如访问模式、存储容量等等。
VolumeSnapshotClass 允许指定属于 VolumeSnapshot 的不同属性。在从存储系统的相同卷上获取的快照之间,这些属性可能有所不同,因此不能通过使用与 PersistentVolumeClaim 相同的 StorageClass 来表示。
卷快照能力为 Kubernetes 用户提供了一种标准的方式,在指定的时间点复制卷的内容,而无需创建全新的卷。这一功能对于数据库管理员来说尤其有用,他们可以在执行编辑或删除等修改之前对数据库进行备份。
在使用卷快照时,需要注意以下几点:
1、API对象 VolumeSnapshot、VolumeSnapshotContent和VolumeSnapshotClass是自定义资源定义(CRD),它们并不属于核心API。
2、卷快照功能仅适用于CSI(容器存储接口)驱动程序。
3、为了支持卷快照,在Kubernetes中,团队提供了一个快照控制器(snapshot controller),它是部署在控制平面的一个组件。同时还提供了一个名为csi-snapshotter的边车(Sidecar)辅助容器,该辅助容器与CSI驱动程序一起部署。快照控制器负责监视VolumeSnapshot和VolumeSnapshotContent对象,并负责创建和删除VolumeSnapshotContent对象。而csi-snapshotter辅助容器则负责监视VolumeSnapshotContent对象,并触发针对CSI端点的CreateSnapshot和DeleteSnapshot操作。
4、还有一个用于验证的Webhook服务器,可以对快照对象进行更严格的验证。Kubernetes发行版应该将此服务器与快照控制器和自定义资源定义(CRD)一起安装。此服务器应该在所有启用了快照功能的Kubernetes集群中进行安装。
5、CSI驱动程序可能会实现卷快照功能,也可能没有实现。在实现了卷快照功能的情况下,CSI驱动程序可能会使用csi-snapshotter来提供对卷快照的支持。
6、Kubernetes 负责 CRD 和快照控制器的安装。
二、卷快照/内容生命周期
卷快照(VolumeSnapshotContents)是Kubernetes集群中的资源,而卷快照内容(VolumeSnapshots)则是对这些资源的请求。
卷快照和卷快照内容的生命周期如下:
1、制备卷快照:可以通过预制备或动态制备两种方式进行。预制备是由集群管理员创建多个VolumeSnapshotContents,它们包含实际卷快照在存储系统中的详细信息,并可以供集群用户使用。这些预制备的快照存在于Kubernetes API中,并可立即使用。动态制备则是从PersistentVolumeClaim(持久化卷声明)中动态获取快照,而不需要使用现有的快照。在动态制备时,可以指定特定于存储提供程序的参数。
2、绑定:在预制备和动态制备的场景下,快照控制器会处理将VolumeSnapshot对象和适当的VolumeSnapshotContent对象进行绑定。绑定关系是一对一的。在预制备快照的场景中,VolumeSnapshotContent对象被创建后才与VolumeSnapshot进行绑定。
3、快照源的持久性卷声明保护:这种保护的目的是确保在从系统中获取快照时,不会删除正在使用的PersistentVolumeClaim对象(因为这可能导致数据丢失)。当为某个PersistentVolumeClaim生成快照时,该PersistentVolumeClaim处于被使用状态。如果删除正在作为快照源使用的PersistentVolumeClaim对象,该对象不会立即被移除,而是推迟删除操作,直到快照状态变为ReadyToUse或快照操作被中止。
4、删除:当删除VolumeSnapshot对象时,将触发删除相应的VolumeSnapshotContent操作,并且会根据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的名称。如果未设置volumeSnapshotClassName,则将使用默认的VolumeSnapshotClass(如果有定义的话)来创建快照。
如下面例子所示,对于预制备的快照,需要给快照指定 volumeSnapshotContentName 作为来源;对于预制备的快照 source 中的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 是创建快照的卷的模式,它可以是 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