这篇文章已超过一年。较旧的文章可能包含过时内容。请检查页面信息自发布以来是否已不正确。
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
字段指定的命名空间内的所有引用授权 (reference grants),以查看是否允许访问该数据源。如果任何 ReferenceGrant 允许访问,csi-provisioner 就会从该数据源配置一个卷。
试用
使用跨命名空间卷配置需要以下条件:
- 为 kube-apiserver 和 kube-controller-manager 启用
AnyVolumeDataSource
和CrossNamespaceVolumeDataSource
feature gates - 为特定的
VolumeSnapShot
控制器安装 CRD - 安装 CSI Provisioner 控制器并启用
CrossNamespaceVolumeDataSource
feature gate - 安装 CSI 驱动
- 为 ReferenceGrant 安装 CRD
综合示例
要了解其工作原理,您可以安装示例并试用。此示例用于在 dev 命名空间中创建一个 PVC,数据源是 prod 命名空间中的 VolumeSnapshot。这是一个简单的示例。在实际应用中,您可能需要采用更复杂的方法。
本示例的假设条件
- 您的 Kubernetes 集群已部署并启用了
AnyVolumeDataSource
和CrossNamespaceVolumeDataSource
feature gates - 存在两个命名空间:dev 和 prod
- 正在部署 CSI 驱动
- 在 prod 命名空间中存在一个名为
new-snapshot-demo
的现有 VolumeSnapshot - ReferenceGrant CRD(来自 Gateway API 项目)已部署
授予 CSI Provisioner 读取 ReferenceGrant 的权限
仅当 CSI 驱动具有 CrossNamespaceVolumeDataSource
控制器能力时,才需要访问 ReferenceGrant。对于本示例,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 gate
在 csi-provisioner 命令行中添加 --feature-gates=CrossNamespaceVolumeDataSource=true
。例如,使用此 manifest 代码片段重新定义容器:
- 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 的 manifest:
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
如何了解更多?
增强提案 Provision volumes from cross-namespace snapshots 包含有关此功能的历史和技术实现的许多详细信息。
请加入 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)
与大家一起完成这项工作令人愉快。