

 **帮助改进此页面** 

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

# 管理 Amazon EKS 上的 EFA 设备
<a name="device-management-efa"></a>

 [Elastic Fabric Adapter](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/efa.html) (EFA) 是一种用于 Amazon EC2 实例的网络设备，可为机器学习训练和高性能计算（HPC）工作负载实现高性能的节点间通信。Amazon EKS 支持 *EFA 设备插件*，用于管理 EKS 集群中的 EFA 设备。

## 创建带有 EFA 接口的 EKS 节点
<a name="eks-efa-nodes"></a>

当您创建带有 EFA 接口的 EKS 节点时，EFA 接口会在实例引导期间完成连接。如果您需要自定义每设备的 EFA 配置，或为启用 EFA 的 EC2 实例使用[置放群组](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/placement-groups.html)，建议使用 EKS 托管节点组或 EKS 自管理节点组。您可以使用[启动模板](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/ec2-launch-templates.html)传递每个网络接口的配置。

当使用 EKS Auto Mode 或 Karpenter 进行动态配置时，为请求 `vpc.amazonaws.com/efa` 的容器组（pod）创建的实例，其所有接口均配置为接口类型 `EFA`。EKS Auto Mode 和 Karpenter 中的静态容量配置目前不支持每台设备的 EFA 配置。EKS Auto Mode 和 Karpenter 目前不支持置放群组。

当使用 [`eksctl`](install-kubectl.md#eksctl-install-update) 并以 `efaEnabled` 设置配置 EKS 节点时，所有接口都要配置接口类型 `EFA`，系统会创建一个特定于 EFA 的安全组，并在集群上安装 EFA 设备插件。如果您在使用 `eksctl` 时需要自定义每设备的 EFA 配置，建议使用 eksctl 对[启动模板](https://docs.amazonaws.cn/eks/latest/eksctl/launch-template-support.html)的支持。

## 将 EKS 优化的 AMI 与 EFA 配合使用
<a name="eks-amis-efa"></a>

EKS 优化的 AL2023 加速型 AMI（NVIDIA 和 Neuron）和所有 Bottlerocket AMI 都包含使用 EFA 所需的主机级组件。EKS AL2023 和 Bottlerocket AMI 不包含 EFA 设备插件，在使用 EFA 部署工作负载之前，您必须单独在集群上安装该设备插件。

## 安装 EFA Kubernetes 设备插件
<a name="efa-device-plugin"></a>

EFA 设备插件将 EFA 设备作为 `vpc.amazonaws.com/efa` 扩展资源进行发布。您需要在容器的资源请求和限制中请求 EFA 设备。有关使用训练工作负载设置 EFA 的完整说明，请参阅[使用 Elastic Fabric Adapter 在 Amazon EKS 上运行机器学习训练](node-efa.md)。

EFA 设备插件会自动分配在物理 EC2 实例上与 Neuron 加速器和 NVIDIA GPU 在拓扑上相近的 EFA 设备。

### 先决条件
<a name="_prerequisites"></a>
+ 一个 Amazon EKS 集群。
+ 具有启用 EFA 的 Amazon EC2 实例类型的节点。有关支持的实例类型的列表，请参阅*《Amazon EC2 用户指南》*中的[支持的实例类型](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/efa.html#efa-instance-types)。
+ 为 EFA 安装主机级组件的节点。如果使用 EKS AL2023 加速型 AMI 或 EKS Bottlerocket AMI，则已包含这些组件。
+ 在命令行环境中安装 Helm，有关更多信息，请参阅[安装 Helm 说明](helm.md)。
+  `kubectl` 配置为与您的集群通信，更多信息，请参阅 [安装或更新 `kubectl`](install-kubectl.md#kubectl-install-update)。

### 过程
<a name="_procedure"></a>

1. 添加 Helm 图表存储库。

   ```
   helm repo add eks https://aws.github.io/eks-charts
   ```

1. 更新本地 Helm 存储库。

   ```
   helm repo update
   ```

1. 安装 EFA 设备插件。

   ```
   helm install efa eks/aws-efa-k8s-device-plugin -n kube-system
   ```

1. 验证 EFA 设备插件 DaemonSet 正在运行。

   ```
   kubectl get daemonset -n kube-system aws-efa-k8s-device-plugin-daemonset
   ```

   ```
   NAME                                  DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
   aws-efa-k8s-device-plugin-daemonset   2         2         2       2            2           <none>          60s
   ```

1. 验证节点是否具有可分配的 EFA 资源。

   ```
   kubectl get nodes "-o=custom-columns=NAME:.metadata.name,EFA:.status.allocatable.vpc\.amazonaws\.com/efa"
   ```

   ```
   NAME                                           EFA
   ip-192-168-11-225.us-west-2.compute.internal   4
   ip-192-168-24-96.us-west-2.compute.internal    4
   ```

### 在容器组（pod）中请求 EFA 设备
<a name="_request_efa_devices_in_a_pod"></a>

要使用设备插件请求 EFA 设备，请在容器的资源请求或限制中指定 `vpc.amazonaws.com/efa` 资源。

```
apiVersion: v1
kind: Pod
metadata:
  name: efa-workload
spec:
  containers:
  - name: app
    ...
    resources:
      limits:
        vpc.amazonaws.com/efa: 4
        hugepages-2Mi: ...
      requests:
        vpc.amazonaws.com/efa: 4
        hugepages-2Mi: ...
```