为 Arm 工作负载构建多架构映像


本页面介绍了什么是多架构映像、为什么节点和容器映像的架构很重要,以及为什么多架构映像可让您更轻松地将工作负载部署到 GKE 集群。本页面还介绍了如何检查工作负载是否已准备好在 Arm 上运行,以及如何构建多架构映像。

如需查看使用多架构映像跨架构进行部署的教程,请参阅使用 Arm 将 GKE 上的 x86 应用迁移到多架构

什么是多架构映像?

多架构映像是一种可以支持多个架构的映像。它看起来像具有单个标记的单个映像,但它是一系列映像,针对的是按清单列表组织的多个架构。多架构映像与 Docker 映像 Manifest V2 Scheme 2OCI 映像索引规范兼容。将多架构映像部署到集群时,GKE 会自动选择与所部署到的节点的架构兼容的正确映像。将多架构映像用于工作负载后,您可以跨多个架构无缝部署此工作负载。

如果您想要在多个架构中使用相同的工作负载,则多架构映像十分有用。或者,您可以将容器映像与具有任何类型的 GKE 节点的单个架构结合使用。如果您只使用一个架构上的工作负载,并且已经拥有兼容的映像,则无需构建多架构映像。

如果您使用的是与 Arm 兼容的单架构映像或多架构映像,并且想要将该映像部署到 Arm 节点,则必须按照说明添加必要的字段,以便 GKE 按预期调度工作负载。如需了解详情,请参阅准备 Arm 工作负载以进行部署。如果工作负载仅会调度到基于 x86 的节点,则您无需添加这些字段即可调度工作负载。

为什么 GKE 节点的架构对工作负载很重要?

GKE 节点是 GKE 代表您创建和管理的单个 Compute Engine 虚拟机实例。每个节点都是标准的机器类型(例如 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,或者已为运行 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_64amd64 映像,您必须构建 arm64 映像。继续至下一部分,构建多架构映像,您将可以使用与 ARM 不兼容的容器映像和 Dockerfile,并构建能够跨架构类型运行的多架构映像。

构建多架构映像

如果您有 Dockerfile,可以使用它来构建与 Arm 兼容且与 x86 兼容的多架构映像,您可以在具有不同架构类型的节点上部署该映像。

您必须下载 Docker Buildx 才能完成以下步骤。您还必须有 Dockerfile。

在您有 x86 虚拟机和 Arm 虚拟机时准备环境

以下命令假定您在构建环境中已有 Arm 构建虚拟机和 x86 构建虚拟机,并且 x86 虚拟机可以以根用户身份通过 SSH 连接到 Arm 虚拟机。如果您在构建环境中只有 x86 虚拟机,请按照下一部分在您只有 x86 虚拟机时准备环境中的说明操作。

准备环境以构建多架构映像:

  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 虚拟机时准备环境

如果您在构建环境中只有 x86 虚拟机,则可以按照以下步骤准备环境来构建多架构映像。使用此选项时,构建步骤可能需要较长的时间。

  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 工作负载以进行部署

后续步骤