您好,登錄后才能下訂單哦!
許多存儲系統提供了創建存儲卷“快照”(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對象
VolumeSnapshotContent對象
VolumeSnapshotClass對象
我們將添加新的API對象VolumeSnapshotClass,而不是復用現有的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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。