マルチアーキテクチャDockerイメージの作成方法(ARM vs. AMD vs. x86)
目次
- ARMベースのプロセッサの概要
- ARMベースのプロセッサの優位性
- Dockerイメージの作成と管理
- 3.1 Gravitonデザインを使用したDockerイメージの作成
- 3.2 ARMおよびx86アーキテクチャへのデプロイメントのサポート
- 3.3 DockerhubとECRの連携
- OCIリポジトリによるマルチアーキテクチャイメージの作成
- 4.1 マニフェストの作成とイメージの登録
- 4.2 マルチアーキテクチャイメージの管理
- ECRイメージレジストリを使用したマルチアーキテクチャイメージの作成
- 5.1 プライベートリポジトリの作成と設定
- 5.2 イメージのビルドとタグ付け
- 5.3 マニフェストの作成とイメージのプッシュ
- EKSクラスタへのARMベースイメージのデプロイ
- 6.1 ARMノードの作成と設定
- 6.2 イメージのデプロイと管理
- 6.3 イメージのタグ付けと自動認識
- CI/CDパイプラインにおけるARMベースイメージの管理
- 7.1 簡素なタグ付けと適切なイメージのデプロイ
- 7.2 テストや移行作業時の利便性の向上
- まとめ
ARMベースのプロセッサの概要
最近、多くのパブリッククラウドプラットフォームがARMベースのプロセッサを使用し始めています。シンプルな設計のため、これらのプロセッサはより低コストでより高いパフォーマンスを提供することができます。AWSのGravitonデザインに基づくプロセッサは、x86アーキテクチャを使用する類似のモダンプロセッサに比べて、最大40%のコストパフォーマンスの向上があります。
Dockerイメージの作成と管理
ARMベースのKubernetesノードで誤ったDockerイメージを使用すると、即座にエラーとCrashLoopが発生します。そのため、ARMとx86ベースのインスタンスの両方に展開するためには、少なくとも2つのイメージまたはイメージタグを管理する必要があります。しかし、ARMへの移行やテストの際には、単一のイメージとタグを使用して両方のアーキテクチャに展開できる方法があります。
⭐Dockerhubでのマルチアーキテクチャイメージの作成方法
Dockerhubを使用してマルチアーキテクチャイメージを作成する手順を説明します。最初に、amd64ベースのアーキテクチャ用のイメージリポジトリを作成します。パブリックイメージの場合は、このステップはオプションであり、単にプッシュするだけで構いません。次に、同じアプリケーションのARMベースのアーキテクチャ用の別のイメージリポジトリを作成します。これで、2つの異なるリポジトリができました。
⭐Dockerhubにおけるマルチアーキテクチャイメージの作成
まず、Dockerイメージのビルドを行います。ターゲットアーキテクチャを指定するには、'platform'フラグを使用します。次に、amd64プラットフォーム向けに2番目のイメージをビルドします。イメージをリストアップすると、異なるイメージIDとサイズを持つ2つのイメージが表示されます。Dockerhubにイメージをアップロードする前に、'docker login'コマンドを使用してDockerhubに認証する必要があります。イメージをプッシュする操作は通常の方法と同じです。
⭐OCIリポジトリによるマルチアーキテクチャイメージの作成方法
OCI(Open Container Initiative)リポジトリを使用してマルチアーキテクチャイメージを作成する方法を説明します。マニフェストを作成し、アーキテクチャサフィックスなしでイメージを登録します。このマニフェストリストには、異なるアーキテクチャのイメージをすべてリストアップします。これにより、'fiber:v1'マニフェストにはamdおよびarmベースのアーキテクチャの両方のイメージが含まれます。マニフェスト内のすべてのイメージをリストアップするには、'inspect'コマンドを使用します。マニフェストをプッシュするには、同様のコマンドを使用しますが、最初に'manifest'サブコマンドを追加します。マニフェストのアップロードには数秒かかります。
⭐ECRイメージレジストリを使用したマルチアーキテクチャイメージの作成方法
AWSのECR(Elastic Container Registry)イメージレジストリを使用してマルチアーキテクチャイメージを作成する方法を説明します。まず、「myapp」という名前のプライベートリポジトリを作成します。他のパラメータはデフォルトの設定のままにしておきます。ターミナルからこのレジストリとの対話を開始するために、先ほどのコマンドをコピーして実行します。既にイメージがある場合は、単にタグを付けるか再ビルドすることができます。イメージタグにターゲットアーキテクチャを含めることに注意してください。ARMベースのイメージをビルドした後、それをECRにプッシュします。同じ手順をamd64ベースのプラットフォームに対しても繰り返し、ECRにプッシュします。次に、両方のイメージを含むDockerマニフェストリストを作成し、それをECRにプッシュします。ECRリポジトリでは、異なるアーキテクチャの2つのイメージが表示され、v1バージョンには別のタイプのアーティファクトも存在します。
⭐EKSクラスタへのARMベースイメージのデプロイ
EKSクラスタにARMベースのイメージをデプロイする手順を説明します。まず、x86アーキテクチャを使用する通常のノード2つと、ARMベースのノード1つを作成します。このようにノード数を異ならせると、違いがより明確になります。これで、合計で3つのKubernetesノードが作成されました。ダモンセットに類似する形で、3つのレプリカを持つデプロイメントオブジェクトも含まれています。まず、3つのノードすべてにARMベースのイメージをデプロイしてみましょう。ノードのアーキテクチャを確認するために、'kubectl describe node'コマンドを使用できます。次に、デプロイメントを適用します。ARMベースのノードが1つしかないため、実行中のポッドも1つだけです。誤ったイメージをデプロイすると、ほとんどの場合このエラーが表示されます。次に、ARM64の代わりにamd64イメージタグを使用してみましょう。2つのamd64ベースのノードがあるため、2つのポッドが実行中になります。このように、正しいイメージを正しいノードにデプロイする必要があります。特にテストや新しいアーキテクチャへの移行中は、やや手間です。CI/CDパイプラインの一部としてこれを避けるために、単純な'v1'タグを使用できます。これは、マニフェストリストとして認識され、Kubernetesノードが必要なイメージの種類を自動的に判断します。
CI/CDパイプラインにおけるARMベースイメージの管理
CI/CDパイプラインにおいてARMベースのイメージの管理方法を説明します。簡素な'tag'の使用と適切なイメージのデプロイメントによって、正しいイメージを正しいノードにデプロイする作業を容易にします。テストや移行の際に特に便利です。通常はCI/CDパイプラインの一部となっており、追加の変更を加えたくない場合があります。このため、単純な'v1'タグを使用することで、ARMベースのイメージの自動認識を実現することができます。
まとめ
この記事では、ARMベースのプロセッサを使用したマルチアーキテクチャイメージの作成方法について説明しました。DockerhubとECRを使ったイメージの作成と管理、OCIリポジトリを使ったマルチアーキテクチャイメージの作成、ECRイメージレジストリを使ったマルチアーキテクチャイメージの作成、そしてEKSクラスタへのARMベースイメージのデプロイ方法を学びました。また、CI/CDパイプラインにおけるARMベースイメージの管理方法についても解説しました。
これらの手順を実践することで、異なるアーキテクチャのノードに適切なイメージをデプロイすることができます。また、移行やテスト中に生じる手間を軽減できます。ARMベースのプロセッサとイメージの活用により、クラウドプラットフォームのパフォーマンスを最大限引き出すことができます。
【参考リンク】
- GitHubリポジトリ: こちら
- EKS terraformコード: こちら
- EKSにおけるアプリ公開の方法の詳細動画: こちら