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

Kubernetes v1.26:對跨名字空間儲存資料來源的 Alpha 支援

上個月釋出的 Kubernetes v1.26 引入了一個 Alpha 特性,允許你為 PersistentVolumeClaim 指定一個數據源,即使源資料屬於不同的名字空間。啟用新特性後,你可以在新的 PersistentVolumeClaim 的 dataSourceRef 欄位中指定一個名字空間。一旦 Kubernetes 檢查訪問許可權正常,新的 PersistentVolume 就可以從另一個名字空間中指定的儲存源填充其資料。在 Kubernetes v1.26 之前,如果你的叢集啟用了 AnyVolumeDataSource 特性,你已經可以從相同名字空間中的資料來源製備新的卷。然而,這隻適用於相同名字空間中的資料來源,因此使用者無法在一個名字空間中,透過一個數據源在另一個名字空間中製備 PersistentVolume。為了解決這個問題,Kubernetes v1.26 在 PersistentVolumeClaim API 的 dataSourceRef 欄位中增加了一個新的 Alpha namespace 欄位。

工作原理

一旦 csi-provisioner 發現一個數據源是用一個具有非空名字空間的 dataSourceRef 來指定的,它會檢查由 PersistentVolumeClaim 的 .spec.dataSourceRef.namespace 欄位指定的名字空間內的所有引用授權,以檢視是否允許訪問該資料來源。如果有任何 ReferenceGrant 允許訪問,csi-provisioner 就會從該資料來源製備一個卷。

試一試

要使用跨名字空間卷製備,需要滿足以下條件

  • 為 kube-apiserver 和 kube-controller-manager 啟用 AnyVolumeDataSourceCrossNamespaceVolumeDataSource 特性門控
  • 為特定的 VolumeSnapShot 控制器安裝一個 CRD
  • 安裝 CSI Provisioner 控制器並啟用 CrossNamespaceVolumeDataSource 特性門控
  • 安裝 CSI 驅動
  • 為 ReferenceGrants 安裝一個 CRD

整合所有部分

要了解其工作原理,你可以安裝示例並進行嘗試。這個示例將在 dev 名字空間中,從 prod 名字空間的 VolumeSnapshot 建立 PVC。這是一個簡單的例子。對於實際應用,你可能需要使用更復雜的方法。

本示例的假設

  • 你的 Kubernetes 叢集已啟用 AnyVolumeDataSourceCrossNamespaceVolumeDataSource 特性門控
  • 存在兩個名字空間,dev 和 prod
  • 已部署 CSI 驅動
  • prod 名字空間中存在一個名為 new-snapshot-demo 的 VolumeSnapshot
  • 已部署 ReferenceGrant CRD(來自 Gateway API 專案)

授予 CSI Provisioner 對 ReferenceGrants 的讀取許可權

只有當 CSI 驅動具有 CrossNamespaceVolumeDataSource 控制器能力時才需要訪問 ReferenceGrants。對於本例,external-provisioner 需要對 referencegrants(API 組 gateway.networking.k8s.io)的 getlistwatch 許可權。

  - apiGroups: ["gateway.networking.k8s.io"]
    resources: ["referencegrants"]
    verbs: ["get", "list", "watch"]

為 CSI Provisioner 啟用 CrossNamespaceVolumeDataSource 特性門控

在 csi-provisioner 命令列中新增 --feature-gates=CrossNamespaceVolumeDataSource=true。例如,使用此清單片段來重新定義容器

      - args:
        - -v=5
        - --csi-address=/csi/csi.sock
        - --feature-gates=Topology=true
        - --feature-gates=CrossNamespaceVolumeDataSource=true
        image: csi-provisioner:latest
        imagePullPolicy: IfNotPresent
        name: csi-provisioner

建立一個 ReferenceGrant

這是一個 ReferenceGrant 示例的清單。

apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
  name: allow-prod-pvc
  namespace: prod
spec:
  from:
  - group: ""
    kind: PersistentVolumeClaim
    namespace: dev
  to:
  - group: snapshot.storage.k8s.io
    kind: VolumeSnapshot
    name: new-snapshot-demo

使用跨名字空間資料來源建立 PersistentVolumeClaim

Kubernetes 在 dev 上建立一個 PersistentVolumeClaim,CSI 驅動程式從 prod 上的快照填充 dev 上使用的 PersistentVolume。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: example-pvc
  namespace: dev
spec:
  storageClassName: example
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  dataSourceRef:
    apiGroup: snapshot.storage.k8s.io
    kind: VolumeSnapshot
    name: new-snapshot-demo
    namespace: prod
  volumeMode: Filesystem

我如何瞭解更多資訊?

增強提案 從跨名字空間的快照製備卷,包含了關於此特性的歷史和技術實現的許多細節。

請透過加入 Kubernetes 儲存特別興趣小組 (SIG) 來幫助我們增強此特性。已經有很多好的想法,我們非常歡迎更多的參與!

致謝

優秀的軟體離不開一個優秀的團隊。特別感謝以下人員對 CrossNamespaceVolumeDataSouce 特性的深刻審查、周全考慮和寶貴貢獻

  • Michelle Au (msau42)
  • Xing Yang (xing-yang)
  • Masaki Kimura (mkimuram)
  • Tim Hockin (thockin)
  • Ben Swartzlander (bswartz)
  • Rob Scott (robscott)
  • John Griffith (j-griffith)
  • Michael Henriksen (mhenriks)
  • Mustafa Elbehery (Elbehery)

能與你們一起工作,我感到非常愉快。