

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon EKS 上管理 EFA 裝置
<a name="device-management-efa"></a>

 [Elastic Fabric Adapter](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html) (EFA) 是 Amazon EC2 執行個體的網路裝置，可為人工智慧、機器學習和高效能運算 (HPC) 工作負載啟用高效能節點間通訊和 RDMA （遠端直接記憶體存取）。Amazon EKS 支援兩種在 EKS 叢集中管理 EFA 裝置的機制：*EFA 動態資源分配 (DRA) 驅動程式 (DRANET)* 和 *EFA 裝置外掛程式*。

在 Karpenter、EKS 受管節點群組或自我管理節點中使用[靜態容量佈建](https://karpenter.sh/docs/concepts/nodepools/#static-nodepool)時，我們建議將 DRA 驅動程式用於 Kubernetes 1.34 版及更新版本的新部署。EKS Auto 模式目前不支援 DRA。使用 EFA DRA 驅動程式，您可以設定拓撲感知配置，將 EFA 介面與其拓撲本機 GPUs 或 Neuron 裝置配對，並在 Pod 之間共用裝置。

## EFA DRA 驅動程式與 EFA 裝置外掛程式
<a name="eks-efa-dra-vs-device-plugin"></a>


| 功能 | EFA DRA 驅動程式 | EFA 裝置外掛程式 | 
| --- | --- | --- | 
| 最低 Kubernetes 版本 | 1.34 | 所有 EKS 支援的 Kubernetes 版本 | 
| EKS 運算 | Karpenter （僅限靜態容量）、受管節點群組、自我管理節點 | EKS Auto Mode、Karpenter、受管節點群組、自我管理節點 | 
| EKS 最佳化 AMIs | AL2023， Bottlerocket | AL2023， Bottlerocket | 
| 裝置廣告 | 透過裝置類型、拓撲和 PCIe 地區性等`ResourceSlice`物件的豐富屬性 | `vpc.amazonaws.com/efa` 延伸資源的整數計數 | 
| GPU-EFA 親和性 | DRA 原生拓撲感知 | 自動拓撲感知 （僅限 EKS 最佳化 AL2023 AMIs) | 
| Neuron-EFA 親和性 | DRA 原生拓撲感知 | 自動拓撲感知 （僅限 EKS 最佳化 AL2023 AMIs) | 
| 裝置共用 | 多個 Pod 可以透過共用`ResourceClaim`參考共用相同的 EFA 裝置 | 不支援。每個 EFA 裝置只會配置給一個 Pod。 | 

## 使用 EFA 介面建立 EKS 節點
<a name="eks-efa-nodes"></a>

當您使用 EFA 介面建立 EKS 節點時，EFA 介面會在執行個體佈建期間連接至執行個體。您可以自訂每個裝置的 EFA 組態，並使用[置放群組](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html)搭配 EKS Auto Mode、Karpenter、EKS 受管節點群組或 EKS 自我管理節點群組。使用 EKS Auto 模式，您可以透過 `NodeClass`下的 傳遞每個網路界面的組態`advancedNetworking.networkInterfaces`。使用 Karpenter，您可以透過 傳遞每個網路界面的組態`EC2NodeClass`。透過 EKS 受管節點群組或自我管理節點，您可以使用[啟動範本](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html)傳遞每個網路介面的組態。

使用 搭配 `efaEnabled`設定[`eksctl`](install-kubectl.md#eksctl-install-update)佈建 EKS 節點時，所有介面都會設定為介面類型 `EFA`、建立 EFA 特定的安全群組，並在叢集上安裝 EFA 裝置外掛程式。如果您需要在使用 時自訂每個裝置的 EFA 組態`eksctl`，建議您使用 `eksctl 對[啟動範本](https://docs.aws.amazon.com/eks/latest/eksctl/launch-template-support.html)的支援。

下列範例示範如何使用 EFA 介面設定`NodeClass`和啟動範本。這有助於自訂用於 EFA 和標準 IP 型流量的介面。如需每個執行個體類型支援的 EFA 介面數量，以及如何設定它們以取得最大網路頻寬的資訊，請參閱《*Amazon EC2 使用者指南*》中的為[啟用 EFA 的執行個體類型最大化網路頻寬](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-acc-inst-types.html)。

## EKS 自動模式
<a name="eks-efa-auto-mode"></a>

在 EKS Auto 模式中，您可以使用 `NodeClass`() 中的 `advancedNetworking.networkInterfaces` 欄位來設定 EFA 網路介面`eks.amazonaws.com/v1`。每個項目都會指定 `networkCardIndex`、 `deviceIndex`和 `interfaceType`。`interfaceType` 可以是`interface`標準網路介面，也可以`efa-only`是專用於未指派 IP 地址之 RDMA 流量的 EFA 介面。

設定 `networkInterfaces` 時，參考 啟動`NodePool`的執行個體`NodeClass`會使用此組態，無論 Pod 是否請求`vpc.amazonaws.com/efa`資源。對於具有靜態網路介面組態的節點，EKS Auto Mode 不會在執行個體啟動後連接其他 IPs、字首或 ENIs，只有啟動時設定的介面和 IPs 可供 Pod 使用。

此功能可與[靜態容量節點集](auto-static-capacity.md)區搭配使用，以維護適用於分散式訓練和推論工作負載的預先暖機 EFA 就緒節點。

### EKS Auto Mode NodeClass 範例搭配 P5 的僅限 EFA 介面
<a name="eks-efa-auto-mode-example"></a>

```
apiVersion: eks.amazonaws.com/v1
kind: NodeClass
metadata:
  name: efa-node-class
spec:
  role: MyNodeRole
  subnetSelectorTerms:
    - tags:
        Name: "private-subnet"
  securityGroupSelectorTerms:
    - tags:
        Name: "efa-security-group"
  placementGroupSelector:
    name: "ml-training-pg"
  advancedNetworking:
    networkInterfaces:
    - deviceIndex: 0
      interfaceType: interface
      networkCardIndex: 0
      secondaryIPv4PrefixCount: 1
    - networkCardIndex: 0
      deviceIndex: 1
      interfaceType: efa-only
    - networkCardIndex: 1
      deviceIndex: 0
      interfaceType: efa-only
    - networkCardIndex: 2
      deviceIndex: 0
      interfaceType: efa-only
    - networkCardIndex: 3
      deviceIndex: 0
      interfaceType: efa-only
```

如需靜態網路介面組態限制的完整清單，請參閱 NodeClass 文件[靜態網路界面組態](create-node-class.md#static-network-interfaces)中的 。

## Karpenter
<a name="eks-efa-auto-karpenter"></a>

中的每個項目都會`networkInterfaces`指定 `networkCardIndex`、 `deviceIndex`和 `interfaceType`。`interfaceType` 可以`interface`用於標準網路介面，也可以`efa-only`用於專用於 RDMA 流量且未指派 IP 地址的 EFA 介面。設定 `networkInterfaces` 時，參考 啟動`NodePool`的執行個體`NodeClass`會使用此組態，無論 Pod 是否請求`vpc.amazonaws.com/efa`資源。

使用 Karpenter 而不在 `networkInterfaces`中指定 時`NodeClass`，為請求的 Pod 建立的執行個體`vpc.amazonaws.com/efa`會設定所有介面類型 `EFA`。

的`networkInterfaces`組態`EC2NodeClass`已在 Karpenter 1.11 版中新增。下列範例顯示為具有 1 個 ENA 介面和 8 個僅限 EFA 介面的 P6-B200 執行個體`EC2NodeClass`設定的 。

### 範例 Karpenter EC2NodeClass 搭配 P6-B200 的僅限 EFA 介面
<a name="eks-efa-karpenter-example"></a>

```
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
  name: efa-node-class
spec:
  networkInterfaces:
  - networkCardIndex: 0
    deviceIndex: 0
    interfaceType: interface
  - networkCardIndex: 0
    deviceIndex: 1
    interfaceType: efa-only
  - networkCardIndex: 1
    deviceIndex: 0
    interfaceType: efa-only
  - networkCardIndex: 2
    deviceIndex: 0
    interfaceType: efa-only
  - networkCardIndex: 3
    deviceIndex: 0
    interfaceType: efa-only
  - networkCardIndex: 4
    deviceIndex: 0
    interfaceType: efa-only
  - networkCardIndex: 5
    deviceIndex: 0
    interfaceType: efa-only
  - networkCardIndex: 6
    deviceIndex: 0
    interfaceType: efa-only
  - networkCardIndex: 7
    deviceIndex: 0
    interfaceType: efa-only
```

## EKS 受管節點群組和自我管理節點
<a name="eks-efa-mng-self-managed"></a>

透過 EKS 受管節點群組或自我管理節點，您可以使用[啟動範本](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html)傳遞每個網路介面的組態。

下列範例顯示為具有 1 個 ENA 介面和 8 個僅限 EFA 介面的 P6-B200 執行個體設定的啟動範本。主要網路介面 （網路卡 0、裝置索引 0) 使用 IP 流量的標準`interface`類型，而其他介面則`efa-only`用於專用 RDMA 流量。根據您的執行個體類型調整`efa-only`介面數量。如需每個執行個體類型支援的 EFA 介面數量，請參閱《*Amazon EC2 使用者指南*》中的[啟用 EFA 執行個體類型的網路頻寬最大化](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-acc-inst-types.html)。

### P6-B200 搭配僅限 EFA 介面的啟動範本範例
<a name="eks-efa-launch-template-example"></a>

將 取代` security-group-id `為您的值。安全群組必須允許進出本身的所有傳入和傳出流量，才能啟用 EFA OS-bypass 功能。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[步驟 1：準備啟用 EFA 的安全群組](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html#efa-start-security)。

**重要**  
使用 EKS 受管節點群組時，請勿在啟動範本`SubnetId`中指定 。EKS 要求透過 `CreateNodegroup` API 指定所有子網路，並拒絕包含子網路組態的啟動範本。

```
{
  "LaunchTemplateName": "efa-launch-template",
  "LaunchTemplateData": {
    "InstanceType": "p6-b200.48xlarge",
    "NetworkInterfaces": [
      {
        "NetworkCardIndex": 0,
        "DeviceIndex": 0,
        "InterfaceType": "interface",
        "Groups": ["security-group-id"]
      },
      {
        "NetworkCardIndex": 0,
        "DeviceIndex": 1,
        "InterfaceType": "efa-only",
        "Groups": ["security-group-id"]
      },
      {
        "NetworkCardIndex": 1,
        "DeviceIndex": 0,
        "InterfaceType": "efa-only",
        "Groups": ["security-group-id"]
      },
      {
        "NetworkCardIndex": 2,
        "DeviceIndex": 0,
        "InterfaceType": "efa-only",
        "Groups": ["security-group-id"]
      },
      {
        "NetworkCardIndex": 3,
        "DeviceIndex": 0,
        "InterfaceType": "efa-only",
        "Groups": ["security-group-id"]
      },
      {
        "NetworkCardIndex": 4,
        "DeviceIndex": 0,
        "InterfaceType": "efa-only",
        "Groups": ["security-group-id"]
      },
      {
        "NetworkCardIndex": 5,
        "DeviceIndex": 0,
        "InterfaceType": "efa-only",
        "Groups": ["security-group-id"]
      },
      {
        "NetworkCardIndex": 6,
        "DeviceIndex": 0,
        "InterfaceType": "efa-only",
        "Groups": ["security-group-id"]
      },
      {
        "NetworkCardIndex": 7,
        "DeviceIndex": 0,
        "InterfaceType": "efa-only",
        "Groups": ["security-group-id"]
      }
    ]
  }
}
```

## 搭配 EFA 使用 EKS 最佳化 AMIs
<a name="eks-amis-efa"></a>

EKS 最佳化 AL2023 AMIs 和所有 Bottlerocket AMIs 包含使用 EFA 所需的主機層級元件，特別是 [aws-efa-installer](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html#efa-start-enable) 安裝的元件。EKS AL2023 和 Bottlerocket AMIs **不包含** EFA DRA 驅動程式或 EFA 裝置外掛程式，而且這些必須分別安裝在叢集上，才能部署工作負載。

## 保留 IP 地址配置
<a name="eks-efa-conserve-ip"></a>

`p5.48xlarge` 和 等已啟用 EFA 的執行個體`p6-b200.48xlarge`支援許多網路介面。根據預設，Amazon VPC CNI 會將 IP 地址分配到所有已啟用 IP 的連接 ENIs，即使 Pod 未主動使用這些地址，也會從您的子網路取用大量 IP 地址。在具有數十個網路介面的執行個體上，這可能會快速耗盡子網路的可用 IP 空間。

若要減少啟用 EFA 節點的 IP 地址使用量，請將您的網路介面設定為`efa-only`用於主要節點以外的所有介面。僅限 EFA 的介面專用於 RDMA 流量，且沒有指派 IP 地址，因此不會耗用子網路中的地址。如需範例組態，請參閱 [Karpenter](#eks-efa-auto-karpenter)和 [EKS 受管節點群組和自我管理節點](#eks-efa-mng-self-managed)。如需每個執行個體類型的建議界面配置，請參閱《*Amazon EC2 使用者指南*》中的為[啟用 EFA 的執行個體類型最大化網路頻寬](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-acc-inst-types.html)。

除了使用`efa-only`介面之外，您還可以設定 Amazon VPC CNI 來限制暖 （預先配置） IP 地址和 ENIs 的數量。根據預設，VPC CNI 會預先配置 ENIs 和 IP 地址的暖集區，以加快 Pod 啟動速度，但在大型執行個體上，可以保留數百個未使用的 IP 地址。在 `aws-node` DaemonSet 上設定 `WARM_IP_TARGET`和 `WARM_ENI_TARGET`環境變數，以控制 CNI 維護的備用 IP 地址和 ENIs 數量。如需這些設定的詳細資訊，請參閱 [Amazon VPC CNI 最佳實務](https://docs.aws.amazon.com/eks/latest/best-practices/vpc-cni.html#_overview)。

**注意**  
`WARM_ENI_TARGET` 和 `WARM_IP_TARGET`設定適用於整個叢集，並適用於 VPC CNI 管理的所有節點。目前無法為每個節點群組或執行個體類型設定不同的值。如果您需要更精細地控制這些設定，請在 GitHub 上提供有關[容器藍圖問題 \#1834](https://github.com/aws/containers-roadmap/issues/1834) 的意見回饋。

## 安裝 EFA DRA 驅動程式 (DRANET)
<a name="efa-dra-driver"></a>

EFA DRA 驅動程式內建於 GitHub 上的上游 [DRANET](https://github.com/kubernetes-sigs/dranet) 專案中，可提供 Kubernetes DRA 的雲端感知網路裝置管理。本文件中會互換使用 *EFA DRA 驅動程式*和 *DRANET*，並參考相同的工具。

EFA DRA 驅動程式會將 EFA 裝置公告為具有驅動程式名稱 `dra.net`和`DeviceClass`名稱 的`ResourceSlice`物件`efa.networking.k8s.aws`。EFA DRA 驅動程式會在每個節點上以 DaemonSet 身分執行，並自動探索 EFA 裝置。

### 先決條件
<a name="_prerequisites"></a>
+ 執行 Kubernetes 1.34 版或更新版本的 Amazon EKS 叢集，具有由 Karpenter、EKS 受管節點群組或自我管理節點群組佈建的靜態容量。
+ 具有啟用 EFA 的 Amazon EC2 執行個體類型的節點。如需支援的執行個體類型清單，請參閱《*Amazon EC2 使用者指南*》中的[支援的執行個體類型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html#efa-instance-types)。
+ 針對 EFA 安裝主機層級元件的節點，如需詳細資訊[，請參閱安裝 EFA 軟體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html#efa-start-enable)。EKS 最佳化 AL2023 NVIDIA 和 Neuron AMIs，以及 Bottlerocket AMIs 包含 EFA 主機層級元件。
+ 已在命令列環境中安裝 Helm，如需詳細資訊，請參閱[安裝 Helm 說明](helm.md)。
+  `kubectl` 設定為與您的叢集通訊，[安裝或更新 `kubectl`](install-kubectl.md#kubectl-install-update)如需詳細資訊，請參閱 。

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

**重要**  
請勿在執行 EFA 裝置外掛程式的節點上安裝 EFA DRA 驅動程式。這兩個機制不能同時存在於同一個節點上。這樣做可能會導致基礎裝置的靜音過度訂閱到相同節點上的多個 Pod。

1. 新增 EKS Helm Chart 儲存庫。

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

1. 更新本機 Helm 儲存庫。

   ```
   helm repo update
   ```

1. 使用 Helm 在叢集上安裝 EFA DRA 驅動程式。EFA DRA 驅動程式會自動透過執行個體中繼資料服務 (IMDS) 在 EC2 執行個體上執行，並啟用 EFA 裝置探索。根據預設，EFA DRA 驅動程式會部署為`kube-system`命名空間中的 DaemonSet。如需可設定的參數，請參閱 GitHub 上的 [EKS Helm Chart 儲存庫](https://github.com/aws/eks-charts/tree/master/stable/aws-dranet)中的 Helm values.yaml。

   ```
   helm install aws-dranet eks/aws-dranet --namespace kube-system
   ```

1. 確認 DRANET DaemonSet 正在執行。

   ```
   kubectl get daemonset -n kube-system aws-dranet
   ```

   ```
   NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
   aws-dranet    2         2         2       2            2           <none>          60s
   ```

1. 確認`DeviceClass`已建立 。

   ```
   kubectl get deviceclass
   ```

   ```
   NAME                    AGE
   efa.networking.k8s.aws  60s
   ```

1. 確認已為您的節點公告`ResourceSlice`物件。

   ```
   kubectl get resourceslices --field-selector spec.driver=dra.net
   ```

   如果上述步驟發生錯誤，您可以使用下列命令檢查 DRANET 的日誌。

   ```
   kubectl logs -n kube-system -l app=aws-dranet
   ```

1. 若要使用 DRA 驅動程式請求 EFA 裝置，請建立參考 EFA `ResourceClaimTemplate` 的 `ResourceClaim`或 ，`DeviceClass`並在 Pod 規格中參考它。下列範例會請求單一 EFA 裝置。

   ```
   apiVersion: resource.k8s.io/v1
   kind: ResourceClaimTemplate
   metadata:
     name: single-efa-claim
   spec:
     spec:
       devices:
         requests:
         - name: efa
           exactly:
             deviceClassName: efa.networking.k8s.aws
             count: 1
   ---
   apiVersion: v1
   kind: Pod
   metadata:
     name: efa-workload
   spec:
     containers:
     - name: app
       ...
       resources:
         claims:
         - name: efa-device
     resourceClaims:
     - name: efa-device
       resourceClaimTemplateName: single-efa-claim
   ```

## 拓撲感知 EFA 和 GPU/Neuron 裝置配置
<a name="efa-dra-topology-aware"></a>

EFA DRA 驅動程式支援拓撲感知配置，可將 EFA 介面與相同 PCIe 根目錄上的 GPUs 或 Neuron 裝置配對。使用 `matchAttribute` 限制條件來對齊 EFA 和 GPU 或 Neuron 裝置配置。若要使用此功能，您還必須使用 NVIDIA 或 Neuron DRA 驅動程式。如需詳細資訊，請參閱[在 Amazon EKS 上管理 NVIDIA GPUs](device-management-nvidia.md)及[在 Amazon EKS 上管理 Neuron 裝置](device-management-neuron.md)。

下列範例會請求與 1 個 NVIDIA GPU 一致的 1 個 EFA 介面：

```
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: aligned-efa-nvidia
spec:
  spec:
    devices:
      requests:
      - name: 1-efa
        exactly:
          deviceClassName: efa.networking.k8s.aws
          count: 1
      - name: 1-gpu
        exactly:
          deviceClassName: gpu.nvidia.com
          count: 1
      constraints:
      - requests: ["1-gpu", "1-efa"]
        matchAttribute: "resource.kubernetes.io/pcieRoot"
```

下列範例會請求與 4 個 Neuron 裝置對齊的 4 個 EFA 介面：

```
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: aligned-efa-neuron
spec:
  spec:
    devices:
      requests:
      - name: 4-neurons
        exactly:
          deviceClassName: neuron.aws.com
          count: 4
      - name: 4-efas
        exactly:
          deviceClassName: efa.networking.k8s.aws
          count: 4
      constraints:
      - requests: ["4-neurons", "4-efas"]
        matchAttribute: "resource.aws.com/devicegroup4_id"
```

`devicegroup` 屬性名稱中的數字對應至已連線拓撲群組中的 Neuron 裝置數量。例如， `resource.aws.com/devicegroup1_id` 識別單一 Neuron 裝置、`resource.aws.com/devicegroup4_id`識別 4 個連線裝置的群組，`resource.aws.com/devicegroup8_id`以及分別`resource.aws.com/devicegroup16_id`識別 8 和 16 個連線裝置的群組。選擇`matchAttribute`符合您請求`count`中裝置的 ，以便配置的 Neuron 裝置和 EFA 介面屬於相同的連線拓撲群組。如需這些屬性的詳細資訊，請參閱 [Neuron DRA 驅動程式文件](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/neuron-dra.html)。

您可以使用 `allocationMode` 簡化 EFA 裝置如何配置給對齊的 GPU 或 Neuron 加速器。`allocationMode` 欄位支援兩個值： `ExactCount`（預設值） 請求 指定的特定數量裝置`count`，並`All`請求集區中的所有相符裝置。例如，在`p5.48xlarge`執行個體上，有四個 EFA 裝置與一個 GPU 共用相同的 PCIe 根。若要使用對齊的 GPUs 配置這些 EFA 裝置群組，即使您不知道確切的 EFA-GPU 裝置映射和對齊的 EFA 裝置計數，您也可以`ResourceClaimTemplate`使用 `allocationMode: All` 為 EFA 裝置設定您的 。

```
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: aligned-all-efa-one-nvidia
spec:
  spec:
    devices:
      requests:
      - name: all-efas
        exactly:
          deviceClassName: efa.networking.k8s.aws
          allocationMode: All
      - name: one-gpu
        exactly:
          deviceClassName: gpu.nvidia.com
          allocationMode: ExactCount
          count: 1
      constraints:
      - requests: ["all-efas", "one-gpu"]
        matchAttribute: "resource.kubernetes.io/pcieRoot"
```

## 在多個 Pod 之間共用 EFA 裝置
<a name="efa-dra-share"></a>

EFA DRA 驅動程式支援使用 在多個 Pod 之間共用 EFA 裝置`ResourceClaim`。與為每個 Pod `ResourceClaimTemplate`產生個別宣告的 不同， `ResourceClaim`是您獨立建立並從多個 Pod 參考的具名物件。所有參考相同`ResourceClaim`已配置 EFA 裝置共用存取權的 Pod，並排程到提供這些裝置的相同節點。

若要在 Pod 之間共用 EFA 裝置，請建立`ResourceClaim`請求 EFA 裝置的 ，然後使用 在每個 Pod 的 `resourceClaims` 欄位中依名稱參考該宣告`resourceClaimName`。在建立參考叢集的 Pod 之前，叢集中`ResourceClaim`必須存在 。如果參考`ResourceClaim`不存在，Pod 會保持待定狀態，直到建立宣告為止。

下列範例會建立`ResourceClaim`請求 4 個 EFA 裝置的 ，以及兩個共用這些裝置存取權的 Pod。

1. 建立 `ResourceClaim`。

   ```
   apiVersion: resource.k8s.io/v1
   kind: ResourceClaim
   metadata:
     name: shared-efa
   spec:
     devices:
       requests:
       - name: efa
         exactly:
           deviceClassName: efa.networking.k8s.aws
           count: 4
   ```

1. 在需要存取 EFA 裝置的每個 Pod 中`ResourceClaim`，依名稱參考 。每個 Pod 會使用 `resourceClaimName` 來參考現有的宣告，而非 `resourceClaimTemplateName`。

   ```
   apiVersion: v1
   kind: Pod
   metadata:
     name: training-worker
   spec:
     containers:
     - name: worker
       image: my-training-image
       resources:
         claims:
         - name: efa-devices
     resourceClaims:
     - name: efa-devices
       resourceClaimName: shared-efa
   ---
   apiVersion: v1
   kind: Pod
   metadata:
     name: training-monitor
   spec:
     containers:
     - name: monitor
       image: my-monitor-image
       resources:
         claims:
         - name: efa-devices
     resourceClaims:
     - name: efa-devices
       resourceClaimName: shared-efa
   ```

兩個 Pod 都參考相同的 `shared-efa``ResourceClaim`，並排程到配置這些 EFA 裝置的節點。`ResourceClaim` 生命週期獨立於 Pod，它會持續存在直到您刪除它為止，即使所有參考它的 Pod 都被移除。

## 安裝 EFA Kubernetes 裝置外掛程式
<a name="eks-efa-device-plugin"></a>

EFA Kubernetes 裝置外掛程式會將 EFA 裝置公告為`vpc.amazonaws.com/efa`延伸資源。您可以在容器資源請求和限制中請求 EFA 裝置。如需使用訓練工作負載設定 EFA 的完整逐步解說，請參閱 [使用 Elastic Fabric Adapter 在 Amazon EKS 上執行機器學習訓練](node-efa.md)。

**重要**  
使用 EKS 最佳化 AL2023 加速 AMIs 時，會自動配置具有 EFA 介面的 NVIDIA GPUs 或 Neuron 裝置拓撲。使用 Bottlerocket EKS 最佳化 AMIs 或自訂 AMIs 時，不會發生此自動對齊。如果您需要透過 Bottlerocket 或自訂 AMIs 配置拓撲對齊加速器和 EFA 裝置，請使用 EFA DRA 驅動程式和對應的 Neuron DRA 驅動程式。若要在 Bottlerocket 上使用 NVIDIA DRA 驅動程式，您必須先停用隨附於 Bottlerocket NVIDIA 變體的 NVIDIA 裝置外掛程式，該變體需要 Bottlerocket 1.63.0 版或更新版本。如需詳細資訊，請參閱[拓撲感知 EFA 和 GPU/Neuron 裝置配置](#efa-dra-topology-aware)及[安裝 NVIDIA DRA 驅動程式](device-management-nvidia-dra-device-plugin.md#eks-nvidia-dra-driver)。

**重要**  
從 NVIDIA v0`k8s-device-plugin`.19.0 開始， `--mofed-enabled`旗標預設為 `true`，這會導致 NVIDIA 裝置外掛程式將所有`/dev/infiniband/uverbs*`裝置掛載到請求 GPUs 的容器。這與 EFA 裝置外掛程式發生衝突，應該是管理 中 EFA 裝置配置的元件`/dev/infiniband`。如果您使用 EKS 受管節點群組或自我管理節點搭配 NVIDIA 裝置外掛程式，則必須明確停用 MOFED。如需說明，請參閱[安裝 NVIDIA Kubernetes 裝置外掛程式](device-management-nvidia-dra-device-plugin.md#eks-nvidia-device-plugin)。  
EKS Auto Mode 預設不會啟用 MOFED，且不受此問題影響。

### 先決條件
<a name="_prerequisites_2"></a>
+ Amazon EKS 叢集。
+ 具有啟用 EFA 的 Amazon EC2 執行個體類型的節點。如需支援的執行個體類型清單，請參閱《*Amazon EC2 使用者指南*》中的[支援的執行個體類型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html#efa-instance-types)。
+ 針對 EFA 安裝主機層級元件的節點，如需詳細資訊[，請參閱安裝 EFA 軟體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html#efa-start-enable)。EKS 最佳化 AL2023 AMIs 和 Bottlerocket AMIs 包含 EFA 主機層級元件。
+ 已在命令列環境中安裝 Helm，如需詳細資訊，請參閱[安裝 Helm 說明](helm.md)。
+  `kubectl` 設定為與您的叢集通訊，[安裝或更新 `kubectl`](install-kubectl.md#kubectl-install-update)如需詳細資訊，請參閱 。

### 程序
<a name="_procedure_2"></a>

1. 新增 EKS Helm Chart 儲存庫。

   ```
   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 efa-aws-efa-k8s-device-plugin
   ```

   ```
   NAME                                  DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
   efa-aws-efa-k8s-device-plugin         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
   ```

1. 若要使用裝置外掛程式請求 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: ...
   ```