Docker Autoscaler Executor (実験)

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

Docker Autoscaler Executorはオートスケール可能なDocker Executorで、runnerマネージャが処理するジョブに対応するインスタンスをオンデマンドで作成します。

オートスケーラはfleetingプラグインを使用します。fleeting 、オートスケールされたインスタンスグループの抽象化であり、異なるクラウドプロバイダ(GCP、AWS、Azureなど)をサポートするプラグインを使用します。これにより、Runner Managerが処理するジョブに対応するインスタンスをオンデマンドで作成できます。

環境の準備

オートスケールのために環境を準備するために、最初にターゲットプラットフォームのスケーリングを有効にするfleetingプラグインを選択します。

AWSとGCPのfleetingプラグインはExperimentです。

他の公式プラグインはこちらから

インストール

AWS

AWSプラグインをインストールします:

  1. ホストプラットフォーム用のバイナリをダウンロードします。
  2. プラグイン・バイナリがPATH環境変数を通して検出可能であることを確認してください。
GCP

GCPプラグインをインストールするには、以下の手順に従います:

  1. ホストプラットフォーム用のバイナリをダウンロードします。
  2. プラグイン・バイナリがPATH環境変数を通して検出可能であることを確認してください。

設定

Docker AutoscalerエクゼキュータはDockerエクゼキュータをラップしており、全てのDockerエクゼキュータのオプションと機能がサポートされています。オートスケーラを有効にするには、Executorをdocker-autoscaler として定義します。

使用例

AWS

例: AWS Autoscalingグループを使用したインスタンスあたり1ジョブ

前提条件:

  • Docker EngineがインストールされたAMI。
  • AWS Autoscalingグループ。Runnerがスケーリングを行うため、スケーリングポリシーには “none “を使用します。
  • 正しい権限を持つIAMポリシー

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

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

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

アイドルスケールを5にすると、Runnerは5つのインスタンス全体(インスタンスあたりのキャパシティは1であるため)を将来の需要に備えて利用可能な状態に保とうとします。これらのインスタンスは少なくとも20分間滞在します。

Runnerconcurrent フィールドは 10 (最大インスタンス数 * インスタンスあたりの容量) に設定されます。

concurrent = 10

[[runners]]
  name = "docker autoscaler example"
  url = "https://gitlab.com"
  token = "<token>"
  shell = "sh"                                        # use powershell or pwsh for Windows AMIs

  # uncomment for Windows AMIs when the Runner manager is hosted on Linux
  # environment = ["FF_USE_POWERSHELL_PATH_RESOLVER=1"]

  executor = "docker-autoscaler"

  # Docker Executor config
  [runners.docker]
    image = "busybox:latest"

  # 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-docker-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"
GCP

例: GCPインスタンスグループを使用したインスタンスあたり1ジョブ

前提条件:

  • COSなどのDocker EngineがインストールされたVMイメージ。
  • インスタンスグループ。Autoscaling mode “はRunnerがスケーリングを行うので “do not autoscale “を選択します。
  • 適切な権限を持つ IAM ポリシー。

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

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

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

アイドルスケールを5にすると、Runnerは5つのインスタンス全体(インスタンスあたりのキャパシティは1であるため)を将来の需要に備えて利用可能な状態に保とうとします。これらのインスタンスは少なくとも20分間滞在します。

Runnerconcurrent フィールドは 10 (最大インスタンス数 * インスタンスあたりの容量) に設定されます。

concurrent = 10

[[runners]]
  name = "docker autoscaler example"
  url = "https://gitlab.com"
  token = "<token>"
  shell = "sh"                                        # use powershell or pwsh for Windows Images

  # uncomment for Windows Images when the Runner manager is hosted on Linux
  # environment = ["FF_USE_POWERSHELL_PATH_RESOLVER=1"]

  executor = "docker-autoscaler"

  # Docker Executor config
  [runners.docker]
    image = "busybox:latest"

  # 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-docker-instance-group" # GCP Instance Group name
      project          = "my-gcp-project"
      zone             = "europe-west1"
      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"