協助改進此頁面
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Amazon EKS 上管理 EFA 裝置
Elastic Fabric Adapter (EFA) 是 Amazon EC2 執行個體的網路裝置,可為人工智慧、機器學習和高效能運算 (HPC) 工作負載啟用高效能節點間通訊和 RDMA (遠端直接記憶體存取)。Amazon EKS 支援兩種在 EKS 叢集中管理 EFA 裝置的機制:EFA 動態資源分配 (DRA) 驅動程式 (DRANET) 和 EFA 裝置外掛程式。
建議使用 EFA DRA 驅動程式 (DRANET) 在執行 Kubernetes 1.34 版或更新版本的 EKS 叢集上使用 EKS 受管節點群組或自我管理節點群組進行新部署。EFA DRA 驅動程式可讓您設定拓撲感知配置,將 EFA 介面與其拓撲本機 GPUs 或 Neuron 裝置配對,並支援 Pod 之間的裝置共用。
Karpenter 或 EKS Auto 模式不支援 EFA DRA 驅動程式。使用 EFA 裝置外掛程式搭配 Karpenter 和 EKS Auto 模式。EFA 裝置外掛程式仍然支援 EKS 受管節點群組和自我管理節點。
EFA DRA 驅動程式與 EFA 裝置外掛程式
| 功能 | EFA DRA 驅動程式 | EFA 裝置外掛程式 |
|---|---|---|
|
最低 Kubernetes 版本 |
1.34 |
所有 EKS 支援的 Kubernetes 版本 |
|
EKS 運算 |
受管節點群組、自我管理節點 |
EKS Auto Mode、Karpenter、受管節點群組、自我管理節點 |
|
EKS 最佳化 AMIs |
AL2023 (NVIDIA、Neuron)、 Bottlerocket |
AL2023 (NVIDIA、Neuron)、 Bottlerocket |
|
裝置廣告 |
透過裝置類型、拓撲和 PCIe 地區性等 |
|
|
GPU-EFA 親和性 |
DRA 原生拓撲感知 |
自動拓撲感知 (僅限 EKS 最佳化 AL2023 AMIs) |
|
Neuron-EFA 親和性 |
DRA 原生拓撲感知 |
自動拓撲感知 (僅限 EKS 最佳化 AL2023 AMIs) |
|
裝置共用 |
多個 Pod 可以透過共用 |
不支援。每個 EFA 裝置只會配置給一個 Pod。 |
使用 EFA 介面建立 EKS 節點
當您使用 EFA 介面建立 EKS 節點時,EFA 介面會在執行個體佈建期間連接至執行個體。您可以自訂每個裝置的 EFA 組態,並將置放群組與 Karpenter、EKS 受管節點群組或 EKS 自我管理節點群組搭配使用。使用 Karpenter,您可以透過 傳遞每個網路界面的組態NodeClass。透過 EKS 受管節點群組或自我管理節點,您可以使用啟動範本傳遞每個網路介面的組態。EKS Auto Mode 支援每個裝置 EFA 組態和置放群組。
使用 搭配 efaEnabled設定eksctl佈建 EKS 節點時,所有介面都會設定為介面類型 EFA、建立 EFA 特定的安全群組,並在叢集上安裝 EFA 裝置外掛程式。如果您需要在使用 時自訂每個裝置的 EFA 組態eksctl,建議您使用 `eksctl 對啟動範本的支援。
下列範例示範如何使用 EFA 介面設定NodeClass和啟動範本。這有助於自訂用於 EFA 和標準 IP 型流量的介面。如需每個執行個體類型支援的 EFA 介面數量,以及如何設定它們以取得最大網路頻寬的資訊,請參閱《Amazon EC2 使用者指南》中的為啟用 EFA 的執行個體類型最大化網路頻寬。
Karpenter
中的每個項目都會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設定的 。
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 受管節點群組和自我管理節點
透過 EKS 受管節點群組或自我管理節點,您可以使用啟動範本傳遞每個網路介面的組態。
下列範例顯示為具有 1 個 ENA 介面和 8 個僅限 EFA 介面的 P6-B200 執行個體設定的啟動範本。主要網路介面 (網路卡 0、裝置索引 0) 使用 IP 流量的標準interface類型,而其他介面則efa-only用於專用 RDMA 流量。根據您的執行個體類型調整efa-only介面數量。如需每個執行個體類型支援的 EFA 介面數量,請參閱《Amazon EC2 使用者指南》中的啟用 EFA 執行個體類型的網路頻寬最大化。
將 取代 security-group-id 為您的值。安全群組必須允許進出本身的所有傳入和傳出流量,才能啟用 EFA OS-bypass 功能。如需詳細資訊,請參閱《Amazon EC2 使用者指南》中的步驟 1:準備啟用 EFA 的安全群組。
重要
使用 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
EKS 最佳化 AL2023 加速 AMIs (NVIDIA 和 Neuron) 和所有 Bottlerocket AMIs 包含使用 EFA 所需的主機層級元件,特別是 aws-efa-installer 安裝的元件。EKS AL2023 和 Bottlerocket AMIs 不包含 EFA DRA 驅動程式或 EFA 裝置外掛程式,而且這些必須分別安裝在叢集上,才能部署工作負載。
保留 IP 地址配置
p5.48xlarge 和 等已啟用 EFA 的執行個體p6-b200.48xlarge支援許多網路介面。根據預設,Amazon VPC CNI 會將 IP 地址分配到所有已啟用 IP 的連接 ENIs,即使 Pod 未主動使用這些地址,也會從您的子網路取用大量 IP 地址。在具有數十個網路介面的執行個體上,這可能會快速耗盡子網路的可用 IP 空間。
若要減少啟用 EFA 節點的 IP 地址使用量,請將您的網路介面設定為efa-only用於主要節點以外的所有介面。僅限 EFA 的介面專用於 RDMA 流量,且沒有指派 IP 地址,因此不會耗用子網路中的地址。如需範例組態,請參閱 Karpenter和 EKS 受管節點群組和自我管理節點。如需每個執行個體類型的建議界面配置,請參閱《Amazon EC2 使用者指南》中的為啟用 EFA 的執行個體類型最大化網路頻寬。
除了使用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 最佳實務。
注意
WARM_ENI_TARGET 和 WARM_IP_TARGET設定適用於整個叢集,並適用於 VPC CNI 管理的所有節點。目前無法為每個節點群組或執行個體類型設定不同的值。如果您需要更精細地控制這些設定,請針對容器藍圖問題 #1834
安裝 EFA DRA 驅動程式 (DRANET)
EFA DRA 驅動程式內建於上游 DRANET
EFA DRA 驅動程式會將 EFA 裝置公告為具有驅動程式名稱 dra.net和DeviceClass名稱 的ResourceSlice物件efa.networking.k8s.aws。EFA DRA 驅動程式會在每個節點上以 DaemonSet 身分執行,並自動探索 EFA 裝置。
先決條件
-
使用 EKS 受管節點群組或自我管理節點群組執行 Kubernetes 1.34 版或更新版本的 Amazon EKS 叢集。
-
具有啟用 EFA 的 Amazon EC2 執行個體類型的節點。如需支援的執行個體類型清單,請參閱《Amazon EC2 使用者指南》中的支援的執行個體類型。
-
針對 EFA 安裝主機層級元件的節點,如需詳細資訊,請參閱安裝 EFA 軟體。EKS 最佳化 AL2023 NVIDIA 和 Neuron AMIs,以及 Bottlerocket AMIs 包含 EFA 主機層級元件。
-
已在命令列環境中安裝 Helm,如需詳細資訊,請參閱安裝 Helm 說明。
-
kubectl設定為與您的叢集通訊,安裝或更新 kubectl如需詳細資訊,請參閱 。
程序
重要
請勿在執行 EFA 裝置外掛程式的節點上安裝 EFA DRA 驅動程式。這兩個機制不能同時存在於同一個節點上。如需更新,請參閱上游 Kubernetes KEP-5004
-
新增 EKS Helm Chart 儲存庫。
helm repo add eks https://aws.github.io/eks-charts -
更新本機 Helm 儲存庫。
helm repo update -
使用 Helm 在叢集上安裝 EFA DRA 驅動程式。EFA DRA 驅動程式會自動透過執行個體中繼資料服務 (IMDS) 在 EC2 執行個體上執行,並啟用 EFA 裝置探索。根據預設,EFA DRA 驅動程式會部署為
kube-system命名空間中的 DaemonSet。如需可設定的參數,請參閱 EKS Helm Chart GitHub 儲存庫中的 Helmvalues.yaml。 helm install aws-dranet eks/aws-dranet --namespace kube-system -
確認 DRANET DaemonSet 正在執行。
kubectl get daemonset -n kube-system aws-dranetNAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE aws-dranet 2 2 2 2 2 <none> 60s -
確認
DeviceClass已建立 。kubectl get deviceclassNAME AGE efa.networking.k8s.aws 60s -
確認已為您的節點公告
ResourceSlice物件。kubectl get resourceslices --field-selector spec.driver=dra.net如果上述步驟發生錯誤,您可以使用下列命令檢查 DRANET 的日誌。
kubectl logs -n kube-system -l app=aws-dranet -
若要使用 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 裝置配置
EFA DRA 驅動程式支援拓撲感知配置,可將 EFA 介面與相同 PCIe 根目錄上的 GPUs 或 Neuron 裝置配對。使用 matchAttribute 限制條件來對齊 EFA 和 GPU 或 Neuron 裝置配置。若要使用此功能,您還必須使用 NVIDIA 或 Neuron DRA 驅動程式。如需詳細資訊,請參閱在 Amazon EKS 上管理 NVIDIA GPU 裝置及在 Amazon EKS 上管理 Neuron 裝置。
下列範例會請求與 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 驅動程式文件
您可以使用 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 裝置
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。
-
建立
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 -
在需要存取 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-efaResourceClaim,並排程到配置這些 EFA 裝置的節點。ResourceClaim 生命週期獨立於 Pod,它會持續存在,直到您刪除它為止,即使所有參考它的 Pod 都被移除。
安裝 EFA Kubernetes 裝置外掛程式
EFA Kubernetes 裝置外掛程式會將 EFA 裝置公告為vpc.amazonaws.com/efa延伸資源。您可以在容器資源請求和限制中請求 EFA 裝置。如需使用訓練工作負載設定 EFA 的完整逐步解說,請參閱 使用 Elastic Fabric Adapter 在 Amazon EKS 上執行機器學習訓練。
重要
使用 EKS 最佳化 AL2023 加速 AMIs 時,會自動配置具有 EFA 介面的 NVIDIA GPUs 或 Neuron 裝置拓撲。使用 Bottlerocket EKS 最佳化 AMIs 或自訂 AMIs 時,不會發生此自動對齊。如果您需要透過 Bottlerocket 或自訂 AMIs 配置拓撲對齊加速器和 EFA 裝置,請使用 EFA DRA 驅動程式和對應的 Neuron DRA 驅動程式。Bottlerocket 不支援 NVIDIA DRA 驅動程式。如需詳細資訊,請參閱拓撲感知 EFA 和 GPU/Neuron 裝置配置。
重要
從 NVIDIA v0k8s-device-plugin.19.0 開始, --mofed-enabled旗標預設為 true,這會導致 NVIDIA 裝置外掛程式將所有/dev/infiniband/uverbs*裝置掛載到請求 GPUs 的容器。這與 EFA 裝置外掛程式發生衝突,應該是管理 中 EFA 裝置配置的元件/dev/infiniband。如果您使用 EKS 受管節點群組或自我管理節點搭配 NVIDIA 裝置外掛程式,則必須明確停用 MOFED。如需說明,請參閱安裝 NVIDIA Kubernetes 裝置外掛程式。
EKS Auto Mode 預設不會啟用 MOFED,且不受此問題影響。
先決條件
-
Amazon EKS 叢集。
-
具有啟用 EFA 的 Amazon EC2 執行個體類型的節點。如需支援的執行個體類型清單,請參閱《Amazon EC2 使用者指南》中的支援的執行個體類型。
-
針對 EFA 安裝主機層級元件的節點,如需詳細資訊,請參閱安裝 EFA 軟體。EKS 最佳化 AL2023 NVIDIA 和 Neuron AMIs,以及 Bottlerocket AMIs 包含 EFA 主機層級元件。
-
已在命令列環境中安裝 Helm,如需詳細資訊,請參閱安裝 Helm 說明。
-
kubectl設定為與您的叢集通訊,安裝或更新 kubectl如需詳細資訊,請參閱 。
程序
-
新增 EKS Helm Chart 儲存庫。
helm repo add eks https://aws.github.io/eks-charts -
更新本機 Helm 儲存庫。
helm repo update -
安裝 EFA 裝置外掛程式。
helm install efa eks/aws-efa-k8s-device-plugin -n kube-system -
驗證 EFA 裝置外掛程式 DaemonSet 正在執行。
kubectl get daemonset -n kube-system efa-aws-efa-k8s-device-pluginNAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE efa-aws-efa-k8s-device-plugin 2 2 2 2 2 <none> 60s -
確認您的節點具有可分配的 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 -
若要使用裝置外掛程式請求 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: ...