实例执行器(实验阶段)

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

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

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

嵌套虚拟化

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

准备弹性伸缩环境

要为您的目标平台启用扩展,请安装一个 fleeting 插件。您可以安装 AWS 或 GCP fleeting 插件。 这两个插件都处于实验阶段

对于极狐GitLab 的其他官方插件,请参阅 fleeting 项目

准备弹性伸缩环境:

  1. 安装适合您的主机平台的二进制文件:
  2. 确保插件二进制文件可通过 PATH 环境变量发现。
  3. 创建 Amazon Machine Image (AMI) 或 GCP 自定义镜像。镜像必须包括:
    • git
    • 极狐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 的自定义镜像。
  • 实例组。对于“弹性伸缩模式”,选择“不弹性伸缩”,因为 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 时,Runner 保留 5 个完整实例,可满足未来需求(因为每个实例的容量为 1)。这些实例会至少持续 20 分钟。

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

当闲置规模为 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"