本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
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 啟用
AnyVolumeDataSource
和CrossNamespaceVolumeDataSource
功能閘道 - 為特定的
VolumeSnapShot
控制器安裝 CRD - 安裝 CSI Provisioner 控制器並啟用
CrossNamespaceVolumeDataSource
功能閘道 - 安裝 CSI 驅動程式
- 為 ReferenceGrants 安裝 CRD
整合在一起
若要了解其運作方式,您可以安裝範例並試用看看。此範例會從 prod 命名空間中的 VolumeSnapshot 在 dev 命名空間中建立 PVC。這是一個簡單的範例。對於實際使用,您可能會想要使用更複雜的方法。
此範例的假設
- 您的 Kubernetes 叢集已部署並啟用
AnyVolumeDataSource
和CrossNamespaceVolumeDataSource
功能閘道 - 有兩個命名空間,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
)的 get、list 和 watch 權限。
- 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)
很高興能與各位一起合作完成這項工作。