提示:學習本篇教程前請先參閱《Kubernetes持久卷》。
一、卷快照介紹
PersistentVolume 和 PersistentVolumeClaim 這兩個 API 資源用于給用戶和管理員制備卷,而 VolumeSnapshotContent 和 VolumeSnapshot 這兩個 API 資源則用于創(chuàng)建卷快照。
VolumeSnapshotContent 是從一個卷獲取的一種快照,由管理員在集群中進行制備。類似于 PersistentVolume 是集群的資源,VolumeSnapshotContent 也是集群中的資源,可供集群內的其他用戶或應用程序使用。
VolumeSnapshot 則是用戶對卷進行快照的請求,并類似于 PersistentVolumeClaim。用戶可以通過創(chuàng)建 VolumeSnapshot 來保存卷的狀態(tài),以便在需要時恢復該狀態(tài)。與 PersistentVolumeClaim 類似,用戶可以指定 VolumeSnapshot 的屬性,如訪問模式、存儲容量等等。
VolumeSnapshotClass 允許指定屬于 VolumeSnapshot 的不同屬性。在從存儲系統(tǒng)的相同卷上獲取的快照之間,這些屬性可能有所不同,因此不能通過使用與 PersistentVolumeClaim 相同的 StorageClass 來表示。
卷快照能力為 Kubernetes 用戶提供了一種標準的方式,在指定的時間點復制卷的內容,而無需創(chuàng)建全新的卷。這一功能對于數據庫管理員來說尤其有用,他們可以在執(zhí)行編輯或刪除等修改之前對數據庫進行備份。
在使用卷快照時,需要注意以下幾點:
1、API對象 VolumeSnapshot、VolumeSnapshotContent和VolumeSnapshotClass是自定義資源定義(CRD),它們并不屬于核心API。
2、卷快照功能僅適用于CSI(容器存儲接口)驅動程序。
3、為了支持卷快照,在Kubernetes中,團隊提供了一個快照控制器(snapshot controller),它是部署在控制平面的一個組件。同時還提供了一個名為csi-snapshotter的邊車(Sidecar)輔助容器,該輔助容器與CSI驅動程序一起部署??煺湛刂破髫撠煴O(jiān)視VolumeSnapshot和VolumeSnapshotContent對象,并負責創(chuàng)建和刪除VolumeSnapshotContent對象。而csi-snapshotter輔助容器則負責監(jiān)視VolumeSnapshotContent對象,并觸發(fā)針對CSI端點的CreateSnapshot和DeleteSnapshot操作。
4、還有一個用于驗證的Webhook服務器,可以對快照對象進行更嚴格的驗證。Kubernetes發(fā)行版應該將此服務器與快照控制器和自定義資源定義(CRD)一起安裝。此服務器應該在所有啟用了快照功能的Kubernetes集群中進行安裝。
5、CSI驅動程序可能會實現卷快照功能,也可能沒有實現。在實現了卷快照功能的情況下,CSI驅動程序可能會使用csi-snapshotter來提供對卷快照的支持。
6、Kubernetes 負責 CRD 和快照控制器的安裝。
二、卷快照/內容生命周期
卷快照(VolumeSnapshotContents)是Kubernetes集群中的資源,而卷快照內容(VolumeSnapshots)則是對這些資源的請求。
卷快照和卷快照內容的生命周期如下:
1、制備卷快照:可以通過預制備或動態(tài)制備兩種方式進行。預制備是由集群管理員創(chuàng)建多個VolumeSnapshotContents,它們包含實際卷快照在存儲系統(tǒng)中的詳細信息,并可以供集群用戶使用。這些預制備的快照存在于Kubernetes API中,并可立即使用。動態(tài)制備則是從PersistentVolumeClaim(持久化卷聲明)中動態(tài)獲取快照,而不需要使用現有的快照。在動態(tài)制備時,可以指定特定于存儲提供程序的參數。
2、綁定:在預制備和動態(tài)制備的場景下,快照控制器會處理將VolumeSnapshot對象和適當的VolumeSnapshotContent對象進行綁定。綁定關系是一對一的。在預制備快照的場景中,VolumeSnapshotContent對象被創(chuàng)建后才與VolumeSnapshot進行綁定。
3、快照源的持久性卷聲明保護:這種保護的目的是確保在從系統(tǒng)中獲取快照時,不會刪除正在使用的PersistentVolumeClaim對象(因為這可能導致數據丟失)。當為某個PersistentVolumeClaim生成快照時,該PersistentVolumeClaim處于被使用狀態(tài)。如果刪除正在作為快照源使用的PersistentVolumeClaim對象,該對象不會立即被移除,而是推遲刪除操作,直到快照狀態(tài)變?yōu)镽eadyToUse或快照操作被中止。
4、刪除:當刪除VolumeSnapshot對象時,將觸發(fā)刪除相應的VolumeSnapshotContent操作,并且會根據DeletionPolicy執(zhí)行相應的操作。如果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數據源的名稱,用于在動態(tài)制備快照時標識數據來源。這個字段是動態(tài)制備快照中的必填字段。可以通過指定volumeSnapshotClassName屬性來請求特定類的卷快照,該屬性指定了VolumeSnapshotClass的名稱。如果未設置volumeSnapshotClassName,則將使用默認的VolumeSnapshotClass(如果有定義的話)來創(chuàng)建快照。
如下面例子所示,對于預制備的快照,需要給快照指定 volumeSnapshotContentName 作為來源;對于預制備的快照 source 中的volumeSnapshotContentName 字段是必填的。
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: test-snapshot spec: source: volumeSnapshotContentName: test-content
四、卷快照內容
每個 VolumeSnapshotContent 對象包含 spec 和 status。 在動態(tài)制備時,快照通用控制器創(chuàng)建 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 是存儲后端創(chuàng)建卷的唯一標識符,在卷創(chuàng)建期間由 CSI 驅動程序返回。 動態(tài)設置快照需要此字段,它指出了快照的卷源。
對于預制備快照,作為集群管理員要按如下命令來創(chuàng)建 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 是存儲后端創(chuàng)建卷的唯一標識符。對于預制備的快照,這個字段是必需的,它指定此 VolumeSnapshotContent 表示的存儲系統(tǒng)上的 CSI 快照 ID。
- sourceVolumeMode 是創(chuàng)建快照的卷的模式,它可以是 Filesystem 或 Block,如果沒有指定源卷模式,Kubernetes 會將快照視為未知的源卷模式。
- volumeSnapshotRef 字段是對相應的 VolumeSnapshot 的引用,注意當 VolumeSnapshotContent 被創(chuàng)建為預配置快照時,volumeSnapshotRef 中引用的 VolumeSnapshot 可能還不存在。
五、轉換快照的卷模式
如果在集群上安裝的 VolumeSnapshots API 支持 sourceVolumeMode 字段,則該 API 可以防止未經授權的用戶轉換卷的模式。
要檢查集群是否具有此特性的能力,可以運行如下命令:
kubectl get crd volumesnapshotcontent -o yaml
如果希望允許用戶從現有的 VolumeSnapshot 創(chuàng)建 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