インスタンスエクゼキューター(Experiment)

GitLab Runner 15.10.0で導入されました。この機能はExperiment です。

インスタンスエクゼキューターはオートスケール可能なエクゼキューターで、ランナーマネージャーが処理する予想されるジョブの量に対応するためにオンデマンドでインスタンスを作成します。

ジョブがホストインスタンス、オペレーションシステム、および接続デバイスへのフルアクセスを必要とする場合、インスタンスエグゼキュータを使用できます。インスタンスエグゼキュータはまた、さまざまなレベルの分離とセキュリティを持つシングルおよびマルチテナントのジョブに対応するように設定できます。

ネストされた仮想化

インスタンスエグゼキューターは、GitLabが開発したネスティングデーモンによるネストされた仮想化をサポートします。ネストデーモンは、ジョブのような分離された短時間のワークロードに使用されるホストシステム上で事前に設定された仮想マシンの作成と削除を可能にします。ネスティングは Apple Silicon インスタンスでのみサポートされています。

オートスケール環境の準備

ターゲットプラットフォームのスケーリングを有効にするには、fleetingプラグインをインストールします。AWSまたはGCPのfleetingプラグインをインストールできます。どちらのプラグインもExperimentsです。

GitLab が開発したその他の公式プラグインについては、fleeting プロジェクトを参照してください。

オートスケールの環境を準備するには

  1. ホスト・プラットフォーム用のバイナリをインストールします:
  2. プラグインバイナリがPATH 環境変数を通して検出可能であることを確認します。
  3. Amazon Machine Image(AMI) またはGCPカスタムイメージを作成します。イメージには以下が含まれている必要があります:
    • Git
    • GitLab Runner
    • 実行予定のジョブが必要とする依存関係

Executor のオートスケール設定

前提条件:

  • 管理者である必要があります。

インスタンス Executor をオートスケール用に設定するには、config.toml の以下のセクションを更新します:

AWSオートスケーリンググループ設定例

インスタンスあたり1ジョブ

前提条件:

  • 少なくともgit と GitLab Runner がインストールされた AMI。
  • AWS Autoscalingグループ。スケーリングポリシーにはnone を使います。Runner がスケーリングを処理します。
  • 適切な権限を持つ IAM ポリシー。

この設定でサポートされるのは

  • 各インスタンスの容量は1 です。
  • 使用回数は1
  • アイドルスケール5.
  • アイドル時間20分。
  • 最大インスタンス数10

容量と使用カウントが1 に設定されている場合、各ジョブには他のジョブの影響を受けないセキュアなエフェメラルインスタンスが与えられます。ジョブが完了すると、実行されたインスタンスは直ちに削除されます。

各インスタンスの容量が1、アイドルスケールが5 の場合、ランナーは将来の需要に備えて5つのインスタンス全体を利用可能な状態に保ちます。これらのインスタンスは少なくとも20分間は残ります。

Runnerconcurrent フィールドは、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。
  • スケーリングポリシーがnone に設定された AWS Autoscaling グループ。 Runner がスケーリングを処理します。
  • 適切な権限を持つ IAM ポリシー。

この設定でサポートされるのは

  • 各インスタンスの容量は5 です。
  • 使用回数は無制限。
  • アイドルスケール5
  • アイドル時間20分。
  • 最大インスタンス数10

インスタンスあたりの容量が5 に設定され、使用回数が無制限の場合、各インスタンスはインスタンスの存続期間中、同時に5つのジョブを実行します。

アイドルスケールが5の場合、使用中の容量が5を下回るたびに、5(各インスタンスの容量による)のアイドル容量に対応するために1つのアイドルインスタンスが作成されます。アイドル・インスタンスは少なくとも20分間残ります。

これらの環境で実行されるジョブは、ジョブ間の分離がほとんどなく、各ジョブが他のジョブのパフォーマンスに影響を与える可能性があるため、信頼されるべきです。

Runnerconcurrent フィールドは 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。
  • ランナーが使用するTart VMイメージ。VM イメージはジョブのimage キーワードで指定します。VM イメージには少なくともgit と GitLab Runner がインストールされている必要があります。
  • AWS Autoscalingグループ。スケーリングポリシーにはnone を使用します。Runner がスケーリングを処理するからです。MacOS用のASGのセットアップ方法については、EC2 Macインスタンス用のオートスケーリングの実装を参照してください。
  • 正しい権限を持つIAMポリシー。

この設定でサポートされるのは

  • 各インスタンスの容量は2 です。
  • 使用回数は無制限。
  • 分離されたジョブをサポートするネストされた仮想化。ネスト化された仮想化は、ネスト化がインストールされたApple Siliconインスタンスでのみ使用できます。
  • アイドルスケール5.
  • アイドル時間20分。
  • 最大インスタンス数10

各インスタンスの容量が2 、使用回数が無制限の場合、各インスタンスはインスタンスの有効期間中2つのジョブを同時に実行します。

アイドルスケールが2の場合、使用中のキャパシティが2より低くなるたびに、2(インスタンスあたりのキャパシティによる)のアイドルキャパシティに対応するために1つのアイドルインスタンスが作成されます。アイドルインスタンスは少なくとも24時間残ります。この時間枠は、AWS MacOSインスタンスホストの24時間の最小割り当て期間によるものです。

この環境で実行されるジョブは、各ジョブのネストされた仮想化にネストが使用されるため、信頼する必要はありません。これはAppleシリコンインスタンスでのみ動作します。

Runnerconcurrent フィールドは 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インスタンスグループを使用した1インスタンス1ジョブ

前提条件:

  • 少なくともgit と GitLab Runner がインストールされたカスタムイメージ。
  • オートスケーリングモードがdo not autoscale に設定されている GCP インスタンスグループ。 Runner がスケーリングを処理します。
  • 正しい権限を持つIAMポリシー。

この設定でサポートされるのは

  • インスタンスあたりの容量 1
  • 使用回数1
  • アイドルスケール5
  • アイドル時間20分
  • 最大インスタンス数10

capacityとuse countの両方が1 に設定されている場合、各ジョブには他のジョブの影響を受けないセキュアなエフェメラルインスタンスが与えられます。ジョブが完了すると、実行されたインスタンスは直ちに削除されます。

アイドルスケールが5 に設定されている場合、Runnerは将来の需要に備えて5つのインスタンスを保持します(インスタンスあたりの容量は1であるため)。これらのインスタンスは少なくとも20分間保持されます。

Runnerconcurrent フィールドは 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インスタンスグループを使用して、インスタンスあたり5ジョブ、無制限に使用できます。

前提条件:

  • 少なくともgit と GitLab Runner がインストールされたカスタムイメージ。
  • インスタンスグループ。Autoscaling mode “はRunnerがスケーリングを行うので “do not autoscale “を選択します。
  • 適切な権限を持つ IAM ポリシー。

この設定でサポートされるのは

  • インスタンスあたりの容量 5
  • 使用回数無制限
  • アイドルスケール5
  • アイドル時間20分
  • 最大インスタンス数10

キャパシティが5 、使用回数が無制限の場合、各インスタンスはインスタンスの有効期間中、同時に5つのジョブを実行します。

これらの環境で実行されるジョブは、ジョブ間の分離がほとんどなく、各ジョブが他のジョブのパフォーマンスに影響を与える可能性があるため、信頼されるべきです。

アイドルスケールが5に設定されている場合、使用中の容量が5を下回るたびに、(インスタンスあたりの容量に起因する)5のアイドル容量に対応するために1つのアイドルインスタンスが作成されます。アイドル・インスタンスは少なくとも20分間滞在します。

Runnerconcurrent フィールドは 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"