nfd custom rule 不生效的根本原因是 gpu source 未在 configmap 中启用或规则中 source 名不匹配;需确认 nfd-worker-conf 启用 [“cpu”,”kernel”,”system”,”gpu”],重启 worker pod,并确保 rule 文件挂载正确、name 唯一、matchon 路径真实存在。

custom rule 不生效,GPU 标签没出现在 node 上
根本原因通常是 customRules 配置没被 NFD 加载,或者规则里用的 source 不支持 GPU 检测。NFD 默认只启用 cpu、kernel、system 等几个 source,gpu source 默认是关闭的,custom rule 里写 source: gpu 却没在 ConfigMap 里打开它,rule 就直接被跳过。
实操建议:
- 确认
nfd-master的 ConfigMap(通常是nfd-worker-conf)里启用了gpusource:source: ["cpu", "kernel", "system", "gpu"] - custom rule 的
source字段必须和已启用的 source 名完全一致,大小写敏感;gpu不等于GPU - rule 中的
matchOn条件要匹配真实设备路径,比如/dev/nvidia0存在,但 rule 写成/dev/nvidia1就不会触发 - 修改 ConfigMap 后,必须重启
nfd-workerPod(删掉让它重建),仅重启 master 不生效
想用 custom rule 给不同型号 GPU 打不同 label,但所有节点都打了同一个值
这是因为 NFD 的 gpu source 当前(v0.14+)只提供布尔型特征(feature.node.kubernetes.io/pci-xxx.present),不暴露具体型号或 UUID。custom rule 里用 valueFrom.fieldRef 或 valueFrom.envVar 是拿不到 GPU 型号字符串的——底层没有这个字段。
实操建议:
- 别在 custom rule 里试图读取
device.product.name这类不存在的字段,NFDgpusource 不采集这些 - 真要区分型号,得自己写脚本查
nvidia-smi -L或lspci -nn | grep VGA,然后通过labeler工具或自定义 DaemonSet 注入 label - 如果只是做“有/无 GPU”分级,用内置的
feature.node.kubernetes.io/pci-10de.present(NVIDIA)就够了,不需要 custom rule
custom rule 加了但 node 上看不到 label,describe node 也没报错
NFD 不报错不等于 rule 被执行了。常见静默失败点:rule 的 name 重复、matchOn 条件永远为 false、或 rule 文件没挂进 nfd-worker 容器的 /etc/kubernetes/node-feature-discovery/rules.d/ 目录。
实操建议:
- 进
nfd-worker容器检查:ls /etc/kubernetes/node-feature-discovery/rules.d/,确认你的 YAML 文件确实在里面且后缀是.yml或.yaml - 看 worker 日志:
kubectl logs -n nfd nfd-worker-xxxxx | grep -i "rule|gpu",搜loaded或skipping关键字 - rule 的
name必须全局唯一,重复会导致整个 ruleset 加载失败(但 worker 不 crash,只是静默跳过) -
matchOn里用op: Exists时,路径必须是文件系统上真实存在的路径,比如/proc/driver/nvidia/gpus/0000:01:00.0/information,不是所有 NVIDIA 驱动版本都提供这个路径
GPU feature 标签更新延迟,新插卡后要等好几分钟才出现
NFD 的 gpu source 默认每 60 秒轮询一次设备,且依赖 udev 事件触发即时更新。但很多场景下 udev 事件没发出来(比如热插拔未触发 kernel Event),或 NFD worker 没监听到,就会卡在旧状态。
实操建议:
- 调短轮询间隔:在
nfd-worker-confConfigMap 中加sleepInterval: "10s"(注意引号,YAML 要求) - 确保宿主机开启了 udev 监听:
udevadm monitor --subsystem-match=pci能看到 GPU 插拔事件,否则 NFD 无法即时响应 - 避免用
echo 1 > /sys/bus/pci/rescan强刷——这会触发 kernel 重枚举,但 NFD 不一定立刻感知,反而可能造成短暂不一致
GPU 设备发现本身依赖驱动加载顺序和 udev 规则,custom rule 只是贴标签的最后一步,前面任何一环断了,label 就不会来。别只盯着 rule 文件改。