本文已發布超過一年。較舊的文章可能包含過時內容。請確認頁面中的資訊自發布以來是否已變得不正確。
Kubernetes 1.27:推出用於 Volume Group Snapshots 的 API
磁碟區群組快照在 Kubernetes v1.27 中以 Alpha 功能形式推出。此功能引入了 Kubernetes API,讓使用者可以為多個磁碟區同時建立當機一致性快照。它使用標籤選擇器將多個 PersistentVolumeClaims
分組以進行快照。此新功能僅支援 CSI 磁碟區驅動程式。
磁碟區群組快照概觀
某些儲存系統提供建立多個磁碟區的當機一致性快照的能力。群組快照代表從多個磁碟區在同一時間點建立的「副本」。群組快照可用於重新建立新的磁碟區(預先填充快照資料),或將現有磁碟區還原到先前的狀態(由快照表示)。
為何將磁碟區群組快照新增至 Kubernetes?
Kubernetes 磁碟區外掛程式系統已經提供強大的抽象化,可自動執行區塊和檔案儲存的佈建、連接、掛載、調整大小和快照。
所有這些功能的基礎是 Kubernetes 工作負載可攜性的目標:Kubernetes 旨在於分散式應用程式和底層叢集之間建立抽象層,使應用程式可以不知道其運行的叢集的具體細節,並且應用程式部署不需要叢集特定的知識。
已經有一個 VolumeSnapshot API,提供為永久磁碟區建立快照的功能,以防止資料遺失或資料損壞。但是,VolumeSnapshot API 未涵蓋其他快照功能。
某些儲存系統支援一致的群組快照,允許從多個磁碟區在同一時間點建立快照,以實現寫入順序一致性。這對於包含多個磁碟區的應用程式可能很有用。例如,應用程式可能將資料儲存在一個磁碟區中,而將日誌儲存在另一個磁碟區中。如果資料磁碟區和日誌磁碟區的快照在不同時間建立,則應用程式將不一致,並且如果從災難發生時的這些快照還原,則將無法正常運作。
確實,您可以先靜止應用程式,然後從屬於應用程式一部分的每個磁碟區依序建立個別快照,然後在建立所有個別快照後取消靜止應用程式。這樣,您將獲得應用程式一致性快照。
但是,有時可能無法靜止應用程式,或者應用程式靜止可能太過耗費資源,因此您希望減少執行頻率。與建立一致的群組快照相比,依序建立個別快照也可能需要更長的時間。由於這些原因,某些使用者可能不想經常執行應用程式靜止。例如,使用者可能想要每週執行一次應用程式靜止的備份,以及每晚執行一次不使用應用程式靜止但具有一致群組支援的備份,這可在群組中的所有磁碟區之間提供當機一致性。
Kubernetes 磁碟區群組快照 API
Kubernetes 磁碟區群組快照引入了 三個新的 API 物件,用於管理快照
VolumeGroupSnapshot
- 由 Kubernetes 使用者(或可能是您自己的自動化系統)建立,以請求為多個永久磁碟區宣告建立磁碟區群組快照。它包含有關磁碟區群組快照操作的資訊,例如建立磁碟區群組快照的時間戳記以及是否準備好使用。此物件的建立和刪除表示希望建立或刪除叢集資源(群組快照)。
VolumeGroupSnapshotContent
- 由快照控制器為動態建立的 VolumeGroupSnapshot 建立。它包含有關磁碟區群組快照的資訊,包括磁碟區群組快照 ID。此物件代表叢集上佈建的資源(群組快照)。VolumeGroupSnapshotContent 物件與為其建立的 VolumeGroupSnapshot 綁定,具有一對一的映射關係。
VolumeGroupSnapshotClass
- 由叢集管理員建立,以描述應如何建立磁碟區群組快照。包括驅動程式資訊、刪除政策等。
這三種 API 類型定義為 CustomResourceDefinitions (CRD)。必須在 Kubernetes 叢集中安裝這些 CRD,CSI 驅動程式才能支援磁碟區群組快照。
如何使用 Kubernetes 磁碟區群組快照
磁碟區群組快照在 external-snapshotter 儲存庫中實作。實作磁碟區群組快照表示需要新增或變更多個組件
- 為 VolumeGroupSnapshot 和兩個支援 API 新增了新的 CustomResourceDefinitions。
- 磁碟區群組快照控制器邏輯已新增至通用快照控制器。
- 磁碟區群組快照驗證 Webhook 邏輯已新增至通用快照驗證 Webhook。
- 新增邏輯以對快照器 Sidecar 控制器進行 CSI 呼叫。
磁碟區快照控制器、CRD 和驗證 Webhook 每個叢集部署一次,而 Sidecar 則與每個 CSI 驅動程式捆綁在一起。
因此,將磁碟區快照控制器、CRD 和驗證 Webhook 作為叢集附加元件部署是有意義的。我強烈建議 Kubernetes 發行商將磁碟區快照控制器、CRD 和驗證 Webhook 捆綁並部署為其 Kubernetes 叢集管理流程的一部分(獨立於任何 CSI 驅動程式)。
使用 Kubernetes 建立新的群組快照
一旦定義了 VolumeGroupSnapshotClass 物件,並且您擁有想要一起建立快照的磁碟區,您就可以透過建立 VolumeGroupSnapshot 物件來請求新的群組快照。
群組快照的來源指定應動態建立底層群組快照,還是應使用預先存在的 VolumeGroupSnapshotContent。
預先存在的 VolumeGroupSnapshotContent 由叢集管理員建立。它包含儲存系統上可供叢集使用者使用的真實磁碟區群組快照的詳細資訊。
必須設定群組快照來源中的以下成員之一。
selector
- 永久磁碟區宣告的標籤查詢,這些宣告將分組在一起進行快照。此 labelSelector 將用於匹配新增至 PVC 的標籤。volumeGroupSnapshotContentName
- 指定代表現有磁碟區群組快照的預先存在的 VolumeGroupSnapshotContent 物件的名稱。
在以下範例中,有兩個 PVC。
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
pvc-0 Bound pvc-a42d7ea2-e3df-11ed-b5ea-0242ac120002 1Gi RWO 48s
pvc-1 Bound pvc-a42d81b8-e3df-11ed-b5ea-0242ac120002 1Gi RWO 48s
標記 PVC。
% kubectl label pvc pvc-0 group=myGroup
persistentvolumeclaim/pvc-0 labeled
% kubectl label pvc pvc-1 group=myGroup
persistentvolumeclaim/pvc-1 labeled
對於動態佈建,必須設定選擇器,以便快照控制器可以找到具有匹配標籤的 PVC 以一起建立快照。
apiVersion: groupsnapshot.storage.k8s.io/v1alpha1
kind: VolumeGroupSnapshot
metadata:
name: new-group-snapshot-demo
namespace: demo-namespace
spec:
volumeGroupSnapshotClassName: csi-groupSnapclass
source:
selector:
matchLabels:
group: myGroup
在 VolumeGroupSnapshot 規格中,使用者可以指定 VolumeGroupSnapshotClass,其中包含有關應使用哪個 CSI 驅動程式來建立群組快照的資訊。
將建立兩個個別的磁碟區快照作為磁碟區群組快照建立的一部分。
snapshot-62abb5db7204ac6e4c1198629fec533f2a5d9d60ea1a25f594de0bf8866c7947-2023-04-26-2.20.4
snapshot-2026811eb9f0787466171fe189c805a22cdb61a326235cd067dc3a1ac0104900-2023-04-26-2.20.4
如何在 Kubernetes 中使用群組快照進行還原
在還原時,使用者可以請求從屬於 VolumeGroupSnapshot 一部分的 VolumeSnapshot 物件建立新的 PersistentVolumeClaim。這將觸發佈建新的磁碟區,該磁碟區預先填充了來自指定快照的資料。使用者應重複此操作,直到從屬於群組快照的所有快照建立所有磁碟區。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc0-restore
namespace: demo-namespace
spec:
storageClassName: csi-hostpath-sc
dataSource:
name: snapshot-62abb5db7204ac6e4c1198629fec533f2a5d9d60ea1a25f594de0bf8866c7947-2023-04-26-2.20.4
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
作為儲存供應商,我該如何為我的 CSI 驅動程式新增群組快照支援?
若要實作磁碟區群組快照功能,CSI 驅動程式必須
- 實作新的群組控制器服務。
- 實作群組控制器 RPC:
CreateVolumeGroupSnapshot
、DeleteVolumeGroupSnapshot
和GetVolumeGroupSnapshot
。 - 新增群組控制器功能
CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT
。
請參閱 CSI 規格 和 Kubernetes-CSI 驅動程式開發人員指南,以取得更多詳細資訊。
作為可能的 CSI 磁碟區驅動程式,它提供建議的機制來部署容器化的 CSI 驅動程式,以簡化流程。
作為此建議部署流程的一部分,Kubernetes 團隊提供了許多 Sidecar(輔助)容器,包括已更新為支援磁碟區群組快照的 external-snapshotter Sidecar 容器。
external-snapshotter 監看 Kubernetes API 伺服器上的 VolumeGroupSnapshotContent
物件,並針對 CSI 端點觸發 CreateVolumeGroupSnapshot
和 DeleteVolumeGroupSnapshot
操作。
有哪些限制?
Kubernetes 的磁碟區群組快照 Alpha 實作具有以下限制
- 不支援將現有的 PVC 還原到快照表示的先前狀態(僅支援從快照佈建新的磁碟區)。
- 除了儲存系統提供的任何保證之外,沒有應用程式一致性保證(例如,當機一致性)。請參閱此 文件,以取得有關應用程式一致性的更多討論。
下一步是什麼?
根據回饋和採用情況,Kubernetes 團隊計劃在 1.28 或 1.29 版本中將 CSI 群組快照實作推進到 Beta 版。我們感興趣支援的一些功能包括磁碟區複寫、複寫群組、磁碟區佈置、應用程式靜止、已變更區塊追蹤等等。
如何瞭解更多資訊?
如何參與?
這個專案與所有 Kubernetes 專案一樣,是來自不同背景的眾多貢獻者共同努力的成果。我謹代表 SIG Storage,衷心感謝在過去幾個季度中挺身而出協助專案達到 Alpha 版的貢獻者
- Alex Meade (ameade)
- Ben Swartzlander (bswartz)
- Humble Devassy Chirammal (humblec)
- James Defelice (jdef)
- Jan Šafránek (jsafrane)
- Jing Xu (jingxu97)
- Michelle Au (msau42)
- Niels de Vos (nixpanic)
- Rakshith R (Rakshith-R)
- Raunak Shah (RaunakShah)
- Saad Ali (saad-ali)
- Thomas Watson (rbo54)
- Xing Yang (xing-yang)
- Yati Padia (yati1998)
我們還要感謝所有其他為專案做出貢獻的人,包括協助審查 KEP 和 CSI 規格 PR 的其他人。
對於那些有興趣參與 CSI 或 Kubernetes 儲存系統任何部分的設計和開發的人,請加入 Kubernetes 儲存特殊興趣小組 (SIG)。我們隨時歡迎新的貢獻者。
我們也定期舉行 資料保護工作小組會議。歡迎新參與者加入我們的討論。