

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# Amazon EKS でハードウェアデバイスを管理する
<a name="device-management"></a>

Amazon EKS は、EKS クラスターで特殊なハードウェアデバイスを管理できるように、*動的リソース割り当て (DRA)* と*デバイスプラグイン*という 2 つの Kubernetes メカニズムをサポートしています。どちらも、ワークロードが NVIDIA GPU や AWS Trainium チップなどのハードウェアアクセラレーターや、Elastic Fabric Adapter (EFA) などのハイパフォーマンスネットワークデバイスにアクセスできるようにするメカニズムです。DRA は豊富なデバイス選択、トポロジー認識スケジューリング、デバイス共有といったデバイスプラグインにはない機能を備えているため、Kubernetes バージョン 1.34 以降で EKS マネージドノードグループまたはセルフマネージドノードグループを使用して新たにデプロイする場合は DRA ドライバーを使用することをお勧めします。

この 2 つの Kubernetes 機能に関する全般的な情報については、[動的リソース割り当て](https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/) と [デバイスプラグイン](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/) に関する Kubernetes ドキュメントを参照してください。

## 動的リソース割り当てとデバイスプラグインの比較
<a name="_dynamic_resource_allocation_vs_device_plugins"></a>

Kubernetes デバイスプラグインは、これまで特殊なハードウェアを Kubernetes ワークロードに公開する際に第一に使用されてきたメカニズムです。ユーザーからのコンテナリソースのリクエストや制限を受けて、デバイスを拡張リソース (`nvidia.com/gpu` や `aws.amazon.com/neuroncore` など) としてアドバタイズします。広くサポートされ、使用されていますが、次のような制限があります。
+ デバイスは、属性ベースのフィルタリングがない不透明な整数カウントとしてリクエストされます。
+ コンテナまたはポッド間でデバイスを共有する機能はサポートされていません。
+ トポロジー認識割り当てをデバイスタイプ全体で表現力豊かに行う機能はありません。
+ インテリジェントに配置するには、多くの場合、カスタムスケジューラ拡張機能が必要です。

動的リソース割り当て (DRA) は、これらの制限に対処するために Kubernetes バージョン 1.34 で一般公開された Kubernetes 機能です。DRA により、デバイスドライバーは `ResourceSlice` オブジェクトを介して豊富なデバイス属性を Kubernetes スケジューラに発行します。デバイスをリクエストするには、`DeviceClass` カテゴリを参照する `ResourceClaim` オブジェクトおよび `ResourceClaimTemplate` オブジェクトを使用します。

DRA では次のことが可能になります。
+ [Common Expression Language (CEL)](https://kubernetes.io/docs/reference/using-api/cel/) 式を使用して属性ベースでデバイスを選択する。
+ トポロジ認識割り当てにより、複数のデバイスが同じ PCIe スイッチまたは NUMA ドメインに共存できるようになる。
+ `ResourceClaim` リファレンスを共有することで、複数のコンテナやポッド間でデバイスを共有する。
+ さまざまなデバイスタイプに合わせて制約ベースでスケジュールする。

## 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)) は、EFA インターフェイスをトポロジー的にローカルな GPU または Neuron デバイスとペアリングするトポロジー認識スケジューリングを使用して Elastic Fabric Adapter (EFA) デバイスの割り当てを管理し、ポッド間でのデバイス共有をサポートします。詳細については、「[Amazon EKS で EFA デバイスを管理する](device-management-efa.md)」を参照してください。

Neuron DRA ドライバー  
Neuron DRA ドライバーは、トポロジー認識スケジューリング、コネクテッドデバイスサブセット割り当て、Logical NeuronCore (LNC) 設定により、AWS Trainium と AWS Inferentia2 のデバイス割り当てを管理します。カスタムスケジューラ拡張機能は必要ありません。

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` の詳しい使用方法については、[Amazon EKS で P6e-GB200 UltraServer を使用する](ml-eks-nvidia-ultraserver.md) を参照してください。

## Amazon EKS 用のデバイスプラグイン
<a name="_device_plugins_for_amazon_eks"></a>

次のデバイスプラグインは、Amazon EKS クラスターで特殊なハードウェアデバイスを管理する場合によく使用されます。

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 自動モードでプロビジョニングされたコンピューティングと互換性がありません。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 オートモードを使用する場合は、引き続きデバイスプラグインを使用してください。NVIDIA DRA ドライバーは Bottlerocket ではサポートされていません。Bottlerocket ノードでは NVIDIA デバイスプラグインを使用してください。EFA DRA ドライバーと Neuron DRA ドライバーは Bottlerocket でサポートされています。

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

DRA を使用する場合は、`ResourceClaim` オブジェクトまたは `ResourceClaimTemplate` オブジェクトを使用してデバイスをリクエストします。これらの 2 つのリソースタイプは、目的も異なれば、ライフサイクルの動作も異なります。

ResourceClaim  
`ResourceClaim` は、いずれのポッドからも独立して作成する名前付き Kubernetes オブジェクトです。`resourceClaimName` フィールドを使用してポッド仕様で名前で参照します。`ResourceClaim` には以下の特徴があります。  
+ ポッドで参照するには、ポッドの作成前にクラスターに存在している必要があります。クレームが存在しない場合、ポッドは保留状態のままになります。
+ ポッドで参照しているかどうかに関係なく、明示的に削除するまで保持されます。
+ 複数のポッドで同じ `ResourceClaim` を参照できるため、デバイス共有が可能です。同じクレームを参照するすべてのポッドで、割り当てられた同じデバイスへのアクセスを共有し、同じノードにスケジュールされます。

  `ResourceClaim` は、複数のポッドで同じデバイスへのアクセスを共有する必要がある場合や、単一のポッドのライフタイムを超えてクレームを保持する必要がある場合に使用します。

ResourceClaimTemplate  
`ResourceClaimTemplate` は、各ポッドの固有の `ResourceClaim` を Kubernetes で自動的に生成するために使用するテンプレートを定義します。`resourceClaimTemplateName` フィールドを使用してポッド仕様で参照します。`ResourceClaimTemplate` 自体はいずれのポッドにもバインドされません。個別に保持される再利用可能なテンプレートです。`ResourceClaimTemplate` には以下の特徴があります。  
+ テンプレートを参照するポッドごとに、新しい `ResourceClaim` が Kubernetes で作成されます。各ポッドに独自のデバイスのセットが割り当てられます。
+ 生成された `ResourceClaim` は、作成をトリガーしたポッドのライフサイクルにそれぞれバインドされます。ポッドが削除されると、それに関連する生成された `ResourceClaim` も削除されます。`ResourceClaimTemplate` 自体に影響はなく、以降のポッドに対する新しいクレームの生成に引き続き使用されます。

  `ResourceClaimTemplate` は、ワークロードの各ポッドに同様の設定を持つ独自の専用デバイスが必要な場合に使用します。例えば、各ポッドに独自の GPU デバイスまたは EFA デバイスが必要な並列実行を使用するジョブでは、ポッドに `ResourceClaimTemplate` を使用します。

次の表は、`ResourceClaim` と `ResourceClaimTemplate` の違いをまとめたものです。


| 行動 | ResourceClaim | ResourceClaimTemplate | 
| --- | --- | --- | 
| 作成 | ポッドで参照する前に手動で作成します。 | ポッドごとに Kubernetes で自動的にクレームが生成されます。 | 
| ライフサイクル | 削除するまで保持されます。 | テンプレートは削除するまで保持されます。生成された `ResourceClaim` は、作成をトリガーしたポッドにそれぞれバインドされます。 | 
| ポッド間でのデバイス共有 | サポート対象。複数のポッドで同じクレームを参照できます。 | サポート外。各ポッドに個別のクレームが割り当てられます。 | 
| ポッド仕様のフィールド |  `resourceClaimName`  |  `resourceClaimTemplateName`  | 

`ResourceClaim` オブジェクトを使用してポッド間で EFA デバイスを共有する例については、「[複数のポッド間で 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) 