Arm ワークロード用のマルチアーキテクチャ イメージのビルド


このページでは、マルチアーキテクチャ イメージの概要、ノードとコンテナ イメージのアーキテクチャが重要である理由、マルチアーキテクチャ イメージが GKE クラスタにワークロードを簡単にデプロイできる理由について説明します。また、このページでは、ワークロードが Arm 上で実行可能かどうかを確認する方法と、マルチアーキテクチャ イメージをビルドする方法についても説明します。

マルチアーキテクチャ イメージを使用して、複数のアーキテクチャをデプロイする方法のチュートリアルについては、GKE 上の x86 アプリケーションを Arm でマルチアーキテクチャに移行するをご覧ください。

マルチアーキテクチャ イメージとは

マルチアーキテクチャ イメージは、複数のアーキテクチャをサポートできるイメージのことです。単一のタグを持つ単一のイメージのように見えますが、マニフェスト リストで編成され、複数のアーキテクチャを対象とするイメージのリストです。マルチアーキテクチャ イメージは、Docker Image Manifest V2 Scheme 2 または OCI Image Index Specifications に対応しています。GKE では、マルチアーキテクチャ イメージをクラスタにデプロイすると、デプロイ先のノードのアーキテクチャに対応する適切なイメージが自動で選択されます。ワークロードのマルチアーキテクチャ イメージがあれば、このワークロードを複数のアーキテクチャにシームレスにデプロイできます。

マルチアーキテクチャ イメージは、複数のアーキテクチャで同じワークロードを使用する場合に最も役立ちます。また、1 つのアーキテクチャで任意のタイプの GKE ノードを含むコンテナ イメージを使用することもできます。1 つのアーキテクチャでのみワークロードを使用していて、対応しているイメージがすでにある場合は、マルチアーキテクチャ イメージをビルドする必要はありません。

Arm 互換のシングルアーキテクチャ イメージまたはマルチアーキテクチャ イメージを使用していて、それを Arm ノードにデプロイする場合は、GKE が期待どおりにワークロードをスケジュールするように、指示に従って必要なフィールドを含める必要があります。詳細については、デプロイする Arm ワークロードを準備するをご覧ください。ワークロードを x86 ベースのノードにのみスケジュールする場合は、これらのフィールドを追加してワークロードをスケジュールする必要はありません。

GKE ノードのアーキテクチャがワークロードにとって重要である理由

GKE ノードは、GKE がユーザーに代わって作成して管理する個々の Compute Engine VM インスタンスです。各ノードは、x86(Intel または AMD)または Arm プロセッサを使用する標準マシンタイプ(t2a-standard-1 など)です。詳細については、CPU プラットフォームをご覧ください。

コンテナ イメージは、ワークロードを実行するノードのアーキテクチャと互換性のあるものを使用する必要があります。たとえば、arm64 アーキテクチャでコンテナ イメージを実行する場合は、Tau T2A マシンシリーズt2a-standard-1 など、Arm ワークロードをサポートするマシンタイプが必要です。1 つの GKE クラスタで複数のアーキテクチャ タイプのノードを使用できます。1 つのワークロードを複数のアーキテクチャ タイプで使用する場合は、アーキテクチャ固有のイメージのすべてのコンテナ イメージとデプロイ ファイルを整理しておく必要があります。マルチアーキテクチャ イメージを使用すると、複数のアーキテクチャ タイプにわたるデプロイ プロセスが簡素化されます。

x86 ノードと Arm ノードにデプロイするマルチアーキテクチャ イメージをビルドする

以下の手順は、次のものがすでに用意されたアプリ デベロッパーを対象にしています。

  • ダウンロード済みのコンテナツール(Docker など)を備えたビルド環境
  • 既存のコンテナ イメージを 1 つ。

以下のコマンドでは Docker を使用しますが、他のコンテナツールを使用して同じ作業を行うこともできます。

ワークロードが Arm に対応できているか

既存のコンテナ イメージがある場合は、このワークロードが Arm ノードで実行可能かどうかを確認できます。以降のセクションでは、docker run を使用して Arm アーキテクチャでコンテナの実行を試みる方法について説明します。

x86 環境で Docker を準備してコンテナ イメージを確認する

Docker を x86 環境で実行している場合、arm64 コンテナ イメージを実行するには、追加のパッケージをダウンロードする必要があります。この手順ではパッケージ管理に apt を使用しますが、お使いの環境のパッケージ管理システムを使用して必要なパッケージをダウンロードできます。

Docker を Arm 環境で実行している場合、このセクションはスキップできます。

次のコマンドでは、お使いのマシンがサポートしていないアーキテクチャ用のパッケージをダウンロードし、QEMU を binfmt インタープリタとして登録します。

sudo apt-get install qemu binfmt-support qemu-user-static
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

binfmt インタープリタを設定したら、x86 環境で arm64 イメージを実行できます。

ワークロードが Arm に対応できているかを確認する

Arm 環境で Docker を実行している場合、または Arm イメージを実行するための x86 環境を用意している場合は、次のコマンドを実行します。

docker run --platform linux/arm64 IMAGE_NAME

IMAGE_NAME は、コンテナ イメージの名前に置き換えます。

次の出力は、GKE クラスタの Arm ノードでコンテナ イメージを実行する準備ができていることを示しています。

Hello from Docker!
This message shows that your installation appears to be working correctly.

ワークロードを Arm 上で実行する準備ができたら、デプロイする Arm ワークロードを準備するに進みます。

次の出力は、イメージが Arm 上で実行する準備ができていないことを示しています。

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
93288797bd35: Pull complete
Digest: sha256:507ecde44b8eb741278274653120c2bf793b174c06ff4eaa672b713b3263477b
Status: Downloaded newer image for hello-world:latest
standard_init_linux.go:219: exec user process caused: exec format error

この出力は、これが x86_64 または amd64 イメージであり、arm64 イメージをビルドする必要があることを示しています。次のマルチ アーキテクチャ イメージをビルドするセクションに進み、非 ARM 互換のコンテナ イメージ(Dockerfile)を使用して、さまざまなアーキテクチャで実行できるマルチ アーキテクチャ イメージをビルドします。

マルチアーキテクチャ イメージをビルドする

Dockerfile がある場合は、それを使って Arm 互換と x86 互換のマルチアーキテクチャ イメージをビルドし、異なるアーキテクチャ タイプのノードにデプロイできます。

以下の手順を完了するには、Docker Buildx をダウンロードする必要があります。また、既存の Dockerfile が必要です。

x86 VM と Arm VM がある場合の環境を準備する

以下のコマンドは、ビルド環境に Arm ビルド VM と x86 ビルド VM の両方があり、x86 VM が Arm VM に root で SSH 接続できることを前提としています。ビルド環境に x86 VM しかない場合は、次のx86 VM しかない場合に環境を準備するセクションの手順に沿って操作してください。

マルチアーキテクチャ イメージをビルドするための環境を準備します。

  1. ローカル ソケットを使用して x86 ノード用のコンテキストを作成し、SSH を使用して Arm ノード用のコンテキストを作成します。

     docker context create amd_node --docker "host=unix:///var/run/docker.sock"
     docker context create arm_node --docker "host=ssh://root@NODE_IP"
    

    NODE_IP は、Arm ノードの IP アドレスに置き換えます。

  2. x86 ノードを使用してビルダーを作成します。

    docker buildx create --use --name BUILDER_NAME --platform linux/amd64 amd_node
    docker buildx create --append --name BUILDER_NAME --platform linux/arm64 arm_node
    

    BUILDER_NAME は Buildx ビルダーの名前に置き換えます。

x86 VM しかない場合に環境を準備する

ビルド環境に x86 VM しかない場合は、以下の手順でマルチアーキテクチャ イメージをビルドする環境を準備できます。この方法を使用すると、ビルドステップに時間がかかる場合があります。

  1. QEMU パッケージをインストールします。

    docker run --rm --privileged multiarch/qemu-user-static
    
  2. マルチアーキテクチャ ビルダーを作成します(デフォルトのビルダーはマルチアーキテクチャをサポートしていません)。

    docker buildx create --name BUILDER_NAME --use
    

    BUILDER_NAME は Buildx ビルダーの名前に置き換えます。

イメージをビルドする

環境が整ったので、次のコマンドを実行してマルチアーキテクチャ イメージをビルドします。

docker buildx build . -t PATH_TO_REGISTRY  --platform linux/amd64,linux/arm64 --push

PATH_TO_REGISTRY は、レジストリへのパスに置き換え、末尾にコンテナ イメージの名前とタグを付けます(例: gcr.io/myproject/myimage:latest)。

このステップでエラー メッセージが表示された場合は、Docker ガイドと関連ドキュメントを参照してトラブルシューティングを進めてください。

マルチアーキテクチャ イメージをビルドすると、ワークロードを Arm で実行できるようになります。デプロイする Arm ワークロードを準備するに進みます。

次のステップ