实例执行器

  • 引入于极狐GitLab Runner 15.10.0,当前处于实验阶段
  • 在极狐GitLab Runner 16.6 中改为 Beta。
  • 在极狐GitLab Runner 17.1 中改为 GA。

实例执行器是一个支持弹性伸缩的执行器,它按需创建实例以适应 Runner manager 处理的预期作业量。

当作业需要完全访问主机实例、操作系统和连接的设备时,您可以使用实例执行器。实例执行器还可以配置为适应不同隔离和安全级别的单租户和多租户作业。

嵌套虚拟化

实例执行器通过极狐GitLab 开发的嵌套 daemon 支持嵌套虚拟化。嵌套 daemon 允许在主机系统上创建和删除用于隔离和短期工作负载(例如作业)的预配置虚拟机。 仅 Apple Silicon 实例支持嵌套。

准备弹性伸缩环境

准备弹性伸缩环境:

  1. 在您安装配置 runner 管理器的平台上安装 fleeting 插件
  2. 在您使用的平台上创建好虚拟机镜像,镜像需包含:
    • Git
    • 极狐GitLab Runner
    note 您必须在虚拟机镜像中安装 Git 和极狐GitLab Runner,并确保 runner 在默认路径下可执行,以便处理作业制品和缓存。但是您不需要在虚拟机上配置或者重启极狐GitLab Runner 服务本身。
    • 您计划运行的作业所需的依赖项

配置要弹性伸缩的执行器

先决条件:

  • 您必须是管理员。

要配置弹性伸缩的执行器,请更新 config.toml 中的以下内容:

AWS 弹性伸缩群组配置示例

每个实例一个作业

先决条件:

  • 至少安装了 git 和极狐GitLab Runner 的 AMI。
  • 一个 AWS 弹性伸缩群组。对于伸缩策略,使用 none,因为 Runner 处理伸缩。
  • 具有正确权限的 IAM 策略。

此配置支持:

  • 每个实例的容量为 1
  • 使用次数为 1
  • 闲置规模为 5
  • 空闲时间为 20 分钟
  • 最大实例数为 10

当容量和使用计数都设置为 1 时,每个作业都会获得一个安全的临时实例,不会受到其他作业的影响。当作业完成时,执行它的实例就会立即被删除。

每个实例的容量为 1,并且闲置规模为 5 时,Runner 保留 5 个完整实例,用于满足未来的需求。这些实例至少保留 20 分钟。

Runner concurrent 字段设置为 10(最大实例数 * 每个实例的容量)。

concurrent = 10

[[runners]]
  name = "instance autoscaler example"
  url = "https://gitlab.com"
  token = "<token>"
  shell = "sh"

  executor = "instance"

  # Autoscaler config
  [runners.autoscaler]
    plugin = "fleeting-plugin-aws"

    capacity_per_instance = 1
    max_use_count = 1
    max_instances = 10

    [runners.autoscaler.plugin_config] # plugin specific configuration (see plugin documentation)
      name             = "my-linux-asg"                # AWS Autoscaling Group name
      profile          = "default"                     # optional, default is 'default'
      config_file      = "/home/user/.aws/config"      # optional, default is '~/.aws/config'
      credentials_file = "/home/user/.aws/credentials" # optional, default is '~/.aws/credentials'

    [runners.autoscaler.connector_config]
      username          = "ec2-user"
      use_external_addr = true

    [[runners.autoscaler.policy]]
      idle_count = 5
      idle_time = "20m0s"

每个实例 5 个作业,无限使用

先决条件:

  • 至少安装了 git 和极狐GitLab Runner 的 AMI。
  • 一个 AWS 弹性伸缩群组,且伸缩政策设置为 none。Runner 处理伸缩。
  • 具有正确权限的 IAM 策略。

此配置支持:

  • 每个实例的容量为 5
  • 无限使用次数
  • 闲置规模为 5
  • 空闲时间为 20 分钟
  • 最大实例数为 10

当每个实例的容量设置为 5 且使用次数是无限的,每个实例在实例的生命周期内可以并发执行 5 个作业。

当闲置规模为 5 时,每当使用容量低于 5 时,就会创建 1 个闲置实例来制造 5 的闲置规模(由于每个实例的容量)。闲置实例保持至少 20 分钟。

在这些环境中执行的作业应该是可信的,因为它们之间几乎没有隔离,并且每个作业都会影响另一个作业的性能。

Runner concurrent 字段设置为 50(最大实例数 * 每个实例的容量)。

concurrent = 50

[[runners]]
  name = "instance autoscaler example"
  url = "https://gitlab.com"
  token = "<token>"
  shell = "sh"

  executor = "instance"

  # Autoscaler config
  [runners.autoscaler]
    plugin = "fleeting-plugin-aws"

    capacity_per_instance = 5
    max_use_count = 0
    max_instances = 10

    [runners.autoscaler.plugin_config] # plugin specific configuration (see plugin documentation)
      name             = "my-windows-asg"              # AWS Autoscaling Group name
      profile          = "default"                     # optional, default is 'default'
      config_file      = "/home/user/.aws/config"      # optional, default is '~/.aws/config'
      credentials_file = "/home/user/.aws/credentials" # optional, default is '~/.aws/credentials'

    [runners.autoscaler.connector_config]
      username          = "Administrator"
      timeout           = "5m0s"
      use_external_addr = true

    [[runners.autoscaler.policy]]
      idle_count = 5
      idle_time = "20m0s"

每个实例 2 个作业,无限使用,在 EC2 Mac 实例上嵌套虚拟化

先决条件:

  • 安装了嵌套Tart 的 Apple Silicon AMI。
  • Runner 使用的 Tart VM 镜像。VM 镜像由作业的 image 关键字指定。VM 镜像应该至少安装了 git 和极狐GitLab Runner。
  • 一个 AWS 弹性伸缩群组。对于伸缩策略,使用 none,因为 Runner 处理缩放。有关为 MacOS 设置 ASG 的更多信息,请参阅为 EC2 Mac 实例实现弹性伸缩
  • 具有正确权限的 IAM 策略。

此配置支持:

  • 每个实例的容量为 2
  • 无限使用次数
  • 嵌套虚拟化以支持隔离作业。嵌套虚拟化仅适用于安装了嵌套的 Apple 芯片实例。
  • 闲置规模为 5
  • 空闲时间为 20 分钟
  • 最大实例数为 10

当每个实例的容量设置为 2 ,且使用次数为无限时,每个实例在实例的生命周期内可以并发执行 2 个作业。

当闲置规模为 2 时,每当使用容量低于 2,就会创建 1 个闲置实例来制造 2 的闲置容量(由于每个实例的容量)。闲置实例保持至少 24 小时。此时间范围是由 AWS MacOS 实例主机的 24 小时最短分配期所决定。

在此环境中执行的作业不需要被信任,因为嵌套用于每个作业的嵌套虚拟化。仅适用于 Apple silicon 实例。

Runner concurrent 字段设置为 8(最大实例数 * 每个实例的容量)。

concurrent = 8

[[runners]]
  name = "macos applesilicon autoscaler example"
  url = "https://gitlab.com"
  token = "<token>"
  executor = "instance"

  [runners.instance]
    allowed_images = ["*"] # allow any nesting image

  [runners.autoscaler]
    capacity_per_instance = 2 # AppleSilicon can only support 2 VMs per host
    max_use_count = 0
    max_instances = 4

    plugin = "fleeting-plugin-aws"

    [[runners.autoscaler.policy]]
      idle_count = 2
      idle_time  = "24h" # AWS's MacOS instances

    [runners.autoscaler.connector_config]
      username = "ec2-user"
      key_path = "macos-key.pem"
      timeout  = "1h" # connecting to a MacOS instance can take some time, as they can be slow to provision

    [runners.autoscaler.plugin_config]
      name = "mac2metal"
      region = "us-west-2"

    [runners.autoscaler.vm_isolation]
      enabled = true
      nesting_host = "unix:///Users/ec2-user/Library/Application Support/nesting.sock"

    [runners.autoscaler.vm_isolation.connector_config]
      username = "nested-vm-username"
      password = "nested-vm-password"
      timeout  = "20m"

GCP 实例组配置示例

每个实例一个作业,使用 GCP 实例组

先决条件:

  • 至少安装了 git 和极狐GitLab Runner 的自定义镜像。
  • 弹性伸缩模式设置为 do not autoscale 的 GCP 实例组。Runner 处理伸缩。
  • 具有正确权限的 IAM 策略。

此配置支持:

  • 每个实例的容量为 1
  • 使用次数为 1
  • 闲置规模为 5
  • 闲置时间为 20 分钟
  • 最大实例数为 10

当容量和使用计数都设置为 1 时,每个作业都会获得一个安全的临时实例,该实例不受其他作业影响。作业完成后,执行该作业的实例将立即被删除。

当闲置规模设置为 5 时,Runner 保留 5 个实例,可满足未来需求(因为每个实例的容量为 1)。这些实例会至少持续 20 分钟。

Runner concurrent 字段设置为 10(最大实例数 * 每个实例的容量)。

concurrent = 10

[[runners]]
  name = "instance autoscaler example"
  url = "https://gitlab.com"
  token = "<token>"
  shell = "sh"

  executor = "instance"

  # Autoscaler config
  [runners.autoscaler]
    plugin = "fleeting-plugin-googlecompute"

    capacity_per_instance = 1
    max_use_count = 1
    max_instances = 10

    [runners.autoscaler.plugin_config] # plugin specific configuration (see plugin documentation)
      name             = "my-linux-instance-group" # GCP Instance Group name
      project          = "my-gcp-project"
      zone             = "europe-west1-c"
      credentials_file = "/home/user/.config/gcloud/application_default_credentials.json" # optional, default is '~/.config/gcloud/application_default_credentials.json'

    [runners.autoscaler.connector_config]
      username          = "runner"
      use_external_addr = true

    [[runners.autoscaler.policy]]
      idle_count = 5
      idle_time = "20m0s"

每个实例五个作业,无限制使用,使用 GCP 实例组

先决条件:

  • 实例组。对于“弹性伸缩模式”,选择“不弹性伸缩”,因为 Runner 会处理伸缩。
  • 具有正确权限的 IAM 策略。

此配置支持:

  • 每个实例的容量为 5
  • 使用次数为无限
  • 闲置规模为 5
  • 闲置时间为 20 分钟
  • 最大实例数为 10

当每个实例的容量设置为 5,且使用次数为无限,每个实例在实例的生命周期内可以并发执行 5 个作业。

在这些环境中执行的作业应该是可信的,因为它们之间几乎没有隔离,并且每个作业都会影响另一个作业的性能。

当闲置规模设置为 5 时,每当使用容量低于 5 时,就会创建 1 个闲置实例来制造 5 的闲置规模(由于每个实例的容量)。闲置实例保持至少 20 分钟。

Runner concurrent 字段设置为 50(最大实例数 * 每个实例的容量)。

concurrent = 50

[[runners]]
  name = "instance autoscaler example"
  url = "https://gitlab.com"
  token = "<token>"
  shell = "sh"

  executor = "instance"

  # Autoscaler config
  [runners.autoscaler]
    plugin = "fleeting-plugin-googlecompute"

    capacity_per_instance = 5
    max_use_count = 0
    max_instances = 10

    [runners.autoscaler.plugin_config] # plugin specific configuration (see plugin documentation)
      name             = "my-windows-instance-group" # GCP Instance Group name
      project          = "my-gcp-project"
      zone             = "europe-west1-c"
      credentials_file = "/home/user/.config/gcloud/application_default_credentials.json" # optional, default is '~/.config/gcloud/application_default_credentials.json'

    [runners.autoscaler.connector_config]
      username          = "Administrator"
      timeout           = "5m0s"
      use_external_addr = true

    [[runners.autoscaler.policy]]
      idle_count = 5
      idle_time = "20m0s"

Azure scale 设置配置示例

每个实例 1 个作业使用 Azure scale 设置

先决条件:

  • 一个至少安装了 git 和极狐GitLab Runner 的自定义镜像。
  • 一个 Azure scale set,其中弹性伸缩模式设置为 manual。Runner 处理伸缩。

此配置支持:

  • 每个实例的容量为 1
  • 使用次数为 1
  • 闲置规模为 5
  • 闲置时间为 20 分钟
  • 最大实例数为 10

当容量和使用计数都设置为 1 时,每个作业都会获得一个安全的临时实例,该实例不受其他作业影响。作业完成后,执行该作业的实例将立即被删除。

当闲置规模设置为 5 时,Runner 保留 5 个实例,可满足未来需求(因为每个实例的容量为 1)。这些实例会至少持续 20 分钟。

Runner concurrent 字段设置为 10(最大实例数 * 每个实例的容量)。

concurrent = 10

[[runners]]
  name = "instance autoscaler example"
  url = "https://gitlab.com"
  token = "<token>"
  shell = "sh"

  executor = "instance"

  # Autoscaler config
  [runners.autoscaler]
    plugin = "azure" # for >= 16.11, ensure you run `gitlab-runner fleeting install` to automatically install the plugin

    # for versions < 17.0, manually install the plugin and use:
    # plugin = "fleeting-plugin-azure"

    capacity_per_instance = 1
    max_use_count = 1
    max_instances = 10

    [runners.autoscaler.plugin_config] # plugin specific configuration (see plugin documentation)
      name                = "my-linux-scale-set" # Azure scale set name
      subscription_id     = "9b3c4602-cde2-4089-bed8-889e5a3e7102"
      resource_group_name = "my-resource-group"

    [runners.autoscaler.connector_config]
      username               = "runner"
      password               = "my-scale-set-static-password"
      use_static_credentials = true
      timeout                = "10m"
      use_external_addr      = true

    [[runners.autoscaler.policy]]
      idle_count = 5
      idle_time  = "20m0s"

每个实例 5 个作业,无限使用,使用 Google Cloud 实例群组

先决条件:

  • 至少安装了 git 和极狐GitLab Runner 的自定义镜像。
  • 一个 Azure scale set,其中弹性伸缩模式设置为 manual。Runner 处理伸缩。

此配置支持:

  • 每个实例的容量为 5
  • 使用次数为无限
  • 闲置规模为 5
  • 闲置时间为 20 分钟
  • 最大实例数为 10

当每个实例的容量设置为 5,且使用次数为无限,每个实例在实例的生命周期内可以并发执行 5 个作业。

在这些环境中执行的作业应该是可信的,因为它们之间几乎没有隔离,并且每个作业都会影响另一个作业的性能。

当闲置规模设置为 5 时,每当使用容量低于 5 时,就会创建 1 个闲置实例来制造 5 的闲置规模(由于每个实例的容量)。闲置实例保持至少 20 分钟。

Runner concurrent 字段设置为 50(最大实例数 * 每个实例的容量)。

concurrent = 50

[[runners]]
  name = "instance autoscaler example"
  url = "https://gitlab.com"
  token = "<token>"
  shell = "sh"

  executor = "instance"

  # Autoscaler config
  [runners.autoscaler]
    plugin = "azure" # for >= 16.11, ensure you run `gitlab-runner fleeting install` to automatically install the plugin

    # for versions < 17.0, manually install the plugin and use:
    # plugin = "fleeting-plugin-azure"

    capacity_per_instance = 5
    max_use_count = 0
    max_instances = 10

    [runners.autoscaler.plugin_config] # plugin specific configuration (see plugin documentation)
      name                = "my-windows-scale-set" # Azure scale set name
      subscription_id     = "9b3c4602-cde2-4089-bed8-889e5a3e7102"
      resource_group_name = "my-resource-group"

    [runners.autoscaler.connector_config]
      username               = "Administrator"
      password               = "my-scale-set-static-password"
      use_static_credentials = true
      timeout                = "10m"
      use_external_addr      = true

    [[runners.autoscaler.policy]]
      idle_count = 5
      idle_time = "20m0s"

故障排查

当您使用实例执行器时,您可能会遇到以下问题:

sh: 1: eval: Running on ip-x.x.x.x via runner-host...n: not found

当准备步骤中的 eval 命令失败时,通常会发生此错误。要解决此错误,请切换到 bash shell 并启用 feature flag FF_USE_NEW_BASH_EVAL_STRATEGY