本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

為 Kubernetes 引入卷克隆 Alpha

Kubernetes v1.15 引入了儲存卷克隆的 Alpha 支援。此功能允許您使用 Kubernetes API 在使用者的名稱空間中,利用現有儲存卷的內容建立新的儲存卷。

什麼是克隆?

許多儲存系統都提供建立儲存卷“克隆”的功能。克隆是現有儲存卷的副本,它在系統上是自己獨立的儲存卷,但源捲上的資料被複制到目標卷(克隆)。克隆類似於快照,因為它是一個時間點上的儲存卷副本,但是,它不是從儲存卷建立新的快照物件,而是建立了一個新的獨立儲存卷,有時被認為是預填充新建立的儲存卷。

為什麼要在 Kubernetes 中新增克隆功能

Kubernetes 卷外掛系統已經提供了強大的抽象,可以自動化塊儲存和檔案儲存的供應、附加和掛載。

支撐所有這些功能的是 Kubernetes 工作負載可移植性的目標:Kubernetes 旨在在分散式系統應用程式和底層叢集之間建立一層抽象,以便應用程式可以不關心它們執行的叢集的具體細節,並且應用程式部署不需要特定的儲存裝置知識。

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

透過提供一種在 Kubernetes API 中觸發克隆操作的標準方式,Kubernetes 使用者現在可以處理此類用例,而無需繞過 Kubernetes API(並手動執行特定於儲存系統的操作)。雖然克隆在行為上類似於建立儲存卷快照,然後從快照建立儲存卷,但克隆操作對於許多後端裝置來說更簡化,也更高效。

Kubernetes 使用者現在能夠以與叢集無關的方式將克隆操作整合到他們的工具和策略中,並且可以放心地知道,無論底層儲存如何,它都將適用於任意 Kubernetes 叢集。

Kubernetes API 和克隆

Kubernetes 中的克隆功能透過 PersistentVolumeClaim.DataSource 欄位啟用。在 v1.15 之前,允許用作 dataSource 的唯一有效物件型別是 VolumeSnapshot。克隆功能擴充套件了允許的 PersistentVolumeclaim.DataSource.Kind 欄位,不僅允許 VolumeSnapshot,還允許 PersistentVolumeClaim。現有行為保持不變。

沒有引入新物件來啟用克隆。相反,PersistentVolumeClaim 物件中現有的 dataSource 欄位被擴充套件,以能夠接受同一名稱空間中現有 PersistentVolumeClaim 的名稱。重要的是要注意,從使用者的角度來看,克隆只是另一個 PersistentVolumePersistentVolumeClaim,唯一的區別是 PersistentVolume 在建立時被另一個 PersistentVolume 的內容填充。建立後,它的行為與任何其他 Kubernetes PersistentVolume 完全相同,並遵循相同的行為和規則。

哪些儲存卷外掛支援 Kubernetes 克隆?

Kubernetes 支援三種類型的儲存卷外掛:in-tree、Flex 和 容器儲存介面 (CSI)。有關詳細資訊,請參閱 Kubernetes 儲存卷外掛常見問題解答

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

Kubernetes 克隆要求

在使用 Kubernetes 儲存卷克隆之前,您必須

  • 確保在您的 Kubernetes 叢集上部署並運行了實現克隆的 CSI 驅動程式。
  • 透過新的 Kubernetes 功能門啟用 Kubernetes 儲存卷克隆功能(Alpha 版本預設停用)
    • 在 API 伺服器二進位制檔案上設定以下標誌:--feature-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 物件時,它將觸發新儲存卷的調配,該儲存卷將使用指定 dataSource 儲存卷中的資料進行預填充。實現儲存卷克隆是 CSI 外掛的唯一職責。

作為儲存供應商,我如何為我的 CSI 驅動程式新增克隆支援?

有關如何在 CSI 外掛中實現克隆的更多資訊,請參閱 CSI 文件的為 Kubernetes 開發 CSI 驅動程式部分。

Alpha 版本的侷限性是什麼?

Kubernetes 克隆的 Alpha 實現具有以下侷限性:

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

未來展望

根據反饋和採用情況,Kubernetes 團隊計劃在 1.16 版本中將 CSI 克隆實現推向 Beta。

使用者關於克隆的一個常見問題是“跨名稱空間克隆怎麼辦”。正如我們所提到的,當前版本要求源和目標在同一名稱空間中。然而,目前正在努力提出一個名稱空間傳輸 API,未來版本的 Kubernetes 可能會提供將儲存卷資源從一個名稱空間傳輸到另一個名稱空間的能力。此功能仍在討論和設計中,未來版本中可能可用,也可能不可用。

我如何瞭解更多資訊?

您可以在儲存概念文件CSI 文件中找到有關克隆功能的更多文件。

我如何參與?

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

我們衷心感謝 Kubernetes Storage SIG 和 CSI 社群中所有幫助審查專案設計和實施的貢獻者,包括但不限於以下人員:

如果您有興趣參與 CSI 或 Kubernetes 儲存系統的任何部分的設計和開發,請加入 Kubernetes 儲存特別興趣小組 (SIG)。我們正在迅速發展,並始終歡迎新的貢獻者。