介紹Kubernetes的卷克隆Alpha

  • 2019 年 12 月 4 日
  • 筆記

作者:John Griffith(紅帽)

Kubernetes v1.15引入了對卷克隆的alpha支援。該特性允許使用Kubernetes API使用用戶命名空間中現有卷的內容創建新卷。

什麼是克隆?

許多存儲系統提供創建卷的「克隆」功能。克隆是一個現有卷的副本,它是系統上自己惟一的卷,但是源上的數據被複制到目標(克隆)。克隆類似於快照,因為它是卷的一個時間點副本,但是我們不是從卷創建一個新的快照對象,而是創建一個新的獨立卷,有時被認為是預填充新創建的卷。

為什麼要把克隆技術加到Kubernetes

Kubernetes卷插件系統已經提供了一個強大的抽象,可以自動提供、附加和掛載塊和文件存儲。

所有這些特性的目標是支援Kubernetes工作負載的可移植性:Kubernetes的目標是在分散式系統應用程式和底層集群之間創建一個抽象層,這樣應用程式就可以不知道它們所運行的集群的具體情況,並且應用程式部署不需要特定的存儲設備知識。

Kubernetes存儲SIG將克隆操作確定為許多有狀態工作負載的關鍵功能。例如,資料庫管理員可能希望複製資料庫卷,並創建現有資料庫的另一個實例。

https://github.com/kubernetes/community/tree/master/sig-storage

通過在Kubernetes API中提供觸發克隆操作的標準方法,Kubernetes用戶現在可以處理這樣的用例,而無需環繞Kubernetes API(以及手動執行存儲系統特定的操作)。雖然克隆在行為上類似於創建卷快照,然後從快照創建卷,但是克隆操作更精簡,對於許多後端設備更有效。

Kubernetes用戶現在可以以一種集群無關的方式,將克隆操作合併到他們的工具和政策中,並且可以放心地知道,無論底層存儲是什麼,克隆操作都可以針對任意的Kubernetes集群工作。

Kubernetes API和克隆

Kubernetes中的克隆特性是通過PersistentVolumeClaim.DataSource欄位啟用的。在v1.15之前,惟一允許作為數據源(dataSource)使用的有效對象類型是VolumeSnapshot。克隆特性擴展了允許的PersistentVolumeclaim.DataSource.Kind欄位不僅允許VolumeSnapshot,還允許PersistentVolumeClaim。現有行為不會更改。

沒有引入新的對象來啟用克隆。而是對PersistentVolumeClaim對象中的現有數據源欄位進行了擴展,以便能夠接受同一命名空間中現有的PersistentVolumeClaim的名稱。重要的是要注意,從用戶的角度來看,克隆只是另一個PersistentVolume和PersistentVolumeClaim,惟一的區別是這個PersistentVolume是在創建時用另一個PersistentVolume的內容填充的。創建之後,它的行為與任何其他Kubernetes PersistentVolume完全相同,並遵循相同的行為和規則。

哪些卷插件支援Kubernetes克隆?

Kubernetes支援三種類型的卷插件:in-tree、Flex和容器存儲介面(Container Storage Interface ,CSI)。有關詳細資訊,請參閱Kubernetes Volume Plugin FAQ。

https://github.com/container-storage-interface/spec/blob/master/spec.md

https://github.com/kubernetes/community/blob/master/sig-storage/volume-plugin-faq.md

克隆只支援CSI驅動程式(不支援in-tree或Flex)。要使用Kubernetes克隆特性,請確保在集群上部署了實現克隆的CSI驅動程式。有關當前支援克隆的CSI驅動程式列表,請參閱CSI驅動程式文檔。

https://kubernetes-csi.github.io/docs/drivers.html

Kubernetes克隆需求

在使用Kubernetes卷克隆之前,你必須:

  • 確保在Kubernetes集群上部署並運行實現克隆的CSI驅動程式。
  • 通過新的Kubernetes特性門啟用Kubernetes卷克隆特性(alpha默認禁用):
    • 在API伺服器二進位文件上設置以下標誌:–features-gates=VolumePVCDataSource=true
  • 源和目標聲明必須位於相同的命名空間中。

在Kubernetes創建一個克隆

要使用現有Kubernetes卷中的數據預先填充新的卷,請使用PersistentVolumeClaim中的dataSource欄位。有三個參數:

  • name – 要用作源的PersistentVolumeClaim對象的名稱
  • kind – 必須是PersistentVolumeClaim
  • apiGroup – 必須是""
apiVersion: v1  kind: PersistentVolumeClaim  metadata:    name: pvc-clone    Namespace: demo-namespace  spec:    storageClassName: csi-storageclass    dataSource:      name: src-pvc      kind: PersistentVolumeClaim      apiGroup: ""    accessModes:      - ReadWriteOnce    resources:      requests:        storage: 1Gi # NOTE this capacity must be specified and must be >= the capacity of the source volume

當創建PersistentVolumeClaim對象時,它將觸發一個新的卷的供應,該卷預先填充了來自指定數據源卷的數據。實現卷的克隆是CSI插件的責任。

作為存儲供應商,我如何將對克隆的支援添加到我的CSI驅動程式中?

有關如何在CSI插件中實現克隆的更多資訊,請參考CSI文檔中給Kubernetes開發CSI驅動程式的部分。

https://kubernetes-csi.github.io/docs/developing.html

alpha的局限性是什麼?

克隆Kubernetes的alpha實現有以下限制:

  • 不支援跨不同命名空間克隆卷
  • 不支援跨不同存儲類(後端)克隆卷

未來

根據回饋和採用情況,Kubernetes團隊計劃將CSI克隆實現在1.16版本推進到beta。

關於克隆,用戶經常遇到的一個問題是「跨命名空間克隆怎麼樣?」。如前所述,當前版本要求源和目標位於同一個命名空間中。不過,目前正在努力提出命名空間傳輸API,Kubernetes的未來版本可能提供將卷資源從一個命名空間傳輸到另一個命名空間的能力。這個特性還在討論和設計中,可能在將來的版本中可用,也可能不可用。

我怎樣才能學到更多?

你可以在存儲概念文檔和CSI文檔中找到關於克隆特性的附加文檔。

https://k8s.io/docs/concepts/storage/volume-pvc-datasource.md

https://kubernetes-csi.github.io/docs/volume-cloning.html

我如何參與其中?

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

我們非常感謝Kubernetes存儲SIG和CSI社區的所有貢獻者,他們幫助審查了項目的設計和實施,包括但不限於以下內容:

Saad Ali(saadali)

Tim Hockin(thockin)

Jan Šafránek(jsafrane)

Michelle Au(msau42)

Xing Yang(xing-yang)

如果你有興趣參與CSI或Kubernetes存儲系統的任何部分的設計和開發,請加入Kubernetes存儲特殊興趣小組(SIG)。我們正在快速成長,並且一直歡迎新的貢獻者。

https://github.com/kubernetes/community/tree/master/sig-storage