K8S 1.12大特性最快最深度解析:Kubernetes CSI Snapshot(上)

CCE_huawei發表於2019-03-22


背景

許多儲存系統提供了建立儲存卷“快照”(snapshot)的能力,以防止資料丟失。快照可以替代傳統的備份系統來備份和還原主要資料和關鍵資料。快照能夠快速備份資料(例如,建立GCE PD快照僅需要幾分之一秒), 並提供快速恢復時間目標(RTO)和恢復點目標(RPO)。快照還可用於資料複製、分發和遷移。

早在kubernetes 1.8版本中,卷快照系統原型已經發布,其實現位於external-storage( https://github.com/kubernetes-incubator/external-storage)庫中。該原型基於CRD實現,提供了外部controller和provisioner兩個二進位制,支援GCE PD,AWS EBS,OpenStack Cinder,GlusterFS和Kubernetes hostPath等儲存卷。


Kubernetes的社群儲存趨勢是採用CSI實現儲存外掛,本文新增對CSI儲存外掛的快照支援。Kubernetes的趨勢是保持核心API儘可能小,因此我們採用CRD實現,並新增一個外部快照控制器來處理卷快照,external provisioner也會升級以支援從快照建立volume,CSI snapshot規範詳情可以在 檢視。

目標


對於Kubernetes中的第一個快照支援版本,我們僅支援CSI卷外掛按需建立快照。

目標1: 實現標準化的快照操作,支援建立,列出和刪除快照等REST API。目前,API將使用CRD(CustomResourceDefinitions)實現。

目標2: 實現CSI卷快照支援。external-snapshotter將與CSI卷外掛的其他外部元件(例如,external-attacher, external-provisioner)一起部署。

目標3: 提供一種從快照建立新儲存卷和還原現有卷的便捷方法。

以下目標本階段將不會實現,但將在稍後階段考慮。

目標4: 透過提供pre/post快照鉤子來凍結/解凍應用程式和/或解除安裝/掛載檔案系統,從而提供應用程式一致性快照。

目標5: 提供更高階別的管理,例如備份和還原pod和statefulSet,以及建立一致性的快照組。

詳細設計


在此提案中,卷快照被視為Kubernetes管理的另一種儲存資源。 因此,快照API和控制器遵循現有卷管理的設計模式。 

VolumeSnapshot

VolumeSnapshotContent

VolumeSnapshotClass

三個API, 它們與PersistentVolumeClaim和PersistentVolume以及storageClass的結構類似。外部快照控制器的功能類似於in-tree的PV控制器。同時建議在PersistentVolumeClaim(PVC)API中新增新的資料來源結構,以支援從快照還原資料卷。 以下部分將詳細介紹API和控制器設計。


Snapshot API設計


VolumeSnapshot和VolumeSnapshotContent API是在PersistentVolumeClaim和PersistentVolume之後建模設計的。 在第一個版本中,VolumeSnapshot生命週期完全獨立於其來源(PVC)。 刪除PVC / PV時,相應的VolumeSnapshot和VolumeSnapshotContent物件將繼續存在。 但是,對於某些卷外掛,快照依賴於其儲存卷。 在未來的版本中,我們計劃進行完整的生命週期管理,以便更好地處理快照與其卷之間的關係。(例如,新增finalizer,當有快照依賴於儲存卷時,可防止儲存卷被刪除)。


VolumeSnapshot物件

K8S 1.12大特性最快最深度解析:Kubernetes CSI Snapshot(上)


VolumeSnapshotContent物件

K8S 1.12大特性最快最深度解析:Kubernetes CSI Snapshot(上)

K8S 1.12大特性最快最深度解析:Kubernetes CSI Snapshot(上)

VolumeSnapshotClass物件


我們將新增新的API物件VolumeSnapshotCl ass,而不是複用現有的StorageClass,以避免在snapshot和volume之間混合引數。每個CSI卷外掛都可以擁有自己的預設VolumeSnapshotClass。如果未提供VolumeSnapshotClass,則將使用預設值。VolumeSnapshotClass將為快照新增新的引數。


Snapshot Controller  設計要點

如下圖所示, CSI快照控制器體系結構由external-snapshotter(外部快照器)組成,external-snapshotter透過套接字與out-of-tree CSI卷外掛進行通訊(預設情況下為/ run / csi / socket,可由-csi-address配置)。external-snapshotter是Kubernetes實現容器儲存介面(CSI)的一部分。 它是一個外部控制器,用於監視VolumeSnapshot和VolumeSnapshotContent物件並建立/刪除快照。

  • 通常 external-snapshotter使用ControllerGetCapabilities來驗證CSI驅動程式是否支援CREATE_DELETE_SNAPSHOT呼叫。

  • external-snapshotter負責建立/刪除快照及繫結VolumeSnapshot和VolumeSnapshotContent物件。它遵循kubernetes控制器模式並使用informer來監視VolumeSnapshot和VolumeSnapshotContent建立/更新/刪除事件。透過Snapshotter == <CSI卷外掛名字>過濾掉不符合的VolumeSnapshot例項,並使用具有指數退避的工作佇列處理這些事件。

  • 對於動態建立的快照,它應該關聯某個VolumeSnapshotClass。使用者可以在VolumeSnapshot API物件中顯式指定VolumeSnapshotClass。如果使用者未指定VolumeSnapshotClass,則將使用admin建立的預設VolumeSnapshotClass。這和使用預設的StorageClass來配置PersistentVolumeClaim相似。

  • 對於靜態繫結快照,user/admin必須為VolumeSnapshot和VolumeSnapshotContent正確指定雙向指標,以便控制器知道如何繫結它們。否則,如果VolumeSnapshot指向不存在的VolumeSnapshotContent,或者是VolumeSnapshotContent並未指向VolumeSnapshot,則將VolumeSnapshot設定為錯誤狀態。

  • 針對每一個CSI卷外掛,external-snapshotter、external-attacher和external-provisioner執行在同一個sidecar中。

  • 在當前設計中,當儲存系統無法建立快照時,將不會在控制器中執行重試。這是因為當快照建立的時間很重要時,使用者可能不想在獲取一致性快照或計劃快照時重試。在將來的版本中,將新增maxRetries標誌或重試終止時間戳,以允許使用者控制是否需要重試。

相關服務請訪問:https://support.huaweicloud.com/cce/index.html?utm_content=cce_helpcenter_2019


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69908804/viewspace-2639041/,如需轉載,請註明出處,否則將追究法律責任。

相關文章