为弹性伸缩 Docker Machine 安装和注册极狐GitLab Runner

  • Tier: 基础版, 专业版, 旗舰版
  • Offering: JihuLab.com, 私有化部署
History
    • 自动扩缩容功能引入于极狐GitLab Runner 1.1.0。

Docker Machine 执行器已在极狐GitLab 17.5 中弃用,计划于极狐GitLab 20.0(2027年5月)中移除。在极狐GitLab 20.0 之前,我们将继续支持 Docker Machine 执行器,但不再添加新功能。我们只会修复可能导致 CI/CD 作业无法执行或影响运行成本的关键性错误。如果您在 Amazon Web Services (AWS) EC2、Microsoft Azure Compute 或 Google Compute Engine (GCE) 上使用 Docker Machine 执行器,建议您迁移到 GitLab Runner Autoscaler

有关自动扩缩容架构的概述,请参阅自动扩缩容的综合文档

Docker Machine 的分叉版本#

Docker 已经弃用 Docker Machine。然而,GitLab 维护了一个 Docker Machine 的分叉版本,为依赖 Docker Machine executor 的极狐GitLab Runner 用户提供支持。

准备环境#

要使用自动缩放功能,Docker 和极狐GitLab Runner 必须安装在同一台机器上:

  1. 登录到一台新的基于 Linux 的机器,该机器可以作为堡垒服务器,Docker 在其上创建新机器。
  2. 安装极狐GitLab Runner
  3. Docker Machine 分叉版本 安装 Docker Machine。
  4. 可选但推荐,准备一个代理容器注册表和缓存服务器,以便与自动缩放的 runners 一起使用。

配置极狐GitLab Runner#

  1. 熟悉使用 docker-machinegitlab-runner 的核心概念:

  2. 第一次使用 Docker Machine 时,最好手动执行 docker-machine create ... 命令,并使用您的 Docker Machine 驱动程序。使用您打算在 [runners.machine] 部分的 MachineOptions 中配置的选项运行此命令。这种方法可以正确设置 Docker Machine 环境并验证指定的选项。在此之后,您可以使用 docker-machine rm [machine_name] 销毁机器并启动 runner。

首次使用时,对 docker-machine create 的多个并发请求是不好的。当使用 docker+machine executor 时,runner 可能会启动几个并发的 docker-machine create 命令。如果 Docker Machine 对此环境来说是新的,每个进程都会尝试创建用于 Docker API 认证的 SSH 密钥和 SSL 证书。这个动作会导致并发进程互相干扰。这可能会导致一个不可工作的环境。因此,在您首次将极狐GitLab Runner 与 Docker Machine 设置时,手动创建一个测试机器是很重要的。

  1. 注册一个 runner 并在询问时选择 docker+machine executor。
  2. 编辑 config.toml 并配置 runner 以使用 Docker Machine。访问专门页面获取有关极狐GitLab Runner 自动缩放的详细信息。
  3. 现在,您可以尝试在项目中启动新的流水线。几秒钟后,如果您运行 docker-machine ls,您应该会看到一个新的机器正在创建。

升级极狐GitLab Runner#

  1. 检查您的操作系统是否配置为自动重启极狐GitLab Runner(例如,通过检查其服务文件):

    • 如果是,确保服务管理器配置为使用 SIGQUIT,并使用服务的工具来停止进程:

      shell
      # For systemd sudo systemctl stop gitlab-runner # For upstart sudo service gitlab-runner stop
    • 如果不是,您可以手动停止进程:

      shell
      sudo killall -SIGQUIT gitlab-runner

发送SIGQUIT 信号使进程优雅地停止。进程停止接受新的作业,并在当前作业完成后退出。

  1. 等待极狐GitLab Runner 退出。您可以使用 gitlab-runner status 检查其状态,或等待最多 30 分钟的优雅关闭:

    shell
    for i in `seq 1 180`; do # 1800 seconds = 30 minutes gitlab-runner status || break sleep 10 done
  2. 现在,您可以安全地安装新的极狐GitLab Runner 版本,而不会中断任何作业。

使用 Docker Machine 的分叉版本#

安装#

  1. 下载适合的 docker-machine 二进制文件。将二进制文件复制到 PATH 可访问的位置,并使其可执行。例如,要下载并安装 v0.16.2-gitlab.35

    shell
    curl -O "https://gitlab-docker-machine-downloads.s3.amazonaws.com/v0.16.2-gitlab.35/docker-machine-Linux-x86_64" cp docker-machine-Linux-x86_64 /usr/local/bin/docker-machine chmod +x /usr/local/bin/docker-machine

故障排除#

在使用 Docker Machine executor 时,您可能会遇到以下问题。

错误:创建机器时出错#

在安装 Docker Machine 时,您可能会遇到一个错误,指出 ERROR: Error creating machine: Error running provisioning: error installing docker

Docker Machine 尝试使用以下脚本在新配置的虚拟机上安装 Docker:

shell
if ! type docker; then curl -sSL "https://get.docker.com" | sh -; fi

如果 docker 命令成功,Docker Machine 假设 Docker 已安装并继续。

如果不成功,Docker Machine 会尝试下载并运行 https://get.docker.com 上的脚本。如果安装失败,则可能是操作系统不再受 Docker 支持。

要解决此问题,您可以在安装极狐GitLab Runner 的环境中设置 MACHINE_DEBUG=true 来启用 Docker Machine 的调试。

错误:无法连接到 Docker 守护进程#

作业可能在准备阶段失败,并出现错误消息:

plaintext
Preparing environment ERROR: Job failed (system failure): prepare environment: Cannot connect to the Docker daemon at tcp://10.200.142.223:2376. Is the docker daemon running? (docker.go:650:120s). Check https://docs.gitlab.com/runner/shells/#shell-profile-loading for more information

当 Docker 守护进程在 Docker Machine executor 创建的 VM 中的预期时间内未能启动时,会出现此错误。要解决此问题,请在[runners.docker]部分中增加 wait_for_services_timeout 值。