Kubernetes v1.12引入了對volume snapshotting alpha的支持。此功能允許創建/刪除卷快照,以及使用Kubernetes API本機創建新卷的功能。

1 什麼是快照?

許多存儲系統(如Google Cloud Persistent Disks、Amazon Elastic Block Storage和許多內部部署存儲系統)都能夠創建持久卷的「快照」。快照表示卷的時間點副本。快照可用於配置新卷(預先填充快照數據)或將現有卷還原到先前狀態(由快照表示)。

2 為什麼要將快照引入到Kubernetes?

Kubernetes卷插件系統已經提供了一個強大的抽象功能,可以自動化塊和文件存儲的配置、掛載和安裝。

支持所有這些功能的是Kubernetes工作負載可移植性的目標:Kubernetes旨在在分散式系統應用程序和底層集羣之間創建一個抽象層,以便應用程序可以與運行的集羣的細節無關,並且應用程序部署不需要「特定於集羣」的知識。??Kubernetes Storage SIG將快照操作定為許多有狀態工作負載的關鍵功能。例如,資料庫管理員可能希望在開始資料庫操作之前對資料庫卷進行快照。

通過提供在Kubernetes API中觸發快照操作的標準方法,Kubernetes用戶現在可以處理這樣的用例,而無需繞過Kubernetes API(並手動執行特定於存儲系統的操作)。 相反,Kubernetes用戶現在有權將集羣無關的快照操作合併到他們的工具和策略中,並且知道無論底層存儲如何,它都可以對任意Kubernetes集羣起作用。 此外,這些Kubernetes快照原語充當了基本構建塊,可以為Kubernetes開發高級企業級存儲管理功能:例如數據保護、數據複製和數據遷移。

3 哪個卷插件支持Kubernetes Snapshots?

Kubernetes支持三種類型的卷插件:in-tree、Flex和CSI。有關詳細信息,請參閱Kubernetes Volume Plugin FAQ。 僅CSI驅動程序支持快照(不適用於in-tree或Flex)。要使用Kubernetes快照功能,請確保在集羣上部署實現快照的CSI驅動程序。 目前,以下CSI驅動程序支持快照:GCE Persistent Disk CSI Driver、OpenSDS CSI Driver、Ceph RBD CSI Driver、Portworx CSI Driver。 其他驅動程序的快照支持工作正在進行,應該很快就可以使用。閱讀「Kubernetes Goes Beta的容器存儲介面(CSI)」博客文章,瞭解有關CSI以及如何部署CSI驅動程序的更多信息。

4 Kubernetes Snapshots API

與管理Kubernetes Persistent Volumes的API類似,Kubernetes Volume Snapshots引入了三個用於管理快照的新API對象:

? VolumeSnapshot——由Kubernetes用戶創建,以請求為指定卷創建快照。它包含有關快照操作的信息,例如拍攝快照時的時間戳以及快照是否可以使用;與PersistentVolumeClaim對象類似,此對象的創建和刪除表示用戶創建或刪除集羣資源(快照)的願望。

? VolumeSnapshotContent——成功創建快照後,由CSI卷驅動程序創建。它包含有關快照的信息,包括快照ID;與PersistentVolume對象類似,此對象表示集羣上的已配置資源(快照);與PersistentVolumeClaim和PersistentVolume對象一樣,創建快照後,VolumeSnapshotContent對象將綁定到為其創建的VolumeSnapshot(使用一對一映射)。

? VolumeSnapshotClass——由集羣管理員創建,以描述應如何創建快照。包括驅動程序信息、訪問快照的祕密等。

值得注意的是,與核心Kubernetes Persistent Volume對象不同,這些Snapshot對象被定義為CustomResourceDefinitions(CRD)。Kubernetes項目正逐漸遠離擁有API伺服器中預定義的資源類型,並且正朝著API伺服器獨立於API對象的模型發展。這允許API伺服器可以重用於Kubernetes以外的項目,而使用者(如Kubernetes)可以簡單地安裝它們作為CRD所需的資源類型。

支持快照的CSI驅動程序將自動安裝所需的CRD。Kubernetes最終用戶只需要驗證支持快照的CSI驅動程序是否部署在其Kubernetes集羣上。 除了這些新對象之外,還在PersistentVolumeClaim對象中添加了一個新的DataSource欄位:

type PersistentVolumeClaimSpec struct {

AccessModes []PersistentVolumeAccessMode

Selector *metav1.LabelSelector

Resources ResourceRequirements

VolumeName string

StorageClassName *string

VolumeMode *PersistentVolumeMode

DataSource *TypedLocalObjectReference

}

此新的alpha欄位可以創建新卷,並使用現有快照中的數據自動預填充。

5 Kubernetes快照要求

在使用Kubernetes Volume Snapshotting之前,你必須:

? 確保在Kubernetes集羣上部署並運行實施快照的CSI驅動程序。

? 通過新的Kubernetes功能gate啟用Kubernetes Volume Snapshotting功能(默認情況下禁用alpha)

? 在API伺服器二進位文件上設置以下標誌: - feature-gates = VolumeSnapshotDataSource = true

在創建快照之前,還需要通過創建VolumeSnapshotClass對象並將snapshotter欄位設置為指向CSI驅動程序來為快照指定CSI驅動程序信息。在下面的VolumeSnapshotClass示例中,CSI驅動程序是com.example.csi-driver。每個快照配置程序至少需要一個VolumeSnapshotClass對象。你還可以通過在類定義中放置注釋snapshot.storage.kubernetes.io:「true」來為每個單獨的CSI驅動程序設置默認的VolumeSnapshotClass。

apiVersion: snapshot.storage.k8s.io

kind: VolumeSnapshotClass

metadata:

name: default-snapclass

annotations:

snapshot.storage.kubernetes.io "true"

snapshotter: com.example.csi-driver

apiVersion: snapshot.storage.k8s.io

kind: VolumeSnapshotClass

metadata:

name: csi-snapclass

snapshotter: com.example.csi-driver

parameters:

fakeSnapshotOption: foo

csiSnapshotterSecretName: csi-secret

csiSnapshotterSecretNamespace: csi-namespace

你必須根據CSI驅動程序的文檔設置任何所需的不透明參數。如上面的示例所示,參數fakeSnapshotOption:foo和任何引用的祕密將在快照創建和刪除期間傳遞給CSI驅動程序。默認CSI外部快照程序保留參數祕密csiSnapshotterSecretName和csiSnapshotterSecretNamespace。如果指定,它將獲取祕密並在創建和刪除快照時將其傳遞給CSI驅動程序。 最後,在創建快照之前,你必須使用CSI驅動程序配置卷,並使用你想要快照的一些數據填充它(請參閱有關如何創建和使用CSI卷的CSI博客文章)。

6 使用Kubernetes創建新快照

定義VolumeSnapshotClass對象並且你有要快照的卷後,可以通過創建VolumeSnapshot對象來創建新快照。 快照源指定要從中創建快照的卷。它有兩個參數:

? kind ——必須是PersistentVolumeClaim

? name —— PVC API對象名稱

?

假定卷的快照命名空間與VolumeSnapshot對象的命名空間相同。

apiVersion: snapshot.storage.k8s.io

kind: VolumeSnapshot

metadata:

name: new-snapshot-demo

namespace: demo-namespace

spec:

snapshotClassName: csi-snapclass

source:

name: mypvc

kind: PersistentVolumeClaim

在VolumeSnapshot規範中,用戶可以指定VolumeSnapshotClass,其中包含有關應使用哪個CSI驅動程序創建快照的信息。創建VolumeSnapshot對象時,VolumeSnapshotClass中的參數fakeSnapshotOption:foo和任何引用的祕密將通過CreateSnapshot調用傳遞給CSI插件com.example.csi-driver。

作為響應,CSI驅動程序觸髮捲的快照,然後自動創建VolumeSnapshotContent對象以表示新快照,並將新的VolumeSnapshotContent對象綁定到VolumeSnapshot,使其可以使用。如果CSI驅動程序無法創建快照並返回錯誤,則快照控制器將報告VolumeSnapshot對象狀態中的錯誤,並且不會重試(這與Kubernetes中的其他控制器不同,並且是為了防止意外在錯誤的時間拍攝快照)。

如果未指定快照類,外部快照程序將嘗試查找並為快照設置默認快照類。由默認快照類中的snapshotter指定的CSI驅動程序必須與PVC存儲類中的配置程序指定的CSI驅動程序匹配。

請注意,Kubernetes Snapshot的alpha版本不提供任何一致性保證。在拍攝快照以確保數據一致性之前,你必須準備應用程序(暫停應用程序,凍結文件系統等)。

你可以通過運行kubectl describe volumesnapshot驗證是否已創建VolumeSnapshot對象並使用VolumeSnapshotContent綁定:

? 應在Status下將Ready設置為true,以指示此卷快照已準備就緒。

? 「Creation Time」欄位指示實際創建(剪切)快照的時間。

? 「Restore Size」欄位表示從快照還原卷時的最小卷大小。

? 規範中的「Snapshot Content Name」欄位指向為此快照創建的VolumeSnapshotContent對象。

7 使用Kubernetes導入現有快照

你始終可以通過手動創建VolumeSnapshotContent對象來將現有快照導入Kubernetes,以表示現有快照。由於VolumeSnapshotContent是非命名空間API對象,因此只有系統管理員纔有權創建它。創建VolumeSnapshotContent對象後,用戶可以創建指向VolumeSnapshotContent對象的VolumeSnapshot對象。在驗證快照存在且VolumeSnapshot和VolumeSnapshotContent對象之間的綁定正確後,外部快照控制器會將快照標記為就緒。綁定後,快照就可以在Kubernetes中使用了。

應使用以下欄位創建VolumeSnapshotContent對象,以表示預配置的快照:

? csiVolumeSnapshotSource —— 快照標識信息。

? snapshotHandle —— 快照的名稱/標識符。這是必需欄位。

? 驅動程序 ——用於處理此卷的CSI驅動程序。這是必需欄位。它必須與快照控制器中的快照程序名稱匹配。

? creationTime和restoreSize——預配置卷不需要這些欄位。外部快照控制器將在創建後自動更新它們。

? volumeSnapshotRef——指向此對象應綁定到的VolumeSnapshot對象的指針。name和namespace ——它指定內容綁定到的VolumeSnapshot對象的名稱和命名空間。

? UID - 預配置卷不需要這些欄位。外部快照控制器將在綁定後自動更新欄位。如果用戶指定UID欄位,則他/她必須確保它與綁定快照的UID匹配。如果指定的UID與綁定快照的UID不匹配,則該內容將被視為孤立對象,控制器將刪除該對象及其關聯的快照。

? snapshotClassName——此欄位是可選的。外部快照控制器將在綁定後自動更新欄位。

?

apiVersion: snapshot.storage.k8s.io

kind: VolumeSnapshotContent

metadata:

name: static-snapshot-content

spec:

csiVolumeSnapshotSource:

driver: com.example.csi-driver

snapshotHandle: snapshotcontent-example-id

volumeSnapshotRef:

kind: VolumeSnapshot

name: static-snapshot-demo

namespace: demo-namespace

應創建VolumeSnapshot對象以允許用戶使用快照:

? snapshotClassName——卷快照類的名稱。該欄位是可選的。 如果設置,則快照類中的快照程序欄位必須與快照控制器的快照程序名稱匹配。如果未設置,快照控制器將嘗試查找默認快照類。

? snapshotContentName——卷快照內容的名稱。預配置卷需要此欄位。

?

apiVersion: snapshot.storage.k8s.io

kind: VolumeSnapshot

metadata:

name: static-snapshot-demo

namespace: demo-namespace

spec:

snapshotClassName: csi-snapclass

snapshotContentName: static-snapshot-content

創建這些對象後,快照控制器將它們綁定在一起,並將欄位Ready(在Status下)設置為True以指示快照已準備就緒。

8 使用Kubernetes從快照配置新卷

要配置預先填充了來自快照對象的數據的新卷,請使用PersistentVolumeClaim中的新dataSource欄位。 它有三個參數: name——表示要用作源的快照的VolumeSnapshot對象的名稱 kind —— 必須是VolumeSnapshot? apiGroup —— 必須是snapshot.storage.k8s.io??假定源VolumeSnapshot對象的命名空間與PersistentVolumeClaim對象的命名空間相同。

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

name: pvc-restore

Namespace: demo-namespace

spec:

storageClassName: csi-storageclass

dataSource:

name: new-snapshot-demo

kind: VolumeSnapshot

apiGroup: snapshot.storage.k8s.io

accessModes:

- ReadWriteOnce

resources:

requests:

storage: 1Gi

創建PersistentVolumeClaim對象時,它將觸發預先填充了來自指定快照的數據的新卷的配置。

9 作為存儲供應商,如何向CSI驅動程序添加對快照的支持?

要實現快照功能,CSI驅動程序必須添加對其他控制器功能CREATE_DELETE_SNAPSHOT和LIST_SNAPSHOTS的支持,並實現其他控制器RPC:CreateSnapshot、DeleteSnapshot和ListSnapshots。有關詳細信息,請參閱CSI規範。 儘管Kubernetes儘可能在CSI卷驅動程序的打包和部署方面具有最低限度的規定,但它提供了在Kubernetes上部署任意容器化CSI驅動程序的建議機制,以簡化容器化CSI兼容卷驅動程序的部署。 作為推薦部署過程的一部分,Kubernetes團隊提供了許多邊車(輔助)容器,包括一個新的外部快照邊車容器。??external-snapshotter監視Kubernetes API伺服器以查找VolumeSnapshot和VolumeSnapshotContent對象,並針對CSI端點觸發CreateSnapshot和DeleteSnapshot操作。 CSI外部供應商邊車容器也已更新,以支持使用新的dataSource PVC欄位從快照恢復卷。 為了支持快照功能,建議存儲供應商除了外部配置器、外部掛載器以及它們的CSI驅動器之外,還要部署外部快照器邊車容器,如下圖所示。

在此示例中,部署yaml文件、兩個邊車容器、外部配置器和外部快照器以及CSI驅動程序與statefulset pod中的hostpath CSI插件一起部署。 Hostpath CSI插件是一個示例插件,不適用於生產。

10 alpha有什麼限制?

Kubernetes快照的alpha實現具有以下限制:

? 不支持將現有卷還原到快照表示的早期狀態(alpha僅支持從快照配置新卷)。

? 不支持從快照中對現有PersistentVolumeClaim進行「就地恢復」:即從快照配置新卷,但更新現有PersistentVolumeClaim以指向新卷並有效地使PVC看起來恢復到早期狀態( alpha僅支持使用通過新PV / PVC從快照配置的新卷。

? 沒有快照一致性保證超出存儲系統提供的任何保證(例如崩潰一致性)。

11 下一步是什麼?

根據反饋和採用情況,Kubernetes團隊計劃將CSI Snapshot實施推向1.13或1.14中的beta。

12 怎樣才能瞭解更多?

請查看有關快照功能的其他文檔:http://k8s.io/docs/concepts/stkubernetes-csi.github.io

13 如何參與?

像所有Kubernetes項目一樣,這個項目是許多來自不同背景的貢獻者共同努力的結果。

除了一直致力於快照功能的貢獻者:Xing Yang(xing-yang)、Jing Xu(jingxu97)、Huamin Chen(rootfs)、Tomas Smetana(tsmetana)、Shiwei Xu(wackxu)之外,我們非常感謝Kubernetes Storage SIG和CSI社區的所有貢獻者,他們幫助審核了項目的設計和實施,包括但不限於:Saad Ali (saadali)、Tim Hockin (thockin)、Jan ?afránek (jsafrane)、Luis Pabon (lpabon)、Jordan Liggitt (liggitt)、David Zhu (davidz627)、Garth Bushell (garthy)、Ardalan Kangarlou (kangarlou)、Seungcheol Ko (sngchlko)、Michelle Au (msau42)、Humble Devassy Chirammal (humblec)、Vladimir Vivien (vladimirvivien)、John Griffith (j-griffith)、Bradley Childs (childsb)、Ben Swartzlander (bswartz)、Michelle Au(msau42)、Humble Devassy Chirammal(humblec)、Vladimir Vivien(vladimirvivien)、John Griffith (j-griffith)、Bradley Childs (childsb)、Ben Swartzlander (bswartz)。 如果你有興趣參與CSI或Kubernetes存儲系統的任何部分的設計和開發,請加入Kubernetes存儲特別興趣小組(SIG)。我們正在快速成長,並始終歡迎新的貢獻者

全球Kubernetes認證CKA滬杭班火熱招生中!團購優惠可詳詢


推薦閱讀:
相關文章