【正解】D
【0からの解説】
①前提知識:GKE Autopilot は、ノードやノードプールの作成・管理を Google が行うモードです。利用者は Pod のマニフェストで必要なリソースやハードウェアの種類を宣言するだけで、それに合うノードを GKE が自動でプロビジョニングします。
・コンピューティング クラス(ComputeClass):Autopilot で Pod が実行されるノードのハードウェア特性を選ぶ仕組みです。例えば Scale-Out クラスは、シングルスレッドのスケールアウト型ワークロード向けで、arm64 を指定すると Arm ベースの Tau T2A マシンシリーズのノードが使われます(Performance クラスや autopilot-arm クラスなどでも Arm を選べます)。
・Arm を要求する方法:Pod の nodeSelector(またはノード アフィニティ)に cloud.google.com/compute-class: Scale-Out と kubernetes.io/arch: arm64 を指定します。Autopilot はこれを見て Arm ノードを自動作成し、そのノードに taint を、Pod に対応する toleration を自動で付与します(なお、コンテナ イメージは Arm 用にビルドされている必要があります)。
②要件の整理:「Autopilot クラスタ」「Arm CPU のノードで Pod を実行」「現在 Arm ノードはない」「クラスタの運用作業を最小限に」。
③正解の理由:D のようにマニフェストで Scale-Out コンピューティング クラスと arm64 アーキテクチャをリクエストするだけで、Autopilot が Arm ノードを自動で用意して Pod を配置します。ノードプールの作成や taint の管理は不要で、運用作業は最小です。GKE の公式ドキュメント「Arm アーキテクチャに Autopilot ワークロードをデプロイする」で示されている方法そのものです(新しい GKE バージョンでは kubernetes.io/arch: arm64 のみの指定や autopilot-arm クラスでも要求できるようになっていますが、選択肢の中で正しく Arm ノードを要求できるのは D だけです)。
【誤りの選択肢】
A:toleration は「taint の付いたノードにも配置されてよい」と許可するだけの設定で、「特定のノード以外に配置しない」と要求する機能ではありません。Arm ノードがまだ存在しない状況で toleration を付けても、Arm ノードは作成されず、Pod が Arm ノードに配置される保証もありません。
B:Autopilot ではノードプールを利用者が管理しないため、ノードプールに taint を付けるという操作自体が前提に合いません。また taint は「その他の Pod を締め出す」仕組みであり、そもそも Arm ノードが無ければ意味がありません。
C:Standard モードの新クラスタを作り、Arm ノードプールを自分で用意すれば技術的には動きますが、クラスタの新規作成、ノードプールの設計・運用(アップグレード、スケーリング)といった作業が大幅に増えます。「クラスタの運用作業を最小限に」という要件に反し、既存の Autopilot クラスタでマニフェストに数行加えるだけで済む D に劣ります。
【参考】
Arm アーキテクチャに Autopilot ワークロードをデプロイする | Google Kubernetes Engine (GKE)Autopilot Pod のコンピューティング クラスを選択する | Google Kubernetes Engine (GKE)