1. 程式人生 > >乾貨解析 |為什麼要將快照引入Kubernetes?

乾貨解析 |為什麼要將快照引入Kubernetes?

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/is-default-class:“true”來為每個單獨的CSI驅動程式設定預設的VolumeSnapshotClass。

 

apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotClass metadata:  name: default-snapclass  annotations:    snapshot.storage.kubernetes.io/is-default-class: "true" snapshotter: com.example.csi-driver apiVersion: snapshot.storage.k8s.io/v1alpha1 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/v1alpha1 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/v1alpha1 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/v1alpha1 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/storage/volume-snapshots和https://kubernetes-csi.github.io/docs/

 

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)。我們正在快速成長,並始終歡迎新的貢獻者