本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
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 啟用
AnyVolumeDataSource
和CrossNamespaceVolumeDataSource
特性門控 - 為特定的
VolumeSnapShot
控制器安裝一個 CRD - 安裝 CSI Provisioner 控制器並啟用
CrossNamespaceVolumeDataSource
特性門控 - 安裝 CSI 驅動
- 為 ReferenceGrants 安裝一個 CRD
整合所有部分
要了解其工作原理,你可以安裝示例並進行嘗試。這個示例將在 dev 名字空間中,從 prod 名字空間的 VolumeSnapshot 建立 PVC。這是一個簡單的例子。對於實際應用,你可能需要使用更復雜的方法。
本示例的假設
- 你的 Kubernetes 叢集已啟用
AnyVolumeDataSource
和CrossNamespaceVolumeDataSource
特性門控 - 存在兩個名字空間,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
)的 get、list 和 watch 許可權。
- 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)
能與你們一起工作,我感到非常愉快。