Skip to content

[feature request] Support patching Pod Template in Advanced DaemonSet based on Node labels #2379

@yingjun8

Description

@yingjun8

What would you like to be added?

希望 Advanced DaemonSet 能支持:根据 Node 的 label 对创建的 Pod 做差异化 patch

类似 Argo Rollouts 的 patches 机制,但按节点维度生效。比如在不同类型的节点上,自动注入不同的 env、label 或资源限制。

Why is this needed?

我们在用 OpenKruise 管理 Nydus(镜像加速组件)的 DaemonSet。集群中有两类节点:

  • 大磁盘节点:有 2TB+ 本地存储,用于关键业务
  • 普通节点:只有 500GiB 存储

Nydus 支持通过 LOCAL_CACHE_SIZEFEATURE_GATE_LARGE_DISK 控制本地缓存大小。我们希望:

  • 一个 DaemonSet 统一管理所有 Nydus 实例
  • 在大磁盘节点上自动启用大缓存配置,普通节点用默认值

目前只能通过 维护多个 DaemonSet 实现,导致:

  • 配置重复、难维护
  • 升级策略要写多份
  • 容易出错

如果没有原生支持,我们只能自己实现 Mutating Webhook,或者硬拆成多个 DaemonSet —— 都不是理想的长期方案。

Proposed Solution

建议在 AdvancedDaemonSetSpec 中增加 patches 字段:

patches:
  - selector:
      matchLabels:
        node-role/nydus-storage: large
    patch:
      spec:
        template:
          metadata:
            labels:
              nydus/cache: "large"
          spec:
            containers:
              - name: nydusd
                env:
                  - name: LOCAL_CACHE_SIZE
                    value: "2Ti"
                  - name: FEATURE_GATE_LARGE_DISK
                    value: "true"

逻辑:

  • 创建 Pod 前,根据其绑定的 Node label 判断是否匹配 selector
  • 如果匹配,应用对应的 patch
  • 否则使用默认模板
  • 这样既能保持单 DaemonSet 的简洁性,又能支持异构节点场景。

其他可行的技术方案

  • 多个 DaemonSet:现在就在用,但配置重复、管理麻烦,升级策略也得维护多份。
  • Mutating Webhook:技术上可行,但需要额外部署服务、管理证书,且存在性能和可用性风险。

一些补充

这个需求在很多场景都比较常见:

  • 监控/日志 agent 在不同机型上配置不同采样率或资源限制
  • CNI 插件在同一个集群的边缘节点或低配节点启用精简模式
  • GPU/加速器节点上的设备插件需要注入特定环境变量或 volume
  • 存储 Daemon(如 LVM、ZFS)根据本地磁盘容量自动调整配置
    如果 Advanced DaemonSet 能原生支持“按 Node label 打补丁”,将极大提升其在真实生产环境中的灵活性和实用性。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions