本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
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)
能与你们一起工作,我感到非常愉快。