為 Arm 工作負載建構多架構映像檔


本頁說明多架構 (多重架構) 映像檔的用途、節點和容器映像檔架構的重要性,以及多重架構映像檔如何簡化工作負載在 GKE 叢集的部署作業。本頁面也提供相關指引,說明如何檢查工作負載是否已準備好在 Arm 上執行,以及如何建構多架構映像檔。

如需使用多架構映像檔跨架構部署的教學課程,請參閱「將 GKE 上的 x86 應用程式遷移至 Arm 多架構」。

什麼是多架構映像檔?

多架構映像檔是指支援多種架構的映像檔。這看起來像是具有單一標記的單一映像檔,但實際上是映像檔清單,由資訊清單表整理,可指定多種架構。多架構映像檔與 Docker Image Manifest V2 Scheme 2OCI Image Index Specifications 相容。將多架構映像檔部署至叢集時,GKE 會自動選擇與部署節點架構相容的正確映像檔。取得工作負載的多架構映像檔後,您就能在多個架構中順暢部署這項工作負載。

如果您想在不同架構中使用相同的工作負載,多重架構映像檔就非常實用。或者,您也可以搭配任何類型的 GKE 節點,使用單一架構的容器映像檔。如果您只在一個架構上使用工作負載,且已有相容的映像檔,則不必建構多架構映像檔。

如果您使用單一架構映像檔或與 Arm 相容的多重架構映像檔,並想將其部署至 Arm 節點,請務必按照操作說明加入必要欄位,確保 GKE 能如期排定工作負載。詳情請參閱「準備要用於部署的 Arm 工作負載」。 如果工作負載只會排定至 x86 型節點,則不必新增這些欄位來排定工作負載。

為什麼 GKE 節點架構對工作負載很重要?

GKE 節點是個別的 Compute Engine VM 執行個體,由 GKE 代表您建立及管理。每個節點都是標準機器類型 (例如 t2a-standard-1),使用 x86 (Intel 或 AMD) 或 Arm 處理器。詳情請參閱「CPU 平台」。

您必須使用與節點架構相容的容器映像檔,才能在該節點上執行工作負載。 舉例來說,如要執行 arm64 架構的容器映像檔,您必須使用支援 Arm 工作負載的機器類型,例如 Tau T2A 系列機器t2a-standard-1。您可以在一個 GKE 叢集中使用多種架構類型的節點。如要在多種架構類型中使用一個工作負載,您必須整理好所有架構專屬映像檔的容器映像檔和部署檔案。多架構映像檔可簡化跨架構類型部署的程序。

建構多架構映像檔,以便在 x86 和 Arm 節點之間部署

下列操作說明適用於已具備下列條件的應用程式開發人員:

  • 建構環境,並下載容器工具 (例如 Docker)。
  • 現有容器映像檔。

下列指令使用 Docker,但您或許可以使用其他容器工具完成相同工作。

我的工作負載是否已準備好使用 Arm?

如果您有現有的容器映像檔,可以檢查這項工作負載是否已準備好在 Arm 節點上執行。以下各節說明如何使用 docker run 嘗試透過 Arm 架構執行容器。

在 x86 環境中準備 Docker,以檢查容器映像檔

如果您在 x86 環境中執行 Docker,必須下載其他套件才能執行 arm64 容器映像檔。這些操作說明使用 apt 管理套件,但您可以使用環境的套件管理工具下載必要套件。

如果您是在 Arm 環境中執行 Docker,可以略過本節。

下列指令會下載套件,並將 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,或已準備好 x86 環境來執行 Arm 映像檔,請執行下列指令:

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_64amd64 圖片,您必須建構 arm64 圖片。請前往下一節「建構多架構映像檔」,使用不相容於 Arm 的容器映像檔和 Dockerfile,建構可跨架構類型執行的多架構映像檔。

建構多架構映像檔

如果您有 Dockerfile,就能使用該檔案建構與 Arm 和 x86 相容的多架構映像檔,並部署到具有不同架構類型的節點。

您必須下載 Docker Buildx,才能完成下列步驟。您也必須有現有的 Dockerfile。

如果您有 x86 VM 和 Arm VM,請準備環境

下列指令假設您在建構環境中同時擁有 Arm 建構 VM 和 x86 建構 VM,且 x86 VM 可以透過 SSH 以根身分連線至 Arm VM。如果建構環境中只有 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 工作負載」。

後續步驟