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

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 指定時,它會檢查 .spec.dataSourceRef.namespace 欄位指定的命名空間內的所有參考授權,以查看是否允許存取資料來源。如果任何 ReferenceGrant 允許存取,csi-provisioner 就會從資料來源佈建磁碟區。

試用看看

使用跨命名空間磁碟區佈建需要以下項目

  • 為 kube-apiserver 和 kube-controller-manager 啟用 AnyVolumeDataSourceCrossNamespaceVolumeDataSource 功能閘道
  • 為特定的 VolumeSnapShot 控制器安裝 CRD
  • 安裝 CSI Provisioner 控制器並啟用 CrossNamespaceVolumeDataSource 功能閘道
  • 安裝 CSI 驅動程式
  • 為 ReferenceGrants 安裝 CRD

整合在一起

若要了解其運作方式,您可以安裝範例並試用看看。此範例會從 prod 命名空間中的 VolumeSnapshot 在 dev 命名空間中建立 PVC。這是一個簡單的範例。對於實際使用,您可能會想要使用更複雜的方法。

此範例的假設

  • 您的 Kubernetes 叢集已部署並啟用 AnyVolumeDataSourceCrossNamespaceVolumeDataSource 功能閘道
  • 有兩個命名空間,dev 和 prod
  • 正在部署 CSI 驅動程式
  • prod 命名空間中有名為 new-snapshot-demo 的現有 VolumeSnapshot
  • ReferenceGrant CRD(來自 Gateway API 專案)已部署

授與 ReferenceGrants 讀取 CSI Provisioner 的權限

只有當 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 功能閘道

--feature-gates=CrossNamespaceVolumeDataSource=true 新增至 csi-provisioner 命令列。例如,使用此資訊清單程式碼片段重新定義容器

      - 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)

很高興能與各位一起合作完成這項工作。