Kubernetes對卷快照Alpha支援的現況
作者:Jing Xu(谷歌)、Xing Yang(華為)、Saad Ali(谷歌)
Kubernetes v1.12引入了卷快照(volume snapshot)支援作為alpha功能。在Kubernetes v1.13,它仍然是alpha功能,但增加了一些強化和一些重大更改。這篇文章總結了這些變化。
重大更改
CSI spec v1.0 對卷快照功能進行了一些重大更改。CSI驅動程式維護者在升級其驅動程式以支援v1.0時,應該瞭解這些更改。
SnapshotStatus替換為Boolean ReadyToUse
在CSI v0.3.0,CreateSnapshotResponse中定義了SnapshotStatus列舉(enum),表示快照是READY,UPLOADING,還是ERROR_UPLOADING。在CSI v1.0,SnapshotStatus已從CreateSnapshotResponse中刪除,並替換為布林值(boolean)ReadyToUse。ReadyToUse值為true,表示完成後快照處理(post snapshot processing),例如上載,並且快照已準備好用作建立卷的源。
需要進行後快照處理的儲存系統(例如在快照完成後上傳),應該在快照完成後返回成功的CreateSnapshotResponse,並將ReadyToUse欄位設定為false。這表示容器箱編排系統(Container Orchestration System,CO),可以恢復因為進行快照而停頓的任何工作負載。然後,CO可以重複呼叫CreateSnapshot,直到ReadyToUse欄位設定為true,或該呼叫返回一個錯誤,指示處理中出現問題。CSI ListSnapshot呼叫可以與snapshot_id過濾一起使用,以確定快照是否可以使用,但不推薦使用這個方式,因為它無法在處理過程中檢測錯誤(ReadyToUse欄位只是無限期地保持為false)。
CSI外部快照邊車容器(external-snapshotter sidecar container)的 v1.x.x版本 ,已通過呼叫CreateSnapshot,而不是ListSnapshots來處理此更改,以檢查快照是否可以使用。當升級驅動程式到CSI 1.0時,驅動程式維護者應使用相應的1.0相容邊車(sidecar)容器。
為了與CSI規範的更改保持一致,VolumeSnapshot API物件中的Ready欄位已重新命名為ReadyToUse。當執行kubectl describe volumesnapshot以檢視快照的詳細資訊時,使用者可以看到此更改。
時間戳資料型別
快照的建立時間作為VolumeSnapshotContent API物件的一部分可供Kubernetes管理員使用。該欄位使用CSI CreateSnapshotResponse中的creation_time欄位填充。在CSI v1.0中,此creation_time欄位型別已更改為.google.protobuf.Timestamp,而不是int64。將驅動程序升級到CSI 1.0時,驅動程式維護者必須相應地進行更改。CSI外部快照程式邊車容器的 v1.x.x版本 已更新以處理此更改。
棄用
以下VolumeSnapshotClass引數已被棄用(deprecated),將在以後的版本中刪除。它們將替換為下面Replacement“替換”部分中列出的引數。
棄用csiSnapshotterSecretName,替換csi.storage.k8s.io/snapshotter-secret-name
棄用csiSnapshotterSecretNameSpace,替換csi.storage.k8s.io/snapshotter-secret-namespace
新功能
SnapshotContent刪除/保留(Deletion/Retain)政策
如在 宣佈快照alpha的初始部落格文章 中所述,Kubernetes快照API類似於PV/PVC API:就像卷(volume),由繫結的PVC和PV對錶示一樣,快照由繫結的VolumeSnapshot和VolumeSnapshotContent對錶示。
對於PV/PVC對,當用戶完成使用卷時,他們可以刪除PVC。PV上的回收政策決定PV之後的處理(是刪除,還是保留)。
在最初的alpha版本中,快照不支援指定回收政策的功能。當刪除快照物件時,它總是導致快照被刪除。在Kubernetes v1.13中,添加了快照內容DeletionPolicy。它使管理員,能夠配置VolumeSnapshotContent在繫結的VolumeSnapshot物件被刪除後的處理方式。卷快照的DeletionPolicy可以是Retain(刪除)或Delete(保留)。如果未指定該值,則預設值取決於SnapshotContent物件,是通過靜態繫結,還是動態配置建立的。
Retain(保留)
Retain(保留)政策允許手動回收資源。如果是靜態建立並繫結VolumeSnapshotContent,則預設的DeletionPolicy為Retain。刪除VolumeSnapshot時,VolumeSnapshotContent繼續存在,VolumeSnapshotContent被視為“已釋放”(“released”)。但它不能用於繫結到其他VolumeSnapshot物件,因為它包含資料。由管理員決定如何處理剩餘的API物件和資源清理。
Delete(刪除)
Delete(刪除)政策允許從Kubernetes自動刪除繫結的VolumeSnapshotContent物件,以及外部基礎結構中的關聯儲存資產(例如AWS EBS快照,或GCE PD快照等)。動態配置的快照會繼承其VolumeSnapshotClass的刪除政策,該政策預設為Delete。
管理員應使用所需的保留政策配置VolumeSnapshotClass。建立政策後,通過修補(patching)物件,可以更改單個VolumeSnapshotContent的政策。
以下示例演示如何檢查動態調配的VolumeSnapshotContent的刪除政策。
$ kubectl create -f ./examples/kubernetes/demo-defaultsnapshotclass.yaml $ kubectl create -f ./examples/kubernetes/demo-snapshot.yaml $ kubectl get volumesnapshots demo-snapshot-podpvc -o yaml apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshot metadata: creationTimestamp: "2018-11-27T23:57:09Z" ... spec: snapshotClassName: default-snapshot-class snapshotContentName: snapcontent-26cd0db3-f2a0-11e8-8be6-42010a800002 source: apiGroup: null kind: PersistentVolumeClaim name: podpvc status: … $ kubectl get volumesnapshotcontent snapcontent-26cd0db3-f2a0-11e8-8be6-42010a800002 -o yaml apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotContent … spec: csiVolumeSnapshotSource: creationTime: 1546469777852000000 driver: pd.csi.storage.gke.io restoreSize: 6442450944 snapshotHandle: projects/jing-k8s-dev/global/snapshots/snapshot-26cd0db3-f2a0-11e8-8be6-42010a800002 deletionPolicy: Delete persistentVolumeRef: apiVersion: v1 kind: PersistentVolume name: pvc-853622a4-f28b-11e8-8be6-42010a800002 resourceVersion: "21117" uid: ae400e9f-f28b-11e8-8be6-42010a800002 snapshotClassName: default-snapshot-class volumeSnapshotRef: apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshot name: demo-snapshot-podpvc namespace: default resourceVersion: "6948065" uid: 26cd0db3-f2a0-11e8-8be6-42010a800002
使用者可以使用補丁(patch)更改刪除政策:
$ kubectl patch volumesnapshotcontent snapcontent-26cd0db3-f2a0-11e8-8be6-42010a800002 -p '{"spec":{"deletionPolicy":"Retain"}}' --type=merge $ kubectl get volumesnapshotcontent snapcontent-26cd0db3-f2a0-11e8-8be6-42010a800002 -o yaml apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotContent ... spec: csiVolumeSnapshotSource: ... deletionPolicy: Retain persistentVolumeRef: apiVersion: v1 kind: PersistentVolume name: pvc-853622a4-f28b-11e8-8be6-42010a800002 ...
保護使用中的快照物件
“保護使用中的快照物件”(Snapshot Object in Use Protection)功能的目的,是確保不會從系統中刪除正在使用的快照API物件(因為這可能會導致資料丟失)。有兩種情況需要“使用中”(“in-use”)保護:
- 如果卷快照正在被PVC作為建立卷的源。
- 如果VolumeSnapshotContent API物件繫結到VolumeSnapshot API物件,會認為該內容物件正在使用中。
如果使用者刪除PVC正在使用的VolumeSnapshot API物件,VolumeSnapshot物件不會被立即刪除。刪除VolumeSnapshot物件被推遲,直到任何PVC不再使用VolumeSnapshot。同樣,如果管理員刪除了繫結到VolumeSnapshot的VolumeSnapshotContent,VolumeSnapshotContent不會被立即刪除。刪除VolumeSnapshotContent被推遲,直到VolumeSnapshotContent沒有繫結到VolumeSnapshot物件。
哪些卷外掛支援Kubernetes快照?
快照僅在CSI驅動程式支援(不適用於樹內“in-tree”或Flexvolume)。要使用Kubernetes快照功能,請確保在群集上部署實現快照的CSI驅動程式。
截至本博文釋出時,以下CSI驅動程式支援快照:
- GCE Persistent Disk CSI Driver
- OpenSDS CSI Driver
- Ceph RBD CSI Driver
- Portworx CSI Driver
- GlusterFS CSI Driver
- Digital Ocean CSI Driver
- Ember CSI Driver
- Cinder CSI Driver
- Datera CSI Driver
- NexentaStor CSI Driver
其他 驅動程式 的快照支援正在等待階段,應該很快就可以使用。閱讀“Kubernetes的容器儲存介面(CSI)GA了”部落格文章,瞭解有關CSI以及如何部署CSI驅動程式的更多資訊。
下一步?
根據反饋和採用情況,Kubernetes團隊計劃將CSI Snapshot實施在1.15或1.16版本推向beta。我們感興趣的一些功能包括一致性組(consistency group)、應用程式一致性快照、工作負載停頓、就地恢復等。
怎樣才能瞭解更多?
快照API和控制器的程式碼儲存庫位於: https://github.com/kubernetes...
在此處檢視有關快照功能的其他文件: http://k8s.io/docs/concepts/s... ://kubernetes-csi.github.io/docs/
怎樣參與?
像所有Kubernetes一樣,這個專案是許多來自不同背景的貢獻者共同努力的結果。
特別感謝所有幫助增加CSI v1.0支援,並改進此版本快照功能的貢獻者,包括Saad Ali( saadali )、Michelle Au( msau42 )、Deep Debroy( ddebroy )、James DeFelice( jdef )、John Griffith ( j-griffith )、Julian Hjortshoj( julian-hj )、Tim Hockin( thockin )、Patrick Ohly( pohly )、Luis Pabon( lpabon )、Cheng Xing( verult )、Jing Xu( jingxu97 )、Shiwei Xu( wackxu )、Xing Yang( xing-yang )、Jie Yu( jieyu )、David Zhu( davidz627 )。
有興趣參與CSI或Kubernetes儲存系統任何部分的設計和開發的人士,請加入 Kubernetes儲存特別興趣小組 (SIG)。我們正在快速成長,一直歡迎新的貢獻者。
我們還定期召開 SIG-Storage Snapshot工作組會議 。歡迎新的參與者加入設計和開發的討論。
2019年KubeCon + CloudNativeCon中國論壇提案徵集(CFP)現已開放
KubeCon + CloudNativeCon 論壇讓使用者、開發人員、從業人員匯聚一堂,面對面進行交流合作。與會人員有 Kubernetes、Prometheus 及其他雲原生計算基金會 (CNCF) 主辦專案的領導,和我們一同探討雲原生生態系統發展方向。
在中國開源峰會上,與會者將共同合作及共享資訊,瞭解最新和最有趣的開源技術,包括 Linux、容器、雲技術、網路、微服務等;並獲得如何在開源社群中導向和引領的資訊。
大會日期:
- 提案徵集截止日期:太平洋標準時間 2 月 15 日,星期五,晚上 11:59
- 提案徵集通知日期:2019 年 4 月 1 日
- 會議日程通告日期:2019 年 4 月 3 日
- 幻燈片提交截止日期:6 月 17 日,星期一
- 會議活動舉辦日期:2019 年 6 月 24 至 26 日
2019年KubeCon + CloudNativeCon + Open Source Summit China贊助方案出爐啦