这篇文章已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不正确。

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 指定了数据源,并且该 dataSourceRef 具有非空的命名空间名称,它就会检查 PersistentVolumeClaim 的 .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)

很高兴与大家一起完成这项工作。