本文档是系列文章中的第一篇,该系列讨论了如何构建自动持续集成 (CI) 流水线以在 Google Cloud 上构建多架构容器映像。本文档中介绍的概念适用于任何云环境。
系列文章包含本文档和随附的教程。本文档说明了构建容器映像的流水线结构并概述了其简要步骤。本教程将指导您构建示例流水线。
本系列文章面向想要简化构建容器映像的复杂流水线或扩展这些流水线以构建多架构映像的 IT 专业人员。它假定您已熟悉云技术和容器。
实现 CI 流水线时,您可以简化工件构建的过程。您不需要维护专用工具和硬件即可为给定架构构建容器映像。例如,如果当前流水线在 x86_64 架构上运行,并且仅为该架构生成容器映像,则您可能需要维护其他工具和硬件以便为其他架构(例如 ARM 系列)构建容器映像。
物联网 (IoT) 网域通常需要多架构构建。如果您有大量设备具有不同的硬件和操作系统软件堆栈,则针对特定设备的软件应用的构建、测试和管理流程将面临巨大的挑战。使用多架构构建流程有助于简化 IoT 应用的管理。
构建多架构容器映像的挑战
在大多数实现中,容器映像依赖于架构。例如,如果您为 x86_64 架构构建容器映像,则该映像无法在 ARM 系列的架构上运行。
您可以通过以下几种方式克服此限制:
- 在需要容器映像的目标架构上构建容器映像。
- 维护专用工具和硬件机队。您的机队必须至少为需要构建容器映像的每个架构设置一个设备。
- 构建多架构容器映像。
您可以根据各种因素(包括下列因素)来选择最适合您的策略:
- 流水线复杂性
- 自动化要求
- 可用于设计、实现和维护容器映像构建环境的资源
例如,如果您的运行时环境对电源的访问权限有限,则您可能需要在非运行时环境中构建容器映像。
下图说明选择可行策略的决策点。
在目标架构上构建容器映像
其中一种策略是直接在支持容器本身的运行时环境中构建所需的每个容器映像,如下图所示。
对于每个构建,请执行以下操作:
- 从运行时环境中每台设备上的源代码库下载容器映像的源代码。
- 在运行时环境中构建容器映像。
- 将容器映像存储在运行时环境中每个设备的本地容器映像代码库中。
此策略的优点在于您不需要预配和维护运行时环境所需硬件以外的硬件。此策略也有缺点。首先,您必须在运行时环境中对每个硬件实例重复构建流程,从而浪费资源。例如,如果您在设备无权访问持续电源的运行时环境中部署容器化工作负载,则每次需要部署新版本的工作负载时,都将浪费时间和电量在这些设备上运行构建任务。此外,您还需要维护工具来访问每个容器映像的源代码,以便在运行时环境中构建容器映像。
维护专用工具和硬件机队
第二个策略用来维护仅专用于构建容器映像的任务的硬件机队。下图展示了此策略的架构。
对于每个构建,您都需要执行以下操作:
- 在机队中具有构建容器映像所需的硬件架构和资源的设备上,下载容器映像的源代码。
- 构建容器映像。
- 将容器映像存储在集中式容器映像代码库中。
- 当您需要部署容器映像的新实例时,请在运行时环境中的每台设备上下载该映像。
对于此策略,请至少为需要构建容器映像的每个硬件架构预配一个实例。在一个非常复杂的生产环境中,如果您有多个并发构建作业,则可能有多个实例可以提高环境的容错能力并缩短构建时间。
此策略具有以下优点。首先,您可以仅运行每个构建作业一次,并将生成的容器映像存储在集中式容器映像代码库中,例如 Container Registry。此外,在构建机队中,您还可以在与您的运行时环境具有的硬件架构非常相似的设备上运行测试套件。此策略的主要缺点在于您必须预配和维护专用基础架构和工具,才能运行构建容器映像的任务。通常,每个构建任务不会因设计而耗用大量资源或时间,因此此基础架构在大多数时间都处于空闲状态。
构建多架构容器映像
在这第三个策略中,您将使用通用流水线来构建多架构容器映像,如下图所示。
对于每个构建,您都需要执行以下操作:
- 下载容器映像的源代码。
- 构建容器映像。
- 将容器映像存储在集中式容器映像代码库中。
- 当您需要部署容器映像的新实例时,请在运行时环境中的每台设备上下载该映像。
此策略的主要优点在于您无需预配和维护专用硬件或工具。例如,您可以使用现有的持续集成/持续部署 (CI/CD) 流水线和工具来构建多架构容器映像。与更节能的硬件架构(例如 ARM 系列中的硬件架构)相比,使用性能更好的通用硬件架构(例如 x86_64)也可能为您带来益处。
此策略还可能是采用 DevOps 原则且涉及范围更广的计划的一部分。例如,您可以为特殊硬件实现 CI/CD 流水线。
实现用于构建多架构容器映像的流水线
在本部分中,我们将介绍遵循第三个策略(即构建多架构容器映像)的 CI/CD 流水线的参考实现。
参考实现包含以下组件:
- 用于管理容器映像源代码的源代码库。例如,您可以使用 Cloud Source Repositories 代码库或 GitLab 代码库。
- 用于构建容器映像的 CI/CD 运行时环境,例如 Cloud Build。
- 用于管理容器和容器映像且支持多架构容器映像的平台,例如 Docker。
- 容器映像注册表,例如 Container Registry。如果您想将容器映像存储在需要映像的节点附近,则可以直接在您当前的环境中运行容器映像注册表(例如 Docker Registry)。
此参考架构使用 Moby BuildKit 和 QEMU 构建多架构 Docker 容器映像。在这种情况下,Moby BuildKit 会自动检测通过 QEMU 硬件模拟提供的架构,并自动加载在 Linux 内核的 binfmt_misc 功能中注册的适当二进制文件。
下图展示了技术堆栈,其负责执行此参考架构支持的每个多架构容器映像构建。
由于此参考架构使用 Docker 映像清单,因此您无需为每个目标硬件架构都提供容器映像标记;您可以将同一标记用于多个架构。例如,如果要构建 1.0.0
版本的多架构容器映像,您不需要为每个硬件架构(例如 1.0.0-x86_64
或 1.0.0_ARMv7
)都提供一个唯一标记。您可以将同一 1.0.0
标记用于要构建映像的所有硬件架构,并使用 Docker 映像清单正确识别每个容器映像。
以下示例展示了官方 Alpine Linux 映像的映像清单,您可以在其中找到该容器映像特定版本支持的架构相关信息:
{ "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 528, "digest": "sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45", "platform": { "architecture": "amd64", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 528, "digest": "sha256:401f030aa35e86bafd31c6cc292b01659cbde72d77e8c24737bd63283837f02c", "platform": { "architecture": "arm", "os": "linux", "variant": "v7" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 528, "digest": "sha256:2c26a655f6e38294e859edac46230210bbed3591d6ff57060b8671cda09756d4", "platform": { "architecture": "arm64", "os": "linux" } } ] }
在设计用于构建容器映像的自动化流水线时,我们建议您添加全面的测试套件,以验证每个容器映像的要求是否合规。例如,您可以使用 Chef InSpec、Serverspec 和 RSpec 等工具,针对作为某项构建流水线任务的容器映像执行合规性测试套件。
优化用于构建容器映像的流水线
验证并整合用于构建容器映像的流水线后,您就可以优化流水线。迁移到 Google Cloud:优化您的环境包含有关优化您的环境的指导。其中描述了一个优化框架,您可以采用该框架以让您的环境与当前状态相比更加高效。通过遵循优化框架,您可以通过多次迭代来修改您的环境状态。
每个优化迭代的首要活动之一是为该迭代建立一组要求和目标。例如,某中一项要求可能是对部署过程进行现代化改造,以将手动部署过程迁移到完全自动的容器化过程。如需详细了解如何对部署过程进行现代化改造,请参阅迁移到 Google Cloud:从手动部署迁移到自动的容器化部署。
后续步骤
- 试用随附的教程:为 IoT 设备构建多架构容器映像。
- 阅读我们关于 DevOps 的资源。
- 阅读 Kubernetes 以及持续软件交付所面临的挑战。
- 探索有关 Google Cloud 的参考架构、图表和最佳做法。查看我们的 Cloud Architecture Center。