磁碟區快照
在 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 指定在建立快照時要使用的儲存提供者特定參數。
繫結
快照控制器處理 `VolumeSnapshot` 物件與適當的 `VolumeSnapshotContent` 物件的繫結,無論是在預先佈建還是動態佈建情境中。繫結是一對一對應。
在預先佈建繫結的情況下,VolumeSnapshot 將保持未繫結狀態,直到建立請求的 VolumeSnapshotContent 物件。
持續性磁碟區宣告作為快照來源保護
此保護的目的在於確保在從系統中擷取快照時,不會從系統中移除使用中的 PersistentVolumeClaim API 物件(因為這可能會導致資料遺失)。
當正在為 PersistentVolumeClaim 建立快照時,該 PersistentVolumeClaim 處於使用中狀態。如果您刪除作為快照來源且正在使用中的 PersistentVolumeClaim API 物件,該 PersistentVolumeClaim 物件不會立即被移除。相反地,PersistentVolumeClaim 物件的移除將會延遲,直到快照進入 readyToUse
狀態或中止為止。
刪除
刪除操作會透過刪除 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 名稱。此欄位為動態佈建快照時的必要欄位。
磁碟區快照可以透過指定 VolumeSnapshotClass 的名稱,並使用 volumeSnapshotClassName
屬性來請求特定的類別。如果沒有設定任何類別,則會使用預設類別(如果可用的話)。
對於預先佈建的快照,您需要指定 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 欄位,來佈建一個新的磁碟區,並預先填入來自快照的資料。
如需更多詳細資訊,請參閱 磁碟區快照和從快照還原磁碟區。