Arm アーキテクチャに Autopilot ワークロードをデプロイする

このページでは、Arm アーキテクチャに基づくノードをリクエストするために Google Kubernetes Engine(GKE)Autopilot デプロイメントを構成する方法について説明します。

Autopilot の Arm アーキテクチャについて

Autopilot クラスタは、特定のハードウェア要件があるワークロード用のコンピューティング クラスを提供します。こうしたコンピューティング クラスの中には、amd64 や arm64 など複数の CPU アーキテクチャをサポートするものがあります。

Arm ノードのユースケース

Arm アーキテクチャを使用したノードは、同様の x86 ノードよりも費用対効果の高いパフォーマンスを提供します。次のような状況では、Autopilot ワークロードに Arm を選択する必要があります。

  • 環境では、ビルドとテストに Arm アーキテクチャが使用されている。
  • Arm CPU 上で動作する Android デバイス向けのアプリケーションを開発している。
  • マルチアーキテクチャ イメージを使用しており、ワークロードの実行中に費用を最適化する必要がある。

始める前に

作業を始める前に、次のタスクが完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API を有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化します。gcloud CLI をインストール済みの場合は、gcloud components update コマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。

要件

  • autopilot-arm ComputeClass を使用するには、クラスタで GKE バージョン 1.35.3-gke.1389000 以降が実行されていることを確認します。
  • Autopilot ComputeClass を使用する GKE Standard クラスタで、スマート デフォルト(kubernetes.io/arch: arm64 ラベルのみを指定)、autopilot-arm-spot ComputeClass、autopilot-arm ComputeClass などの機能を使用するには、クラスタでバージョン 1.36.0-gke.3302001 以降を実行する必要があります。
  • C4A、N4A、または Tau T2A Compute Engine マシンタイプの割り当てがあることを確認します。
  • Arm アーキテクチャ用に構築されたコンテナ イメージを含む Pod があることを確認します。

Autopilot で Arm ノードをリクエストする方法

Arm ノードで Pod を実行するように Autopilot に指示するには、nodeSelector またはノード アフィニティ ルールを使用して、次のいずれかのセレクタ(GKE のタイプとバージョンによって異なる)を指定します。

  • Autopilot クラスタ(スマート デフォルト)の場合: アーキテクチャ タイプのみを指定します。

    • kubernetes.io/arch: arm64

    ワークロードが Autopilot クラスタで実行されている場合、汎用 Arm プラットフォームが選択されます。

  • Autopilot クラスタまたは Autopilot ComputeClass を使用する Standard クラスタ(ComputeClass のみ)の場合: ComputeClass を指定します。

    • cloud.google.com/compute-class: autopilot-arm(または autopilot-arm-spot)

    このクラスを選択すると、コンテナ最適化 Arm プラットフォーム(またはその Spot VM バリアント)でワークロードがスケジュールされ、アドミッション時に必要な kubernetes.io/arch: arm64 セレクタが Pod に自動的に追加されます。

  • 明示的な選択(古い GKE バージョン): バージョン 1.35.3-gke.1389000 以降 1.36.0-gke.3302001 より前の Autopilot クラスタでは、次の両方のセレクタを指定して、汎用 Arm プラットフォームを選択します。この組み合わせは、下位互換性を確保するために、新しい GKE バージョンでもサポートされています。

    • cloud.google.com/compute-class: autopilot-arm
    • kubernetes.io/arch: arm64
  • 特定のハードウェア要件があるワークロードの場合: 次のいずれかを指定します。

    • Standard クラスタの kubernetes.io/arch: arm64。GKE はデフォルトで、Pod を C4A マシンタイプに配置します。
    • cloud.google.com/machine-family: ARM_MACHINE_SERIES。 ARM_MACHINE_SERIES を Arm マシンシリーズ(C4A、N4A、T2A など)に置き換えます。GKE は、指定されたシリーズに Pod を配置します。

デフォルトでは、Performance 以外のラベルを使用すると、そのノードに使用可能な容量がある場合に、GKE は他の Pod を同じノードに配置します。Pod ごとに専用のノードをリクエストするには、アーキテクチャまたはマシン ファミリーのラベルとともに、マニフェストに cloud.google.com/compute-class: Performance ラベルを追加します。詳細については、マシンシリーズを選択して Autopilot Pod のパフォーマンスを最適化するをご覧ください。

また、arm64 ラベルと Scale-Out ラベルを使用して T2A をリクエストすることもできます。Spot Pod 用に Arm アーキテクチャをリクエストすることもできます。

ワークロードをデプロイすると、Autopilot は次の処理を行います。

  1. Arm ノードを自動的にプロビジョニングして Pod を実行します。
  2. 新しいノードを自動的に taint し、非 Arm Pod がそれらのノードでスケジュールされないようにします。
  3. Arm Pod に toleration を自動的に追加して、新しいノードでのスケジューリングを可能にします。

Arm アーキテクチャのリクエストの例

次の例の仕様は、ノードセレクタまたはノード アフィニティ ルールを使用して Autopilot で Arm アーキテクチャをリクエストする方法を示しています。

nodeSelector

次のマニフェストの例では、スマート デフォルトを使用して Autopilot コンテナ最適化 Arm ノードをリクエストしています。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-arm
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-arm
  template:
    metadata:
      labels:
        app: nginx-arm
    spec:
      nodeSelector:
        kubernetes.io/arch: arm64
      containers:
      - name: nginx-arm
        image: nginx
        resources:
          requests:
            cpu: 2000m
            memory: 2Gi

または、autopilot-arm(Spot VM の場合は autopilot-arm-spot)ComputeClass を明示的に指定して、コンテナ最適化 Arm プラットフォームをリクエストすることもできます。

...
    spec:
      nodeSelector:
        cloud.google.com/compute-class: autopilot-arm
...

Autopilot コンテナ最適化ノードではなく特定のハードウェアをリクエストするには、ComputeClass を置き換えるか、セレクタに cloud.google.com/machine-family: C4A を追加します。

nodeAffinity

ノード アフィニティを使用して Arm ノードをリクエストできます。

次のマニフェストの例では、スマート デフォルトを使用して Autopilot コンテナ最適化 Arm ノードをリクエストしています。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-arm
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-arm
  template:
    metadata:
      labels:
        app: nginx-arm
    spec:
      terminationGracePeriodSeconds: 25
      containers:
      - name: nginx-arm
        image: nginx
        resources:
          requests:
            cpu: 2000m
            memory: 2Gi
            ephemeral-storage: 1Gi
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - arm64

Autopilot コンテナ最適化ノードではなく特定のハードウェアをリクエストするには、kubernetes.io/arch を特定のマシン ファミリー アフィニティ ルールまたは Performance や Scale-Out などのリクエスト クラスに置き換えます。

推奨事項

  • パイプラインの一部としてマルチアーキテクチャ イメージをビルドして使用する。マルチアーキテクチャ イメージを使用すると、Pod が x86 ノードに配置されている場合でも Pod が確実に実行されます。
  • ワークロードのマニフェストでアーキテクチャおよびコンピューティング クラスを明示的にリクエストします。そうしないと、Autopilot は、選択したコンピューティング クラスのデフォルト アーキテクチャを使用します(Arm ではない可能性があります)。

対象

次のリージョンでは、Arm アーキテクチャに Autopilot ワークロードをデプロイできます。us-east1、us-west1、europe-west1、europe-west2、europe-west4、asia-southeast1、us-central1。

トラブルシューティング

一般的なエラーとトラブルシューティング情報については、Arm ワークロードのトラブルシューティングをご覧ください。

次のステップ