View a markdown version of this page

在 Amazon EKS 上管理硬件设备 - Amazon EKS

帮助改进此页面

要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。

在 Amazon EKS 上管理硬件设备

Amazon EKS 支持两种 Kubernetes 机制来管理 EKS 集群中的专用硬件设备:动态资源分配 (DRA) 和设备插件。这两种机制都使工作负载能够访问硬件加速器(如 NVIDIA GPU 和 AWS Trainium 芯片)以及高性能网络设备(如 Elastic Fabric Adapter(EFA))。对于使用 Kubernetes 1.34 及更高版本的新部署,如果使用 EKS 托管节点组或自行管理的节点,建议使用 DRA 驱动程序,因为 DRA 提供了更丰富的设备选择、拓扑感知安排和设备共享功能,而这些是设备插件无法实现的。

有关这两个 Kubernetes 功能的通用信息,请参阅 Kubernetes 文档中的动态资源分配设备插件

动态资源分配与设备插件

Kubernetes 设备插件一直是向 Kubernetes 工作负载公开专用硬件的主要机制。设备插件将设备作为扩展资源(例如 nvidia.com/gpuaws.amazon.com/neuroncore)进行发布,您可以在容器的资源请求和限制中请求这些资源。尽管设备插件得到广泛支持和使用,但仍存在以下限制:

  • 设备以不透明整数计数的形式请求,无法基于属性进行筛选。

  • 不支持容器之间或容器组(pod)之间的设备共享。

  • 无法跨设备类型进行表达性的拓扑感知分配。

  • 通常需要自定义调度器扩展才能实现智能放置。

动态资源分配(DRA)是 Kubernetes 的一项功能,在 Kubernetes 1.34 版本中正式发布,它解决了上述限制。借助 DRA,设备驱动程序通过 ResourceSlice 对象向 Kubernetes 调度器发布丰富的设备属性。您使用引用 DeviceClass 类别的 ResourceClaimResourceClaimTemplate 对象请求设备。

DRA 支持:

  • 使用通用表达式语言(CEL)表达式进行基于属性的设备选择。

  • 拓扑感知分配,确保设备位于同一 PCIe 交换机或 NUMA 域内。

  • 通过共享 ResourceClaim 引用在多个容器或容器组(pod)之间共享设备。

  • 基于约束的调度,可协调不同类型的设备。

适用于 Amazon EKS 的 DRA 驱动程序

以下 DRA 驱动程序通常用于在 Amazon EKS 集群中管理专用硬件设备。

EFA DRA 驱动程序

EFA DRA 驱动程序(DRANET)通过拓扑感知安排来管理 Elastic Fabric Adapter(EFA)设备分配,将 EFA 接口与其拓扑邻近的 GPU 或 Neuron 设备配对,并支持在容器组(pod)之间进行设备共享。有关更多信息,请参阅 管理 Amazon EKS 上的 EFA 设备

Neuron DRA 驱动程序

Neuron DRA 驱动程序管理 AWS Trainium 和 AWS Inferentia2 设备的分配,支持拓扑感知安排、连接设备子集分配以及逻辑 NeuronCore(LNC)配置,无需自定义调度器扩展。

NVIDIA DRA 驱动程序

GPU NVIDIA DRA 驱动程序支持 NVIDIA GPU 的灵活分配和动态重配置,包括在 EC2 Grace-Blackwell 实例上为多节点 NVLink(MNNVL)工作负载提供 ComputeDomain 资源支持。有关在 EC2 Grace-Blackwell 实例上使用 ComputeDomains 的更多信息,请参阅 将 P6e-GB200 UltraServer 与 Amazon EKS 搭配使用

Amazon EKS 设备插件

以下设备插件通常用于管理 Amazon EKS 集群中的专用硬件设备。

EFA 设备插件

EFA 设备插件可发现每个节点上所有可用的 EFA 设备,并将 EFA 设备作为 vpc.amazonaws.com/efa 扩展资源发布。

Neuron 设备插件

Neuron 设备插件将 Neuron 硬件作为 aws.amazon.com/neuroncoreaws.amazon.com/neuron 扩展资源发布。该插件可发现每个节点上可用的 Neuron 设备,将其发布为可分配资源,并管理其生命周期。

NVIDIA 设备插件

NVIDIA 设备插件将 NVIDIA GPU 作为 nvidia.com/gpu 扩展资源发布,并跟踪 GPU 的运行状况。

注意事项

在 Amazon EKS 上使用 DRA 驱动程序之前,请先了解以下注意事项:

  • DRA 在 Kubernetes 1.33 及以上版本的 Amazon EKS 上可用,但由于上游的 Kubernetes 问题,建议在 Kubernetes 1.34 及更高版本上使用。您的集群控制面板和节点必须运行支持 DRA 的 Kubernetes 版本。

  • DRA 目前与 Karpenter 或 EKS Auto Mode 配置的计算不兼容。您必须将 DRA 驱动程序与 EKS 托管节点组或自管理节点配合使用。

  • 同一设备类型的 DRA 驱动程序和设备插件不得在同一节点上同时运行。在安装对应的 DRA 驱动程序之前,请卸载设备插件,或将它们部署在不同的节点上。有关 DRA 驱动程序和设备插件兼容性的更新,请参阅上游 Kubernetes KEP-5004

  • DRA 使用的 Kubernetes API 资源(ResourceClaimResourceClaimTemplateDeviceClass)与设备插件使用的资源(resource.limitsresource.requests)不同。从设备插件迁移到 DRA 需要更新您的工作负载规格。

  • 设备插件在所有 Kubernetes 版本中仍将获得全面支持。如果集群运行的 Kubernetes 版本低于 1.34,或者您使用了 Karpenter 或 EKS 自动模式,请继续使用设备插件。Bottlerocket 不支持 NVIDIA DRA 驱动程序;请在 Bottlerocket 节点上使用 NVIDIA 设备插件。Bottlerocket 支持 EFA 和 Neuron DRA 驱动程序。

DRA ResourceClaim 与 ResourceClaimTemplate

使用 DRA 时,您可以通过 ResourceClaimResourceClaimTemplate 对象请求设备。这两种资源类型的用途不同,生命周期行为也不同。

ResourceClaim

ResourceClaim 是一个 Kubernetes 命名对象,您可以在任何容器组(pod)之外独立创建它。您可以在容器组(pod)规格中通过 resourceClaimName 字段按名称引用它。ResourceClaim 具有以下特性:

  • 在创建任何引用它的容器组(pod)之前,它必须存在于集群中。如果 Claim 不存在,容器组(pod)将保持待处理状态。

  • 无论是否有任何容器组(pod)引用它,ResourceClaim 都会一直存在,直到您明确删除它。

  • 多个容器组(pod)可以引用同一个 ResourceClaim,从而实现设备共享。所有引用同一 Claim 的容器组(pod)会共享对同一组已分配设备的访问权限,并被调度到同一个节点。

    如果需要多个容器组(pod)来共享对同一组设备的访问权限,或需要 Claim 在单个容器组(pod)的生命周期之外存在时,可以使用 ResourceClaim

ResourceClaimTemplate

ResourceClaimTemplate 定义了一个模板,Kubernetes 会使用该模板为每个容器组(pod)自动生成一个唯一的 ResourceClaim。您可以在容器组(pod)规格中通过 resourceClaimTemplateName 字段引用它。ResourceClaimTemplate 本身不绑定到任何容器组(pod),它是一个独立存在的可重用模板。ResourceClaimTemplate 具有以下特性:

  • Kubernetes 会为每个引用该模板的容器组(pod)创建一个新的 ResourceClaim。每个容器组(pod)都有自己的一组独立设备。

  • 每个生成的 ResourceClaim 都会绑定到触发其创建的容器组(pod)的生命周期。删除容器组(pod)时,与之关联的生成的 ResourceClaim 也会被删除。ResourceClaimTemplate 本身不受影响,并且会继续为将来的容器组(pod)生成新的 Claim。

    当工作负载中的每个容器组(pod)都需要具有相似配置的专用设备时,请使用 ResourceClaimTemplate。例如,如果 Job 中的容器组(pod)使用并行执行功能,且每个都需要自己的 GPU 或 EFA 设备,则可使用 ResourceClaimTemplate

下表总结了 ResourceClaimResourceClaimTemplate 之间的差异。

行为 ResourceClaim ResourceClaimTemplate

创建

在容器组(pod)引用之前手动创建

Kubernetes 会为每个容器组(pod)自动生成 Claim

生命周期

一直存在,直至您将其删除

模板一直存在,直至您将其删除。每个生成的 ResourceClaim 都会绑定到触发其创建的容器组(pod)。

容器组(pod)间设备共享

支持。多个容器组(pod)可以引用同一 Claim。

不支持。每个容器组(pod)会获得独立的 Claim。

容器组(pod)规格字段

resourceClaimName

resourceClaimTemplateName

有关使用 ResourceClaim 对象在容器组(pod)之间共享 EFA 设备的示例,请参阅在多个容器组(pod)之间共享 EFA 设备。有关将 ResourceClaimTemplate 对象与拓扑感知分配结合使用的示例,请参阅拓扑感知的 EFA 和 GPU/Neuron 设备分配

主题