Skip to main content

Kubernetes集群中,有效识别节点硬件特性并进行自动标记是实现智能资源调度的关键前提。Node Feature Discovery (NFD)和GPU Feature Discovery (GFD)正是专为此目的设计的技术组件,它们的核心功能是自动检测集群中各节点的硬件与系统特性,并将这些信息转化为标准化的节点标签(Node Labels)。通过这些标签,Kubernetes调度器能够精确了解每个节点的能力边界,从而实现基于硬件感知的智能工作负载分配。本文将详细介绍这两种节点标记技术的背景、作用和实现原理,重点阐述它们如何通过自动化的硬件发现和标记机制优化集群资源利用。

1. Node Feature Discovery (NFD)

1.1 基本介绍

alt text

Node Feature Discovery (NFD)是Kubernetes的一个插件,用于自动检测节点的硬件特性和系统配置,并将这些信息以标签(labels)的形式添加到Kubernetes节点对象上。NFDKubernetes SIG (Special Interest Group)下的一个项目,目前已成为云原生计算基金会(CNCF)的沙箱项目。

1.2 背景与作用

在传统的Kubernetes环境中,管理员通常需要手动为节点添加标签以指示其特性,这不仅繁琐且容易出错,还难以跟上硬件变化。随着异构计算的普及,集群中可能包含各种不同硬件配置的节点,如CPU型号、GPU数量、特殊指令集支持等。

NFD的主要作用包括:

  1. 自动发现硬件特性:无需手动干预,自动检测节点的CPU、内存、存储、网络等硬件特性
  2. 简化资源管理:通过标准化的标签系统,简化集群管理和资源规划
  3. 优化工作负载调度:使调度器能够根据应用需求将Pod调度到最合适的节点上
  4. 支持异构集群:有效管理包含不同硬件配置的混合集群
  5. 提高资源利用率:通过精确匹配工作负载和硬件特性,提高整体资源利用效率

1.3 业务场景示例

为了更直观地理解NFD的必要性和实际价值,考虑以下业务场景:

场景:混合计算集群中的机器学习工作负载调度

某金融科技公司拥有一个包含50个节点的Kubernetes集群,这些节点硬件配置各不相同:

  • 20个节点配备了NVIDIA V100 GPU,支持CUDA 11.0
  • 15个节点配备了NVIDIA A100 GPU,支持CUDA 11.2
  • 10个节点配备了Intel Xeon处理器,支持AVX-512指令集
  • 5个节点配备了AMD EPYC处理器,支持AVX2指令集

公司需要运行多种机器学习工作负载,包括:

  1. 深度学习模型训练:需要CUDA 11.2及以上版本,需要大内存GPU
  2. 实时推理服务:需要CUDA支持,但对版本要求不高
  3. 数据预处理:需要AVX-512指令集优化
  4. 统计分析:可在普通CPU节点运行

未使用NFD的情况:

在没有NFD的情况下,运维团队需要:

  1. 手动调查并记录每个节点的硬件配置
  2. 手动为每个节点添加标签,如gpu=v100gpu=a100cpu=xeon-avx512
  3. 当硬件升级或更换时,需要手动更新这些标签
  4. 为每个工作负载编写复杂的nodeSelectornodeAffinity规则

这个过程非常耗时、容易出错,并且难以维护。

使用NFD的情况:

部署NFD后:

  1. NFD自动发现并标记所有节点的硬件特性,生成标准化的标签,如:

    feature.node.kubernetes.io/cpu-model.family: "xeon"
    feature.node.kubernetes.io/cpu-feature.avx512f: "true"
    feature.node.kubernetes.io/pci-10de.present: "true" # NVIDIA GPU存在
  2. 开发团队可以使用这些标准标签来定义工作负载的调度规则,例如:

    # 深度学习训练任务
    nodeSelector:
    feature.node.kubernetes.io/pci-10de.present: "true" # 需要NVIDIA GPU
    nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    nodeSelectorTerms:
    - matchExpressions:
    - key: nvidia.com/gpu.compute.major
    operator: gt
    values: ["7"] # 需要计算能力7.0以上的GPU
  3. 当硬件变更时,NFD自动更新标签,无需手动干预

  4. 运维团队可以通过查询这些标签快速了解集群的硬件组成:

    kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, labels: .metadata.labels}' | grep feature.node.kubernetes.io

效益:

  1. 运维效率提升:节省了手动标记和维护标签的时间
  2. 资源利用率提高:工作负载能够自动调度到最合适的节点上
  3. 减少错误:避免了手动标记可能导致的错误
  4. 灵活性提升:当添加新节点或升级硬件时,无需额外的配置工作

这个场景展示了NFD如何在一个复杂的异构计算环境中自动化硬件发现和标记过程,从而显著提高运维效率和资源利用率。

1.4 实现原理

NFD由四个主要组件组成:

1.4.1 NFD-Master

NFD-Master是负责与Kubernetes API通信的守护进程。它接收来自NFD-Worker的标签请求,并相应地修改节点对象。通常作为Deployment部署在集群中,只需要一个实例。

1.4.2 NFD-Worker

NFD-Worker是负责特性检测的守护进程。它在每个节点上运行,检测节点的硬件和软件特性,然后将这些信息传递给NFD-Master进行实际的节点标记。通常作为DaemonSet部署,确保集群中的每个节点都运行一个实例。

1.4.3 NFD-Topology-Updater

NFD-Topology-Updater是负责检查节点上已分配资源的守护进程,用于按区域(如NUMA节点)记录可分配给新Pod的资源。它创建或更新特定于该节点的NodeResourceTopology自定义资源对象。

1.4.4 NFD-GC

NFD-GC是负责清理过时的NodeFeatureNodeResourceTopology对象的守护进程。在集群中通常只需要运行一个实例。

1.5 特性发现机制

NFD将特性发现分为多个特定领域的特性源:

  • CPU:检测CPU型号、特性(如AVX, AVX2, AVX512)、拓扑等
  • 内存:检测NUMA拓扑、大页面支持等
  • 存储:检测本地存储类型、特性等
  • 网络:检测网络设备、特性等
  • PCI设备:检测PCI设备,如GPU、网卡等
  • USB设备:检测USB设备
  • 系统:检测操作系统、内核版本等
  • 自定义:基于规则的自定义特性
  • 本地:基于文件的特性

这些特性源负责检测一组特性,然后转换为节点特性标签。特性标签以feature.node.kubernetes.io/为前缀,并包含特性源的名称。

1.6 NFD支持的标签

以下是NFD支持的主要标签类别及其详细说明:

1.6.1 CPU标签

标签名称类型描述示例值
cpu-cpuid.<cpuid-flag>booleanCPU支持特定指令集或功能true
cpu-cpuid.<cpuid-attribute>stringCPU属性值GenuineIntel
cpu-hardware_multithreadingboolean硬件多线程(如Intel HTT)已启用true
cpu-coprocessor.nx_gzipboolean支持用于GZIPNest加速器(Power架构)true
cpu-power.sst_bf.enabledbooleanIntel SST-BF(基础频率)已启用true
cpu-pstate.statusstringIntel pstate驱动程序状态active
cpu-pstate.turbobooleanIntel pstate驱动中的turbo频率是否启用true
cpu-pstate.scaling_governorstringIntel pstate缩放调节器performance
cpu-cstate.enabledbooleanintel_idle驱动中的cstate是否已设置true
cpu-security.sgx.enabledbooleanIntel SGXBIOS中已启用true
cpu-security.se.enabledbooleanIBM Secure Execution for Linux可用并已启用true
cpu-security.tdx.enabledbooleanIntel TDX在主机上可用并已启用true
cpu-security.tdx.protectedbooleanIntel TDX用于启动客户节点true
cpu-security.sev.enabledbooleanAMD SEV在主机上可用并已启用true
cpu-security.sev.es.enabledbooleanAMD SEV-ES在主机上可用并已启用true
cpu-security.sev.snp.enabledbooleanAMD SEV-SNP在主机上可用并已启用true
cpu-model.vendor_idstringCPU厂商IDGenuineIntel
cpu-model.familyintegerCPU系列6
cpu-model.idintegerCPU型号编号85

常见的x86 CPUID标志示例:

标志描述
AVX高级向量扩展
AVX2高级向量扩展2
AVX512FAVX-512基础指令集
AMXBF16高级矩阵扩展,BFLOAT16数字的瓦片乘法操作
AMXINT8高级矩阵扩展,8位整数的瓦片乘法操作

1.6.2 内核标签

标签名称类型描述示例值
kernel-config.<option>boolean内核配置选项已启用true
kernel-selinux.enabledbooleanSelinux在节点上已启用true
kernel-version.fullstring完整内核版本5.15.0-76-generic
kernel-version.majorstring内核版本主要组件5
kernel-version.minorstring内核版本次要组件15
kernel-version.revisionstring内核版本修订组件0

1.6.3 内存标签

标签名称类型描述示例值
memory-numaboolean检测到多个内存节点(NUMA架构)true
memory-nv.presentboolean存在NVDIMM设备true
memory-nv.daxboolean存在配置为DAX模式的NVDIMM区域true
memory-swap.enabledboolean节点上已启用交换空间true

1.6.4 网络标签

标签名称类型描述示例值
network-sriov.capableboolean存在支持SR-IOV的网络接口卡true
network-sriov.configuredboolean已配置SR-IOV虚拟功能true

1.6.5 PCI设备标签

标签名称类型描述示例值
pci-<device label>.presentboolean检测到PCI设备true
pci-<device label>.sriov.capableboolean存在支持SR-IOVPCI设备true

1.6.6 USB设备标签

标签名称类型描述示例值
usb-<device label>.presentboolean检测到USB设备true

1.6.7 存储标签

标签名称类型描述示例值
storage-nonrotationaldiskboolean节点中存在非旋转磁盘(如SSD)true

1.6.8 系统标签

标签名称类型描述示例值
system-os_release.IDstring操作系统标识符ubuntu
system-os_release.VERSION_IDstring操作系统版本标识符22.04
system-os_release.VERSION_ID.majorstring操作系统版本ID的第一个组件22
system-os_release.VERSION_ID.minorstring操作系统版本ID的第二个组件04

1.6.9 自定义标签

标签名称类型描述示例值
custom-rdma.capableboolean节点具有支持RDMA的网络适配器true
custom-rdma.enabledboolean节点已加载运行RDMA流量所需的模块true

1.7 标签示例

NFD生成的标签示例:

feature.node.kubernetes.io/cpu-hardware_multithreading: "true"
feature.node.kubernetes.io/cpu-pstate.turbo: "true"
feature.node.kubernetes.io/kernel-version.full: "5.4.0-90-generic"
feature.node.kubernetes.io/memory-numa: "true"
feature.node.kubernetes.io/network-sriov.capable: "true"
feature.node.kubernetes.io/pci-10de.present: "true" # NVIDIA GPU存在
feature.node.kubernetes.io/system-os_release.id: "ubuntu"

在上面的示例中,pci-10de.present: "true" 表示检测到NVIDIA GPU存在。这里的10deNVIDIA公司在PCI设备中的供应商ID(Vendor ID)。

每个PCI设备都有一个由两部分组成的标识符:

  1. 供应商ID(Vendor ID):标识设备制造商
  2. 设备ID(Device ID):标识特定型号的设备

10deNVIDIA公司在PCI-SIG(PCI特别兴趣小组)注册的官方供应商ID,所有NVIDIAGPU设备在PCI总线上都会使用这个供应商ID。当NFD检测到PCI总线上有供应商ID为10de的设备时,就会生成这个标签,表示系统中存在NVIDIAGPU设备。

NFD默认使用 <class>_<vendor> 的格式来标记PCI设备,其中:

  • <class>PCI设备类别
  • <vendor> 是供应商ID

其他常见的PCI供应商ID包括:

  • Intel: 8086
  • AMD: 1022
  • Mellanox/NVIDIA网络: 15b3

更多供应商ID请参考网站:https://admin.pci-ids.ucw.cz/read/PC/

这种基于供应商ID的标签方式使Kubernetes能够精确识别节点上的硬件设备,从而实现更精细的工作负载调度。

1.8 监控指标

NFD提供了丰富的Prometheus监控指标,可用于监控和跟踪其各个组件的运行状态。 这些指标通过标准的Prometheus接口暴露,默认情况下在端口8080上的/metrics路径提供。每个NFD组件都有自己的一组监控指标。

参考链接:https://kubernetes-sigs.github.io/node-feature-discovery/v0.17/deployment/metrics.html

1.8.1 NFD-Master监控指标

NFD-Master组件暴露以下监控指标,所有指标都使用nfd_master前缀:

指标名称类型描述
nfd_master_build_infoGaugeNFD-Master的构建版本信息
nfd_master_node_update_requests_totalCounterMaster处理的节点更新请求总数
nfd_master_node_feature_group_update_requests_totalCounterMaster处理的集群特性更新请求总数
nfd_master_node_updates_totalCounterMaster成功更新的节点总数
nfd_master_node_update_failures_totalCounter节点更新失败的次数
nfd_master_node_labels_rejected_totalCounterNFD-Master拒绝的节点标签数量
nfd_master_node_extendedresources_rejected_totalCounterNFD-Master拒绝的节点扩展资源数量
nfd_master_node_taints_rejected_totalCounterNFD-Master拒绝的节点污点数量
nfd_master_nodefeaturerule_processing_duration_secondsHistogram处理NodeFeatureRule对象所需的时间
nfd_master_nodefeaturerule_processing_errors_totalCounterNodeFeatureRule处理错误的数量

1.8.2 NFD-Worker监控指标

NFD-Worker组件暴露以下监控指标,所有指标都使用nfd_worker前缀:

指标名称类型描述
nfd_worker_build_infoGaugeNFD-Worker的构建版本信息
nfd_worker_feature_discovery_duration_secondsHistogram发现特性所需的时间

1.8.3 NFD-Topology-Updater监控指标

NFD-Topology-Updater组件暴露以下监控指标,所有指标都使用nfd_topology_updater前缀:

指标名称类型描述
nfd_topology_updater_build_infoGaugeNFD-Topology-Updater的构建版本信息
nfd_topology_updater_scan_errors_totalCounter扫描Pod资源分配时的错误数量

1.8.4 NFD-GC监控指标

NFD-GC(垃圾回收)组件暴露以下监控指标,所有指标都使用nfd_gc前缀:

指标名称类型描述
nfd_gc_build_infoGaugeNFD-GC的构建版本信息
nfd_gc_objects_deleted_totalCounter垃圾回收的NodeFeatureNodeResourceTopology对象数量
nfd_gc_object_delete_failures_totalCounter删除NodeFeatureNodeResourceTopology对象时的错误数量

1.8.5 监控指标的使用

这些监控指标可以集成到Prometheus监控系统中,并通过Grafana等工具进行可视化展示。以下是一个简单的Prometheus配置示例:

scrape_configs:
- job_name: 'nfd'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_name]
action: keep
regex: node-feature-discovery
- source_labels: [__address__]
action: replace
regex: ([^:]+)(?::\d+)?
replacement: ${1}:8080
target_label: __address__
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: pod

2. GPU Feature Discovery (GFD)

2.1 基本介绍

GPU Feature Discovery (GFD)是NVIDIA开发的一个Kubernetes插件,专门用于自动发现和标记NVIDIA GPU的特性和能力。它是NFD的一个扩展,专注于提供更详细的GPU相关信息。GFDNVIDIA GPU Operator的一个核心组件,但也可以独立部署和使用。

2.2 背景与作用

随着人工智能和高性能计算工作负载在Kubernetes集群中的大规模部署,对GPU资源的精细化管理需求变得越来越迫切。不同型号和不同代的GPU具有各自的特点:

  • 不同的计算能力(Compute Capability
  • 不同的内存大小和带宽
  • 不同的架构特性(如Tensor CoreRT Core等)
  • 不同的驱动和CUDA支持
  • 不同的MIGMulti-Instance GPU)配置能力

这些差异对于工作负载的性能和兼容性有显著影响。例如,某些深度学习模型可能需要特定的CUDA计算能力才能高效运行,或者需要足够的GPU内存来容纳大型模型。

GFD的主要作用包括:

  1. 自动发现GPU特性:自动检测节点上的NVIDIA GPU特性,无需手动配置
  2. 提供详细的GPU元数据:提供比NFD更详细的GPU信息,包括型号、架构、内存大小、计算能力等
  3. 支持精确的GPU调度:使调度器能够根据应用的特定需求选择最合适的GPU
  4. 优化资源利用率:通过精确匹配工作负载和GPU特性,提高集群资源利用率
  5. 支持MIG技术:对NVIDIA Multi-Instance GPU (MIG)技术提供特殊支持,实现GPU资源的细粒度划分
  6. 与NFD无缝集成:与NFD完美配合,扩展其GPU特性发现能力

2.3 实现原理

2.3.1 架构概述

GFD作为NFD的插件运行,通过NFD的本地特性文件机制与NFD集成。它的架构设计专注于GPU特性的发现和标记。 GFD通常作为DaemonSet部署在集群中,只在具有NVIDIA GPU的节点上运行。它可以作为NVIDIA GPU Operator的一个组件部署,也可以独立部署。

2.3.2 工作流程

GFD的工作流程如下:

  1. 初始化GFD容器启动并初始化NVMLNVIDIA Management Library
  2. 检测GPU设备:使用NVML检测节点上的所有NVIDIA GPU设备
  3. 收集GPU信息:对每个检测到的GPU,收集详细信息:
    • 产品名称和型号
    • 架构和计算能力
    • 内存大小和带宽
    • 驱动版本和CUDA版本
    • MIG配置和能力(如果支持)
  4. 生成标签:将收集到的信息转换为Kubernetes标签格式,使用nvidia.com/前缀
  5. 写入特性文件:将标签写入NFD指定的本地特性文件目录(通常为/etc/kubernetes/node-feature-discovery/features.d/
  6. 与NFD集成NFD-Worker读取这些特性文件,并将信息发送给NFD-Master
  7. 标记节点NFD-Master将这些标签应用到节点对象上
  8. 周期性更新GFD会定期重新检测GPU信息,以响应可能的硬件变化(如MIG配置更改)

2.3.3 与NFD的集成

GFDNFD的集成是通过NFD的本地特性文件机制实现的:

  1. GFD将发现的GPU特性写入一个JSON格式的特性文件
  2. 该文件位于NFD指定的特性文件目录中
  3. NFD-Worker会自动扫描该目录并读取特性文件
  4. 特性信息被发送到NFD-Master并应用到节点上

这种集成方式使GFD能够专注于GPU特性的发现,而将标签管理的职责留给NFD,形成了清晰的职责分离。

2.4 GFD支持的标签

2.4.1 标签命名规则

GFD生成的所有标签都使用nvidia.com/前缀,这与NFD使用的feature.node.kubernetes.io/前缀不同。这种命名方式可以清晰地区分不同来源的标签,并确保标签的唯一性。

标签类型说明示例值
nvidia.com/gpu.countinteger节点上的GPU数量8
nvidia.com/gpu.presentboolean节点上是否存在NVIDIA GPUtrue
nvidia.com/gpu.productstringGPU型号的完整名称NVIDIA-A100-SXM4-40GB
nvidia.com/gpu.memoryintegerGPU内存大小(MiB,单卡)40960
nvidia.com/gpu.familystringGPU架构系列ampere
nvidia.com/gpu.compute.majorintegerGPU计算能力主版本8
nvidia.com/gpu.compute.minorintegerGPU计算能力次版本0
nvidia.com/gpu.machinestring节点机器型号NVIDIA-DGX-A100
nvidia.com/gpu.modestringGPU工作模式(computedisplaycompute
nvidia.com/gpu.replicasintegerGPU副本数量(用于时间切片时会大于1)1
nvidia.com/gpu.cliquestringGPUFabric集群UUID和群组ID7b968a6d-c8aa-45e1-9e07-e1e51be99c31.1

CUDA相关标签

标签类型说明示例值
nvidia.com/cuda.driver-version.majorintegerCUDA驱动主版本550
nvidia.com/cuda.driver-version.minorintegerCUDA驱动次版本107
nvidia.com/cuda.driver-version.revisionintegerCUDA驱动修订版本02
nvidia.com/cuda.driver-version.fullstringCUDA驱动完整版本550.107.02
nvidia.com/cuda.runtime-version.majorintegerCUDA运行时主版本12
nvidia.com/cuda.runtime-version.minorintegerCUDA运行时次版本5
nvidia.com/cuda.runtime-version.fullstringCUDA运行时完整版本12.5

废弃的CUDA标签(向后兼容):

标签类型说明示例值
nvidia.com/cuda.driver.majorinteger(已废弃)CUDA驱动主版本550
nvidia.com/cuda.driver.minorinteger(已废弃)CUDA驱动次版本107
nvidia.com/cuda.driver.revinteger(已废弃)CUDA驱动修订版本02
nvidia.com/cuda.runtime.majorinteger(已废弃)CUDA运行时主版本12
nvidia.com/cuda.runtime.minorinteger(已废弃)CUDA运行时次版本5

特性支持标签

标签类型说明示例值
nvidia.com/mig.capableboolean是否支持MIG(多实例 GPU)功能true
nvidia.com/mps.capableboolean是否支持MPS(多进程服务)功能true
nvidia.com/vgpu.presentboolean是否支持vGPU功能false
nvidia.com/gpu.sharing-strategystringGPU共享策略类型none
nvidia.com/gfd.timestampintegerGPU特征发现的时间戳1736224460

MIG相关标签(当启用MIG功能时):

标签类型说明示例值
nvidia.com/mig.strategystring使用的MIG策略(singlemixedsingle
nvidia.com/gpu.multiprocessorsintegerMIG设备的流处理器数量14
nvidia.com/gpu.slices.giintegerGPU实例切片数量1
nvidia.com/gpu.slices.ciinteger计算实例切片数量1
nvidia.com/gpu.engines.copyintegerMIG设备的DMA引擎数量1
nvidia.com/gpu.engines.decoderintegerMIG设备的解码器数量1
nvidia.com/gpu.engines.encoderintegerMIG设备的编码器数量1
nvidia.com/gpu.engines.jpegintegerMIG设备的JPEG引擎数量0
nvidia.com/gpu.engines.ofaintegerMIG设备的OFA引擎数量0

2.4.5 标签的使用场景

这些标签可以在多种场景中使用:

  1. 精确调度:根据工作负载的特定需求选择合适的GPU

    nodeSelector:
    nvidia.com/gpu.family: "ampere"
    nvidia.com/gpu.memory: "40960"
  2. 资源限制:限制工作负载只能运行在特定类型的GPU

    nodeSelector:
    nvidia.com/gpu.compute.major: "8"
  3. MIG配置选择:选择具有特定 MIG 配置的节点

    nodeSelector:
    nvidia.com/mig.capable: "1"
    nvidia.com/gpu.slices.gi.3: "2"
  4. 多媒体处理:选择具有特定多媒体处理能力的GPU

    nodeSelector:
    nvidia.com/gpu.engines.decoder: "2"

2.5 标签示例

2.5.1 不同型号GPU的标签示例

以下展示了不同型号GPUGFD标签示例,这些标签反映了各自的硬件特性和能力。

Tesla V100 GPU标签示例
nvidia.com/gpu.count: "2"
nvidia.com/gpu.product: "Tesla-V100-SXM2-16GB"
nvidia.com/gpu.memory: "16384"
nvidia.com/gpu.family: "volta"
nvidia.com/gpu.compute.major: "7"
nvidia.com/gpu.compute.minor: "0"
nvidia.com/gpu.driver.version: "460.32.03"
nvidia.com/gpu.cuda.version: "11.2"
nvidia.com/gpu.arch: "Volta"
nvidia.com/gpu.machine: "DGX-1"
A100 GPU标签示例(启用MIG)
nvidia.com/gpu.count: "1"
nvidia.com/gpu.product: "NVIDIA-A100-SXM4-40GB"
nvidia.com/gpu.memory: "40960"
nvidia.com/gpu.family: "ampere"
nvidia.com/gpu.compute.major: "8"
nvidia.com/gpu.compute.minor: "0"
nvidia.com/gpu.driver.version: "535.104.05"
nvidia.com/gpu.cuda.version: "12.2"
nvidia.com/gpu.arch: "Ampere"
nvidia.com/gpu.machine: "HGX"
nvidia.com/mig.capable: "1"
nvidia.com/mig.strategy: "single"
nvidia.com/gpu.slices.gi: "7"
nvidia.com/gpu.slices.ci: "7"
nvidia.com/gpu.multiprocessors: "108"
nvidia.com/gpu.slices.gi.1: "7"
nvidia.com/gpu.slices.gi.2: "3"
nvidia.com/gpu.slices.gi.3: "2"
nvidia.com/gpu.slices.gi.7: "1"
nvidia.com/gpu.engines.copy: "4"
nvidia.com/gpu.engines.decoder: "5"
nvidia.com/gpu.engines.encoder: "1"
H100 GPU标签示例
nvidia.com/gpu.count: "8"
nvidia.com/gpu.product: "NVIDIA-H100-SXM5-80GB"
nvidia.com/gpu.memory: "81920"
nvidia.com/gpu.family: "hopper"
nvidia.com/gpu.compute.major: "9"
nvidia.com/gpu.compute.minor: "0"
nvidia.com/gpu.driver.version: "535.129.03"
nvidia.com/gpu.cuda.version: "12.2"
nvidia.com/gpu.arch: "Hopper"
nvidia.com/gpu.machine: "HGX-H100"
nvidia.com/mig.capable: "1"
nvidia.com/gpu.multiprocessors: "132"
nvidia.com/gpu.engines.copy: "8"
nvidia.com/gpu.engines.decoder: "8"
nvidia.com/gpu.engines.encoder: "3"
nvidia.com/gpu.engines.jpeg: "2"
nvidia.com/gpu.engines.ofa: "1"

2.5.2 如何查看节点标签

可以使用以下命令查看节点上的GFD生成的标签:

# 查看所有节点的GPU相关标签
kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, labels: .metadata.labels | with_entries(select(.key | startswith("nvidia.com")))}'

# 查看特定节点的GPU相关标签
kubectl get node <node-name> -o json | jq '.metadata.labels | with_entries(select(.key | startswith("nvidia.com")))'

2.5.3 标签的实际应用

使用这些标签可以实现精确的工作负载调度,例如:

# 深度学习训练任务,需要A100或H100 GPU
apiVersion: v1
kind: Pod
metadata:
name: dl-training
spec:
containers:
- name: training
image: tensorflow/tensorflow:latest-gpu
resources:
limits:
nvidia.com/gpu: 1
nodeSelector:
nvidia.com/gpu.family: "ampere"
nvidia.com/gpu.memory: "81920"
# 视频编码任务,需要多个编码器引擎
apiVersion: v1
kind: Pod
metadata:
name: video-encoder
spec:
containers:
- name: encoder
image: nvidia/cuda:12.2.0-runtime-ubuntu22.04
resources:
limits:
nvidia.com/gpu: 1
nodeSelector:
nvidia.com/gpu.engines.encoder: "3"

3. NFD与GFD的协同工作

NFDGFD协同工作,为Kubernetes提供全面的节点特性信息,特别是在GPU资源管理方面:

  1. 分层特性发现:NFD提供基础的节点特性发现,包括检测GPU的存在;GFD在此基础上提供更详细的GPU特性信息
  2. 标签命名空间分离NFD使用feature.node.kubernetes.io/前缀,而GFD使用nvidia.com/前缀,避免冲突
  3. 部署协同:两者通常一起部署,特别是在NVIDIA GPU Operator中,它会自动部署和配置这两个组件
  4. 调度协同:调度器可以同时使用NFDGFD提供的标签来做出更精确的调度决策

4. 参考资料

4.1 NFD相关资料

4.2 NVIDIA相关资料

4.3 Kubernetes官方资料