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

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

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

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

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

マルチ アーキテクチャ イメージは、複数のアーキテクチャをサポートできるイメージです。これは、1 つのタグを持つ 1 つのイメージのように見えますが、これはマニフェスト リストによって整理された複数のアーキテクチャをターゲットとするイメージのリストです。マルチ アーキテクチャ イメージは、Docker イメージ マニフェスト V2 スキーム 2 または OCI イメージ インデックス仕様と互換性があります。マルチ アーキテクチャ イメージをクラスタにデプロイすると、GKE はデプロイ先のノードのアーキテクチャと互換性のある適切なイメージを自動的に選択します。ワークロードのマルチ アーキテクチャ イメージを作成したら、このワークロードを複数のアーキテクチャにシームレスにデプロイできます。

マルチ アーキテクチャ イメージは、アーキテクチャ間で同じワークロードを使用する場合に便利です。あるいは、任意のタイプの GKE ノードを持つ 1 つのアーキテクチャのコンテナ イメージを使用することもできます。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 など)を備えたビルド環境。
  • 既存のコンテナ イメージ。

次のコマンドは Docker を使用しますが、他のコンテナツールを使用して同じタスクを実行することもできます。

ワークロードは Arm 対応の準備ができているか

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

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

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

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

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

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 に対応しているか確認する

Docker を Arm 環境で実行する場合や、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 ワークロードを準備するに進みます。

次のステップ