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


背景

 

許多存儲系統提供了創建存儲卷“快照”(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規范詳情可以在https://github.com/container-storage-interface/spec/pull/224查看。

 

目標

 

 

對於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對象

 

1.PNG

2.PNG 

VolumeSnapshotContent對象

 

3.PNG

4.PNG

 

VolumeSnapshotClass對象

 

我們將添加新的API對象VolumeSnapshotClass,而不是復用現有的StorageClass,以避免在snapshot和volume之間混合參數。每個CSI卷插件都可以擁有自己的默認VolumeSnapshotClass。如果未提供VolumeSnapshotClass,則將使用默認值。VolumeSnapshotClass將為快照添加新的參數。

5.PNG

 

 

Snapshot Controller  設計要點

 

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

6.PNG 

    • 通常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標志或重試終止時間戳,以允許用戶控制是否需要重試。

    •  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM