K8S 1.26 跨命名空间存储数据源实践详解

2023-03-20 09:59:37 浏览数 (1)

上个月发布的 Kubernetes v1.26 引入了一项 alpha 功能,允许您为 PersistentVolumeClaim 指定数据源,即使源数据属于不同的命名空间。启用新功能后,您可以在新 PersistentVolumeClaim 的 dataSourceRef字段中指定 namespace。一旦 Kubernetes 检查访问是正常的,新的 PersistentVolume 就可以从其他命名空间中指定的存储源填充其数据。

在 Kubernetes v1.26 之前,如果您的集群启用了该AnyVolumeDataSource功能,您已经可以从同一集群中的相同命名空间数据源配置新卷。但是,这仅适用于同一命名空间中的数据源,因此用户无法使用其他命名空间中的数据源声明来供给 PersistentVolume。为了解决这个问题,Kubernetes v1.26 在 PersistentVolumeClaim API 的dataSourceRef字段中添加了一个新的 alpha namespace字段。

怎么运行?

一旦 csi-provisioner 发现指定的数据源dataSourceRef具有非空 namespace 名称,它会检查 PersistentVolumeClaim 字段.spec.dataSourceRef.namespace 指定的命名空间内的所有引用授权,以查看访问数据源是否被允许。如果有任何 ReferenceGrant 允许访问,则 csi-provisioner 会从数据源中提供一个卷。

实践一下

使用跨命名空间卷配置需要以下内容:

  • 为 kube-apiserver 和 kube-controller-manager 启用AnyVolumeDataSourceCrossNamespaceVolumeDataSource 功能门[1]
  • 为特定VolumeSnapShot控制器安装 CRD
  • 安装 CSI Provisioner 控制器并启用CrossNamespaceVolumeDataSourcefeature gate
  • 安装 CSI 驱动程序
  • 为 ReferenceGrants 安装 CRD

结合起来

要查看其工作原理,您可以安装示例并进行试用。此示例通过 prod 命名空间中的 VolumeSnapshot 在 dev 命名空间中创建 PVC。这是一个简单的例子。对于实际使用过程中,您可能想要使用更复杂的方法。

这个例子假设

  • 您的 Kubernetes 集群已部署,且AnyVolumeDataSourceCrossNamespaceVolumeDataSource功能门控已启用
  • 有两个命名空间,dev 和 prod
  • CSI 驱动程序已部署
  • prod命名空间中存在一个名为new-snapshot-demo的现有 VolumeSnapshot
  • ReferenceGrant CRD(来自 Gateway API 项目)已经部署

Grant ReferenceGrants 对 CSI Provisioner 的读取权限

仅当 CSI 驱动程序具有CrossNamespaceVolumeDataSource控制器功能时才需要访问 ReferenceGrants 。对于此示例,外部供应商需要 referencegrants (gateway.networking.k8s.ioAPI 组)的getlistwatch 权限。

代码语言:javascript复制
  - apiGroups: ["gateway.networking.k8s.io"]
    resources: ["referencegrants"]
    verbs: ["get", "list", "watch"]

为 CSI Provisioner 启用 CrossNamespaceVolumeDataSource feature gate

添加--feature-gates=CrossNamespaceVolumeDataSource=true到 csi-provisioner 命令行。例如,使用此清单片段重新定义容器:

代码语言:javascript复制
      - 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 示例的清单。

代码语言:javascript复制
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 上创建一个 PersisentVolumeClaim,而 CSI 驱动程序从 prod 上的快照填充在 dev 上使用的 PersisentVolume。

代码语言:javascript复制
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[2]包括有关此功能的历史和技术实现的大量详细信息。

参考资料

[1]

功能门: https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/

[2]

Provision volumes from cross-namespace snapshots: https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3294-provision-volumes-from-cross-namespace-snapshots

- END -

0 人点赞