前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >K8S 1.26 跨命名空间存储数据源实践详解

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

作者头像
我的小碗汤
发布2023-03-20 09:59:37
7320
发布2023-03-20 09:59:37
举报
文章被收录于专栏:我的小碗汤我的小碗汤

上个月发布的 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 -

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 进击云原生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 怎么运行?
  • 实践一下
  • 结合起来
    • 这个例子假设
      • Grant ReferenceGrants 对 CSI Provisioner 的读取权限
        • 为 CSI Provisioner 启用 CrossNamespaceVolumeDataSource feature gate
          • 创建一个 ReferenceGrant
            • 使用跨命名空间数据源创建 PersistentVolumeClaim
            • 总结
              • 参考资料
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档