Kubernetes 在 resource.kubernetes.io 域下定义了一组标准设备属性,
供动态资源分配(DRA)使用。
这些属性具有明确定义的语义,因此 matchAttribute 约束可以作用于来自不同
DRA 驱动的设备,而不需要了解具体驱动的实现细节。
我们鼓励 DRA 驱动在适用时发布这些属性。
Kubernetes 的 DRA 辅助库(k8s.io/dynamic-resource-allocation/deviceattribute)
提供了驱动可调用的若干函数,用于从 sysfs 推导出正确的值。
resource.kubernetes.io/numaNode用于标识设备的 NUMA 拓扑。此属性可以是以下两种形式之一:
numa_node sysfs 条目。
这种形式不需要任何特性门控。DRAListTypeAttributes 特性门控):先是物理 NUMA 节点,
随后是处于最小 ACPI SLIT 距离的同插槽 NUMA 节点。例如,在一个每插槽有
4 个 NUMA 节点的 AMD EPYC 系统上,位于 NUMA 节点 5 上的设备可以发布
[5, 4, 6, 7],表示 NUMA 节点 4、6 和 7 位于同一插槽且相互等距。将此属性与 matchAttribute 一起使用,可以把来自不同驱动的设备共置在同一个
NUMA 节点上。当使用列表类型的值时,调度器执行集合求交:
只要两个设备的 NUMA 节点列表至少共享一个值,二者即匹配。
不具备 NUMA 亲和性的设备(sysfs 中 numa_node = -1)不得发布此属性。
面向 DRA 驱动编写者的辅助函数:
GetNUMANodeAttributeByPCIBusID(pciBusID, attrForm):用于 PCI 设备
(GPU、NIC、NVMe 控制器)。它从 sysfs 读取 numa_node,并且当
attrForm 为 ListAttribute 时,计算出基于 SLIT 的列表。GetNUMANodeAttribute(numaNode, attrForm):用于已经知道自身 NUMA 节点的设备(CPU、内存)。GetNUMANodeForCPU(cpuID):返回某个 CPU 核心所属的 NUMA 节点。resource.kubernetes.io/pciBusIDPCI 设备的 PCI 总线地址,采用扩展 BDF 表示法
(Domain:Bus:Device.Function)。此属性唯一标识节点上的某个 PCI 设备。
resource.kubernetes.io/pcieRootPCI 设备的 PCIe 根复合体,格式为 pci<domain>:<bus>。
共享同一个 PCIe 根复合体的设备连接在同一个 PCIe 交换层级之下。
将此属性与 matchAttribute 一起使用,可以把设备共置在同一个 PCIe 根之下,
从而实现延迟最低的通信。