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