实例执行器(实验阶段)

引入于极狐GitLab Runner 15.10.0,当前处于实验阶段

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

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

嵌套虚拟化

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

准备环境

要准备环境,您必须:

  1. 安装 fleeting 插件。
  2. 创建 Amazon Machine Image。

安装 Fleeting 插件

要为您的环境启用弹性伸缩功能,请安装 AWS fleeting 插件,它针对想要进行弹性伸缩的平台。AWS fleeting 插件目前处于实验阶段

要安装 AWS 插件:

  1. 为您的主机平台下载二进制文件
  2. 确保可以通过 PATH 环境变量发现插件二进制文件。

创建 Amazon Machine Image

创建包含以下内容的 Amazon Machine Image (AMI):

  • 您计划运行的 CI 作业所需的依赖项
  • Git
  • 极狐GitLab Runner

配置要弹性伸缩的执行器

先决条件:

  • 您必须是管理员。

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

示例

每个实例一个作业,使用 AWS 弹性伸缩群组

先决条件:

  • 至少安装了 git 和极狐GitLab Runner 的 AMI。
  • 一个 AWS 弹性伸缩群组。对于伸缩策略,使用 “无”,因为 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-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 个作业,无限使用,使用 AWS 弹性伸缩群组

先决条件:

  • 至少安装了 git 和极狐GitLab Runner 的 AMI。
  • 一个 AWS 弹性伸缩群组。对于伸缩策略,使用 “无”,因为 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 实例上嵌套虚拟化,使用 AWS 弹性伸缩群组

先决条件:

  • 安装了嵌套Tart 的 MacOS AppleSilicon AMI。
  • Runner 需要使用的 Tart VM 镜像。VM 镜像由作业的 image 关键字指定。VM 镜像应该至少安装了 git 和极狐GitLab Runner。
  • 一个 AWS 弹性伸缩群组。对于伸缩策略,使用 “无”,因为 Runner 处理缩放。要为 MacOS 设置 ASG,请参阅此 Amazon 指南
  • 具有正确权限的 IAM 策略。

此配置支持:

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

通过将每个实例的容量设置为 2 和无限使用次数,每个实例在实例的生命周期内可以同时执行 2 个作业。

在此环境中执行的作业不需要可信,因为我们正在使用嵌套对每个作业进行嵌套虚拟化。这仅适用于 MacOS AppleSilcon 实例。

空闲规模为 2 时,只要使用中的容量低于 2,就会创建 1 个空闲实例以满足空闲容量为 2(由于每个实例的容量)的要求。空闲实例至少持续 24 小时。我们将其设置为 24 小时,因为 AWS MacOS 实例主机拥有 24 小时的最短分配期。

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"