Linux node-feature-discovery 的 custom rule 与 GPU feature 发现

1次阅读

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

Linux node-feature-discovery 的 custom rule 与 GPU feature 发现

custom rule 不生效,GPU 标签没出现在 node

根本原因通常是 customRules 配置没被 NFD 加载,或者规则里用的 source 不支持 GPU 检测。NFD 默认只启用 cpukernelsystem 等几个 source,gpu source 默认是关闭的,custom rule 里写 source: gpu 却没在 ConfigMap 里打开它,rule 就直接被跳过。

实操建议:

  • 确认 nfd-master 的 ConfigMap(通常是 nfd-worker-conf)里启用了 gpu source:
    source: ["cpu", "kernel", "system", "gpu"]
  • custom rule 的 source 字段必须和已启用的 source 名完全一致,大小写敏感;gpu 不等于 GPU
  • rule 中的 matchOn 条件要匹配真实设备路径,比如 /dev/nvidia0 存在,但 rule 写成 /dev/nvidia1 就不会触发
  • 修改 ConfigMap 后,必须重启 nfd-worker Pod(删掉让它重建),仅重启 master 不生效

想用 custom rule 给不同型号 GPU 打不同 label,但所有节点都打了同一个值

这是因为 NFD 的 gpu source 当前(v0.14+)只提供布尔型特征(feature.node.kubernetes.io/pci-xxx.present),不暴露具体型号或 UUID。custom rule 里用 valueFrom.fieldRefvalueFrom.envVar 是拿不到 GPU 型号字符串的——底层没有这个字段。

实操建议:

  • 别在 custom rule 里试图读取 device.product.name 这类不存在的字段,NFD gpu source 不采集这些
  • 真要区分型号,得自己写脚本查 nvidia-smi -Llspci -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",搜 loadedskipping 关键字
  • 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-conf ConfigMap 中加 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 文件改。

text=ZqhQzanResources