GKE でのリソースの動的割り当てについて


このページでは、Google Kubernetes Engine(GKE)の動的リソース割り当て(DRA)について説明します。このページでは、DRA の基本、GKE での動作、DRA を使用して GPU や TPU などのハードウェアを割り当てるメリットについて説明します。

このページは、次のような方を対象としています。

このページを読む前に、次のリソースについてよく理解しておいてください。

DRA の概要

DRA は Kubernetes の組み込み機能で、クラスタ内のハードウェアを Pod とコンテナ間で柔軟にリクエストして割り当て、共有できます。 DRA は、デバイス ベンダーとプラットフォーム管理者がリクエストと割り当てが可能なデバイスのクラスを宣言できるようにすることで、アクセラレータなどの接続されたハードウェアの割り当てのエクスペリエンスを改善します。アプリ オペレーターは、これらのクラス内で特定のデバイス構成をリクエストし、ワークロードでこれらの構成をリクエストできます。Kubernetes と GKE は、ワークロード リクエストに基づいて Pod のスケジューリング、ノードの割り当て、デバイスの割り当てを管理します。

たとえば、プラットフォーム管理者は NVIDIA A100 GPU のみを含むデバイスクラスを定義できます。アプリ オペレーターは、ワークロード要件に基づいて、そのデバイスクラスのデバイスをフィルタできます。たとえば、GPU メモリが 80 GB 以上のデバイスをフィルタできます。アプリ オペレーターがフィルタされた構成をリクエストするワークロードをデプロイすると、GKE は選択された条件を満たすノードに Pod を配置します。この例では、GKE は使用可能な A100(80 GB)GPU を持つノードを検索します。ワークロード マニフェストで特定のノードやデバイス構成を選択する必要はありません。

DRA のメリット

DRA がない場合、Kubernetes でのハードウェア デバイスの割り当てはデバイス プラグインに依存します。デバイス プラグインを使用してハードウェア リソースを Pod に接続するには、ノードラベルを使用して Pod を特定のノードに配置します。また、ノードのリソース全体を単一の Pod に割り当てるには、ノードに接続されているデバイスの正確な数をリクエストします。

DRA を使用すると、Pod へのデバイスの割り当ては、ストレージのボリュームの割り当てと同様になります。デバイスのクラスを定義し、そのクラス内のデバイスをリクエストして、リクエストされたデバイスをワークロードに割り当てます。DRA は、ワークロードとビジネスニーズに基づいてデバイスをフィルタするための、大幅に拡張可能なサーフェスを提供します。式とテンプレートを使用してハードウェアを要求し、Pod をスケジュールする DRA アプローチには、次のメリットがあります。

  • 宣言型デバイス割り当て: プラットフォーム管理者は、特定のタイプのワークロードまたはチームのデバイス構成を定義できます。
  • チーム間の複雑さの軽減: プラットフォーム管理者が特殊なハードウェア構成を持つノードをプロビジョニングする場合、アプリ オペレーターは特定の構成を持つノードを把握する必要がありません。プラットフォーム管理者は、ノードにラベルを付けたり、特定のノードとデバイスに関する情報をオペレーターに伝達したりする必要はありません。
  • デベロッパーの複雑さの軽減: Kubernetes は、参照するデバイス構成に基づいて Pod をスケジュールします。アプリ オペレーターは、ワークロードで特定のノードを選択する必要がなく、各 Pod がこれらのノードに接続されているデバイスの数を正確にリクエストする必要もありません。
  • 一元化されたインフラストラクチャ管理: プラットフォーム管理者は、特定のビジネス要件を満たすハードウェア構成を一元的に定義できます。たとえば、プラットフォーム管理者は、Tesla T4 GPU を搭載した小規模な推論構成と、H100 GPU を搭載した高性能構成を宣言できます。
  • 柔軟なハードウェア選択: DRA では、CEL 式を使用して特定の属性を持つデバイスをフィルタできます。式を使用すると、特定のワークロードに最適なデバイスを柔軟にフィルタできます。

DRA を使用する場面

プレビュー中に GKE で DRA を使用する主な理由は、ワークロードのデバイスを柔軟にリクエストできる点です。一度マニフェストを作成すれば、マニフェストを変更することなく、異なるデバイスタイプの異なるクラスタにワークロードをデプロイできます。この柔軟性は、次のようなユースケースに最適です。

  • GPU の取得可能性を向上させる: GPU ハードウェアへのアクセスを必要とするワークロードの場合、GPU モデルを指定する代わりに、DRA を使用してクラスタ内の利用可能な任意の GPU をリクエストできます。これらのワークロードに特定の GPU メモリ(VRAM)要件がある場合は、最小メモリ量を備えたクラスタ内の任意の GPU をリクエストできます。このタイプの柔軟なリクエストにより、ワークロードが実行できる GPU ノードのセットが拡張され、リソースが使用できないためにワークロードがスケジュールされないリスクが軽減されます。
  • スケーリング中に GPU ノードの可用性を最適化する: ワークロードに必要なアタッチされた GPU の数は、GPU のタイプによって異なる場合があります。GKE のコンピューティング クラスを使用すると、GPU の可用性、割り当て、容量予約に基づいてノードをプロビジョニングできます。ワークロードで DRA を使用して、コンピューティング クラス用に GKE がプロビジョニングするノードで Pod を実行するように構成できます。コンピューティング クラスで DRA を使用すると、ワークロードが最適化されたハードウェアで実行されるようにしつつ、スケジュールされていないワークロードのリスクを最小限に抑えることができます。

用語

オープンソースの Kubernetes と GKE などのマネージド Kubernetes プロバイダでは、次の DRA 用語を使用します。

ResourceSlice
ResourceSlice は、ノードがアクセスできるクラスタ内の 1 つ以上のハードウェア デバイスの一覧を表示します。たとえば、単一の GPU にアクセスできるノードでは、ResourceSlice に GPU とノードの名前が一覧で表示されます。各ノードの DRA デバイス ドライバは、ResourceSlice を作成します。Kubernetes スケジューラは、ResourceSlice を使用して、ワークロード リクエストを満たすために割り当てるデバイスを決定します。
DeviceClass
DeviceClass は、ワークロードにリクエストできるデバイスのカテゴリ(GPU など)を定義します。一部のデバイス ドライバには、NVIDIA GPU の gpu.nvidia.com DeviceClass などの組み込み DeviceClass が用意されています。プラットフォーム管理者は、特定のデバイス構成を定義するカスタム DeviceClass を作成することもできます。
ResourceClaim

ResourceClaim を使用すると、Pod またはユーザーは DeviceClass 内の特定のパラメータをフィルタして、ハードウェア リソースをリクエストできます。ワークロードが ResourceClaim を参照すると、Kubernetes は指定されたパラメータに一致するデバイスをその ResourceClaim に割り当てます。

たとえば、1 つの A100(40 GB)GPU の ResourceClaim を作成し、その ResourceClaim を選択するワークロードをデプロイするシナリオを考えてみましょう。Kubernetes は、使用可能な A100(40 GB)GPU を ResourceClaim に割り当て、その GPU にアクセスできるノードに Pod をスケジュールします。

ResourceClaimTemplate

ResourceClaimTemplate は、Pod ごとの新しい ResourceClaim を自動的に作成するために Pod が使用できるテンプレートを定義します。ResourceClaimTemplate は、同様のデバイス構成にアクセスする必要がある複数のワークロードがある場合、特に、Deployment や StatefulSet などのワークロード コントローラを使用する場合に便利です。

アプリ オペレーターは ResourceClaimTemplates をデプロイし、ワークロードでテンプレートを参照します。Kubernetes は、指定されたテンプレートに基づいて各 Pod の ResourceClaim を作成し、デバイスを割り当てて Pod をスケジュールします。Pod が終了すると、Kubernetes は対応する ResourceClaim をクリーンアップします。

DRA の仕組み

クラスタとワークロードで DRA を使用することは、StorageClass、PersistentVolumeClaim、PersistentVolume を使用して Pod のボリュームを動的にプロビジョニングすることと似ています。

次の図は、クラスタ管理者とアプリ オペレーターが DRA を使用してデバイスを割り当てる手順を示しています。

この図では、クラスタ管理者とアプリ オペレーターは次の操作を行います。

  1. クラスタ管理者は、DRA をサポートするデバイス ドライバをノードにインストールします。
  2. クラスタ管理者は、40 GB を超えるメモリを搭載したすべての GPU など、特定の要件を満たすハードウェアをフィルタする DeviceClass を作成します。一部のデバイスには、組み込みの DeviceClass が含まれている場合があります。
  3. アプリケーション オペレーターは、デバイス構成をリクエストする ResourceClaimTemplates または ResourceClaims を作成します。各タイプのクレームの主なユースケースは次のとおりです。
    • ResourceClaim を使用すると、複数の Pod が同じデバイスへのアクセスを共有できます。
    • ResourceClaimTemplate を使用すると、Pod ごとの ResourceClaim を自動的に生成することで、複数の Pod が個別の類似デバイスにアクセスできます。
  4. アプリケーション オペレーターは、ResourceClaimTemplates または ResourceClaims をワークロード マニフェストに追加します。
  5. アプリケーション オペレーターは、ワークロードをデプロイします。

ResourceClaimTemplate または ResourceClaim を参照するワークロードをデプロイすると、Kubernetes は次のスケジューリング手順を実行します。

  1. ワークロードが ResourceClaimTemplate を参照している場合、Kubernetes はワークロードのインスタンス(Deployment の各レプリカなど)ごとに新しい ResourceClaim オブジェクトを作成します。
  2. Kubernetes スケジューラは、クラスタ内の ResourceSlice を使用して、使用可能な対象デバイスを各 Pod の ResourceClaim に割り当てます。
  3. スケジューラは、Pod の ResourceClaim に割り当てられたデバイスにアクセスできるノードに各 Pod を配置します。
  4. 宛先ノードの kubelet は、ノード上の DRA ドライバを呼び出して割り当てられたハードウェアをリソース リクエストに応じて Pod に接続します。

ResourceClaim と ResourceClaimTemplate を使用する場面

ResourceClaim と ResourceClaimTemplate のいずれも、特定の要件を満たすデバイスが必要であることを Kubernetes に示すことができます。ResourceClaim が Pod で参照されると、Kubernetes は Kubernetes API サーバーの対応する ResourceClaim API リソースにデバイスを割り当てます。この割り当ては、ResourceClaim を作成したのがユーザーか、Kubernetes が ResourceClaimTemplate から ResourceClaim を作成したかに関係なく行われます。

ResourceClaim を作成して複数の Pod で参照すると、これらの Pod はすべて、Kubernetes が ResourceClaim に割り当てたデバイスにアクセスできます。たとえば、複数のレプリカを持つ Deployment マニフェストで特定の ResourceClaim を参照する場合、この共有アクセスが発生する可能性があります。しかし、割り当てられたデバイスが複数のプロセスで共有されるように構成されていない場合、Pod 間で共有デバイス アクセスにより意図しない動作が発生する可能性があります。

ResourceClaimTemplate を使用すると、Kubernetes が Pod の個々の ResourceClaim を自動的に作成するために使用するテンプレートを定義できます。たとえば、複数のレプリカを持つ Deployment で ResourceClaimTemplate を参照すると、Kubernetes は複製された Pod ごとに個別の ResourceClaim を作成します。その結果、各 Pod はデバイスへのアクセスを他の Pod と共有せず、独自の割り当てデバイスを取得します。自動生成されたこれらの ResourceClaim は、対応する Pod のライフタイムにバインドされ、Pod が終了すると削除されます。同様のデバイス構成にアクセスする必要がある独立した Pod がある場合は、ResourceClaimTemplate を使用して、各 Pod にデバイスを個別に割り当てます。

次の表は、ResourceClaim を手動で作成する場合と、Kubernetes が ResourceClaimTemplate から ResourceClaim を作成する場合の違いを示しています。

手動で作成した ResourceClaim 自動作成した ResourceClaim
自分で管理 Kubernetes が管理
複数の Pod から同じデバイスへのアクセスを提供 単一の Pod からデバイスへのアクセスを提供
Pod とは独立してクラスタ内に存在 対応する Pod のライフサイクルにバインド
特定のデバイスを共有する必要がある複数のワークロードに最適 独立したデバイス アクセスを必要とする複数のワークロードに最適

DRA と手動デバイス割り当ての比較

DRA を使用すると、接続されたデバイスの割り当てを、PersistentVolume の動的プロビジョニングと同様の方法で行えます。Kubernetes では、デバイス プラグインを使用してデバイスを割り当てることもできます。この方法では、次の手順で操作します。

  1. クラスタ管理者は、GPU などのデバイスが接続されたノードを作成します。
  2. クラスタ管理者は、特定のノードとその接続デバイスに関する情報をワークロード オペレーターに伝えます。
  3. ワークロード オペレーターは、ワークロード マニフェストで次のようにデバイスをリクエストします。
    • nodeSelector フィールドを使用して、GPU モデルや TPU のタイプとトポロジなど、必要なデバイス構成を持つノードを選択します。
    • Pod 仕様の resources フィールドを使用して、コンテナが使用するデバイスの正確な数を指定します。

この手動割り当て方法では、アプリケーション オペレーターとクラスタ管理者が、特定のノードまたはノードプールに特定のデバイス構成があるかどうかについて連携する必要があります。ワークロード リクエストを調整してノード上のデバイスと一致させる必要があります。一致しない場合、デプロイは失敗します。これに対し、DRA では式を使用して属性に基づいてデバイスを柔軟にフィルタできます。また、ワークロード オペレーターがクラスタ内のノードの正確な構成を把握する必要もありません。

次の表は、DRA とデバイス プラグインを比較したものです。

DRA 手動割り当て
CEL 式を使用した柔軟なデバイス選択 セレクタとリソース リクエストを使用した特定のノードの選択
Kubernetes によるスケジューリングの決定 オペレーターがノードセレクタを使用して行うスケジューリングの決定
デバイスのフィルタリングはワークロードの作成とは別に行う デバイス フィルタリングはワークロード マニフェストで行う
プラットフォーム管理者が管理する、デバイスの集中型フィルタリングとニーズベースのクラス アプリケーション オペレーターによる分離されたデバイスのフィルタリング
アプリ オペレーターは、ノード容量、ノードラベル情報、各ノードに接続されているデバイスモデルを把握する必要はない アプリ オペレーターは、特定のモデルと特定のデバイスの数量が接続されているノードを把握する必要がある

DRA でサポートされている GKE デバイス

DRA を使用して、GPU または TPU を GKE ワークロードに割り当てることができます。GKE がサポートする GPU モデルと TPU モデルは、どれでも割り当てることができます。GKE でサポートされている GPU と TPU の詳細については、次のリソースをご覧ください。

GKE での DRA の制限事項

GKE クラスタでは、DRA に次の制限があります。

  • ノード自動プロビジョニングで DRA を使用することはできません。
  • 次の GPU 共有機能では DRA を使用できません。
    • タイム シェアリング GPU。
    • マルチインスタンス GPU。
    • マルチプロセス サービス(MPS)。
  • Autopilot クラスタで DRA を使用することはできません。
  • GKE バージョン 1.32.1-gke.1489001 以降を使用する必要があります。

このセクションでは、DRA を使用してデバイスをワークロードに割り当てるプラットフォーム管理者またはアプリ オペレーター向けの推奨事項について説明します。DRA は、GKE と Kubernetes の両方で、接続されたデバイスをリクエストする方法を大きく変更します。クロスデバイス フォールバックやデバイスのきめ細かいフィルタリングと選択など、より高度なユースケースを活用するには、次のガイダンスを検討してください。

スケーリング中のノードの可用性を向上させる

GKE の ComputeClass を使用すると、クラスタに新しいノードを作成するときに GKE が従う優先度ベースのフォールバック動作を定義できます。ComputeClass を使用すると、GKE がワークロードを実行するノードを作成するときに使用する、優先順位付けされたノードとデバイスの構成を構成できます。DRA を使用すると、ラベルでノードを手動で選択しなくても、ComputeClass 内の任意のノードでワークロードを実行できます。

たとえば、ワークロードを最適に実行するには、2 つの NVIDIA L4 GPU または 1 つの NVIDIA A100(40 GB)GPU が必要になる場合があります。1 つの A100(40 GB)GPU を使用したノードの作成を優先しつつ、ノードあたり 2 つの L4 GPU を使用したノードの作成にフォールバックできる ComputeClass を作成できます。その後、DRA を使用して、ワークロードに使用可能な GPU をリクエストできます。ワークロードをデプロイしてその ComputeClass を選択すると、GKE は指定された GPU 構成のいずれかを持つノードを作成します。DRA を使用すると、GKE は GPU モデル、ノードラベル、GPU の数に関係なく、最初に使用可能なノードにワークロードを配置できます。

詳細については、次のページをご覧ください。

次のステップ