

 **帮助改进此页面** 

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

# 在 Amazon EKS 上管理硬件设备
<a name="device-management"></a>

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

有关这两个 Kubernetes 功能的通用信息，请参阅 Kubernetes 文档中的[动态资源分配](https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/)和[设备插件](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/)。

## 动态资源分配与设备插件
<a name="_dynamic_resource_allocation_vs_device_plugins"></a>

Kubernetes 设备插件一直是向 Kubernetes 工作负载公开专用硬件的主要机制。设备插件将设备作为扩展资源（例如 `nvidia.com/gpu` 或 `aws.amazon.com/neuroncore`）进行发布，您可以在容器的资源请求和限制中请求这些资源。尽管设备插件得到广泛支持和使用，但仍存在以下限制：
+ 设备以不透明整数计数的形式请求，无法基于属性进行筛选。
+ 不支持容器之间或容器组（pod）之间的设备共享。
+ 无法跨设备类型进行表达性的拓扑感知分配。
+ 通常需要自定义调度器扩展才能实现智能放置。

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

DRA 支持：
+ 使用[通用表达式语言（CEL）](https://kubernetes.io/docs/reference/using-api/cel/)表达式进行基于属性的设备选择。
+ 拓扑感知分配，确保设备位于同一 PCIe 交换机或 NUMA 域内。
+ 通过共享 `ResourceClaim` 引用在多个容器或容器组（pod）之间共享设备。
+ 基于约束的调度，可协调不同类型的设备。

## 适用于 Amazon EKS 的 DRA 驱动程序
<a name="_dra_drivers_for_amazon_eks"></a>

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

EFA DRA 驱动程序  
EFA DRA 驱动程序（[DRANET](https://github.com/kubernetes-sigs/dranet)）通过拓扑感知安排来管理 Elastic Fabric Adapter（EFA）设备分配，将 EFA 接口与其拓扑邻近的 GPU 或 Neuron 设备配对，并支持在容器组（pod）之间进行设备共享。有关更多信息，请参阅 [管理 Amazon EKS 上的 EFA 设备](device-management-efa.md)。

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

NVIDIA DRA 驱动程序  
[GPU NVIDIA DRA 驱动程序](https://github.com/kubernetes-sigs/nvidia-dra-driver-gpu)支持 NVIDIA GPU 的灵活分配和动态重配置，包括在 EC2 Grace-Blackwell 实例上为多节点 NVLink（MNNVL）工作负载提供 `ComputeDomain` 资源支持。有关在 EC2 Grace-Blackwell 实例上使用 `ComputeDomains` 的更多信息，请参阅 [将 P6e-GB200 UltraServer 与 Amazon EKS 搭配使用](ml-eks-nvidia-ultraserver.md)。

## Amazon EKS 设备插件
<a name="_device_plugins_for_amazon_eks"></a>

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

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

Neuron 设备插件  
[Neuron 设备插件](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/tutorials/k8s-setup.html)将 Neuron 硬件作为 `aws.amazon.com/neuroncore` 和 `aws.amazon.com/neuron` 扩展资源发布。该插件可发现每个节点上可用的 Neuron 设备，将其发布为可分配资源，并管理其生命周期。

NVIDIA 设备插件  
[NVIDIA 设备插件](https://github.com/NVIDIA/k8s-device-plugin)将 NVIDIA GPU 作为 `nvidia.com/gpu` 扩展资源发布，并跟踪 GPU 的运行状况。

## 注意事项
<a name="_considerations"></a>

在 Amazon EKS 上使用 DRA 驱动程序之前，请先了解以下注意事项：
+ DRA 在 Kubernetes 1.33 及以上版本的 Amazon EKS 上可用，但由于上游的 [Kubernetes 问题](https://github.com/kubernetes/kubernetes/issues/133920)，建议在 Kubernetes 1.34 及更高版本上使用。您的集群控制面板和节点必须运行支持 DRA 的 Kubernetes 版本。
+ DRA 目前与 Karpenter 或 EKS Auto Mode 配置的计算不兼容。您必须将 DRA 驱动程序与 EKS 托管节点组或自管理节点配合使用。
+ 同一设备类型的 DRA 驱动程序和设备插件**不得**在同一节点上同时运行。在安装对应的 DRA 驱动程序之前，请卸载设备插件，或将它们部署在不同的节点上。有关 DRA 驱动程序和设备插件兼容性的更新，请参阅上游 Kubernetes [KEP-5004](https://github.com/kubernetes/enhancements/issues/5004)。
+ DRA 使用的 Kubernetes API 资源（`ResourceClaim`、`ResourceClaimTemplate`、`DeviceClass`）与设备插件使用的资源（`resource.limits`、`resource.requests`）不同。从设备插件迁移到 DRA 需要更新您的工作负载规格。
+ 设备插件在所有 Kubernetes 版本中仍将获得全面支持。如果集群运行的 Kubernetes 版本低于 1.34，或者您使用了 Karpenter 或 EKS 自动模式，请继续使用设备插件。Bottlerocket 不支持 NVIDIA DRA 驱动程序；请在 Bottlerocket 节点上使用 NVIDIA 设备插件。Bottlerocket 支持 EFA 和 Neuron DRA 驱动程序。

## DRA ResourceClaim 与 ResourceClaimTemplate
<a name="_dra_resourceclaim_vs_resourceclaimtemplate"></a>

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

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`。

下表总结了 `ResourceClaim` 与 `ResourceClaimTemplate` 之间的差异。


| 行为 | ResourceClaim | ResourceClaimTemplate | 
| --- | --- | --- | 
| 创建 | 在容器组（pod）引用之前手动创建 | Kubernetes 会为每个容器组（pod）自动生成 Claim | 
| 生命周期 | 一直存在，直至您将其删除 | 模板一直存在，直至您将其删除。每个生成的 `ResourceClaim` 都会绑定到触发其创建的容器组（pod）。 | 
| 容器组（pod）间设备共享 | 支持。多个容器组（pod）可以引用同一 Claim。 | 不支持。每个容器组（pod）会获得独立的 Claim。 | 
| 容器组（pod）规格字段 |  `resourceClaimName`  |  `resourceClaimTemplateName`  | 

有关使用 `ResourceClaim` 对象在容器组（pod）之间共享 EFA 设备的示例，请参阅[在多个容器组（pod）之间共享 EFA 设备](device-management-efa.md#efa-dra-share)。有关将 `ResourceClaimTemplate` 对象与拓扑感知分配结合使用的示例，请参阅[拓扑感知的 EFA 和 GPU/Neuron 设备分配](device-management-efa.md#efa-dra-topology-aware)。

## 主题
<a name="_topics"></a>
+  [管理 Amazon EKS 上的 EFA 设备](device-management-efa.md) 
+  [在 Amazon EKS 上管理 Neuron 设备](device-management-neuron.md) 
+  [在 Amazon EKS 上管理 NVIDIA GPU 设备](device-management-nvidia.md) 