卷快照

在 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 是對這些資源的請求。VolumeSnapshotContentsVolumeSnapshots 之間的互動遵循以下生命週期:

提供卷快照

快照可以透過兩種方式提供:預配置或動態配置。

預配置

叢集管理員建立了一些 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 資料來源的名稱。動態配置快照需要此欄位。

卷快照可以透過使用 `volumeSnapshotClassName` 屬性指定 VolumeSnapshotClass 的名稱來請求特定的類。如果未設定,則使用預設類(如果可用)。

對於預配置快照,您需要指定 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 欄位的值可以是 FilesystemBlock。如果未指定源卷模式,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` 欄位,透過快照資料預填充來配置新卷。

有關更多詳細資訊,請參閱 卷快照和從快照恢復卷

最後修改時間:2024 年 10 月 18 日上午 11:51 PST:添加捲組快照的文件連結 (5e5f909d24)