Node Feature Discovery

NFD

  • Hardware feature detection and advertisement as labels (optionally as extended resources, annotations, taints)
  • Feature domains:
    • CPU
    • Kernel
    • Memory
    • Network
    • PCI
    • Storage
    • System
    • USB
    • Custom (rule-based custom features)
    • Local (features files)

please label nodes

"labels": {
    "beta.kubernetes.io/arch": "amd64",
    "beta.kubernetes.io/os": "linux",
    "feature.node.kubernetes.io/app": "nfd",
    "feature.node.kubernetes.io/cpu-cpuid.ADX": "true",
    "feature.node.kubernetes.io/cpu-cpuid.AESNI": "true",
    "feature.node.kubernetes.io/cpu-cpuid.AMXBF16": "true",
    "feature.node.kubernetes.io/cpu-cpuid.AMXFP8": "true",
    "feature.node.kubernetes.io/cpu-cpuid.AMXINT8": "true",
    "feature.node.kubernetes.io/cpu-cpuid.AMXTILE": "true",
    "feature.node.kubernetes.io/cpu-cpuid.AVX": "true",
    "feature.node.kubernetes.io/kernel-config.NO_HZ": "true",
    "feature.node.kubernetes.io/kernel-config.NO_HZ_FULL": "true",
    "feature.node.kubernetes.io/kernel-version.full": "6.8.0-71-generic",
    "feature.node.kubernetes.io/kernel-version.major": "6",
    "feature.node.kubernetes.io/kernel-version.minor": "8",
    "feature.node.kubernetes.io/kernel-version.revision": "0",
    "feature.node.kubernetes.io/memory-numa": "true",
    "feature.node.kubernetes.io/memory-swap": "true",
    "feature.node.kubernetes.io/memory-swap.behavior": "LimitedSwap",
    "feature.node.kubernetes.io/pci-0300_102b.present": "true",
    "feature.node.kubernetes.io/pci-0b40_8086.present": "true",
    "feature.node.kubernetes.io/pci-0b40_8086.sriov.capable": "true",
    "feature.node.kubernetes.io/storage-nonrotationaldisk": "true",
    "feature.node.kubernetes.io/system-os_release.ID": "ubuntu",
    "feature.node.kubernetes.io/system-os_release.VERSION_ID": "24.04",
    "feature.node.kubernetes.io/system-os_release.VERSION_ID.major": "24",
    "feature.node.kubernetes.io/system-os_release.VERSION_ID.minor": "04",
}

Topology Updater

  • Collects info about allocatable resources per-zone

list of resources that should not be examined by the agent for that specific node

excludeList:
  nodeA: [hugepages-2Mi]
  nodeB: [memory]
  nodeC: [cpu, hugepages-2Mi]

list of resources that should not be examined by the agent for that specific node

excludeList:
  nodeA: [hugepages-2Mi]
  nodeB: [memory]
  nodeC: [cpu, hugepages-2Mi]
excludeList:
  nodeA: [hugepages-2Mi]
  '*': [memory]
  nodeC: [cpu, hugepages-2Mi]
apiVersion: topology.node.k8s.io/v1alpha2
attributes:
- name: topologyManagerPolicy
  value: none
- name: topologyManagerScope
  value: container
- name: nodeTopologyPodsFingerprint
  value: pfp0v001c4cac2338bb70e76
kind: NodeResourceTopology
metadata:
  creationTimestamp: "2025-09-09T09:06:30Z"
  generation: 13
  name: eseldb12u01
  ownerReferences:
  - apiVersion: v1
    kind: Namespace
    name: default
    uid: 88521131-374b-4945-953e-34ed0f08de49
  resourceVersion: "129370"
  uid: f4c2ac8e-c4e6-40cf-9ed5-597817e43210
topologyPolicies:
- None
zones:
- costs:
  - name: node-0
    value: 10
  - name: node-1
    value: 21
  name: node-0
  resources:
  - allocatable: "0"
    available: "0"
    capacity: "64"
    name: cpu
  type: Node
- costs:
  - name: node-0
    value: 21
  - name: node-1
    value: 10
  name: node-1
  resources:
  - allocatable: "0"
    available: "0"
    capacity: "64"
    name: cpu
  type: Node
  • Cleans up node specific NodeFeatures & NodeResourceTopology

Labels

Labels

  • Built in labels (CPU, Kernel, Memory, Network, PCI, USB, Storage, system)

Labels

  • Built in labels (CPU, Kernel, Memory, Network, PCI, USB, Storage, system)
  • User defined labels (vendor and application specific labels)

Labels

  • Built in labels (CPU, Kernel, Memory, Network, PCI, USB, Storage, system)
  • User defined labels (vendor and application specific labels)

  apiVersion: nfd.k8s-sigs.io/v1alpha1
  kind: NodeFeatureRule
  metadata:
    name: example-rule
  spec:
    rules:
      - name: "example rule"
        labels:
          "example-custom-feature": "true"
        # Label is created if all of the rules below match
        matchFeatures:
          # Match if "veth" kernel module is loaded
          - feature: kernel.loadedmodule
            matchExpressions:
              veth: {op: Exists}
          # Match if any PCI device with vendor 8086 exists in the system
          - feature: pci.device
            matchExpressions:
              vendor: {op: In, value: ["8086"]}

  • Built in labels (CPU, Kernel, Memory, Network, PCI, USB, Storage, system)
  • User defined labels (vendor and application specific labels)
  • Extended resources
    • ! note that NFD is not a replacement for the usage of device plugins

  Capacity:
    cpu: 2
    memory: 2049008Ki
    example.com/microwave: 4

  "beta.kubernetes.io/arch": "amd64",
  "beta.kubernetes.io/os": "linux",
  "feature.node.kubernetes.io/app": "nfd",
  "feature.node.kubernetes.io/cpu-cpuid.ADX": "true",
  "feature.node.kubernetes.io/cpu-cpuid.AESNI": "true",
  "feature.node.kubernetes.io/cpu-cpuid.AMXBF16": "true",
  "feature.node.kubernetes.io/cpu-cpuid.AMXFP8": "true",
  "feature.node.kubernetes.io/cpu-cpuid.AMXINT8": "true",
  "feature.node.kubernetes.io/cpu-cpuid.AMXTILE": "true",
  "feature.node.kubernetes.io/example.com/microwave": "4"

$ kubectl describe node <your-node-name>
  • Built in labels (CPU, Kernel, Memory, Network, PCI, USB, Storage, system)
  • User defined labels (vendor and application specific labels)
  • Extended resources
    • ! note that NFD is not a replacement for the usage of device plugins

  Capacity:
    cpu: 2
    memory: 2049008Ki
    example.com/microwave: 4

  "beta.kubernetes.io/arch": "amd64",
  "beta.kubernetes.io/os": "linux",
  "feature.node.kubernetes.io/app": "nfd",
  "feature.node.kubernetes.io/cpu-cpuid.ADX": "true",
  "feature.node.kubernetes.io/cpu-cpuid.AESNI": "true",
  "feature.node.kubernetes.io/cpu-cpuid.AMXBF16": "true",
  "feature.node.kubernetes.io/cpu-cpuid.AMXFP8": "true",
  "feature.node.kubernetes.io/cpu-cpuid.AMXINT8": "true",
  "feature.node.kubernetes.io/cpu-cpuid.AMXTILE": "true",
  "feature.node.kubernetes.io/example.com/microwave": "4"

$ kubectl describe node <your-node-name>

  apiVersion: v1
  kind: Pod
  metadata:
    name: microwave
  spec:
    containers:
    - name: kitchen
      image: nginx
      resources:
        requests:
          example.com/microwave: 3
        limits:
          example.com/microwave: 3

Copy of deck

By fmuyassarov

Copy of deck

  • 30