인스턴스 실행기

Status: Beta
  • GitLab Runner 15.11.0에서 Experiment로 소개되었습니다.
  • GitLab Runner 16.6에서 Beta변경되었습니다.

인스턴스 실행기는 러너 매니저에서 처리하는 작업의 예상 볼륨을 수용하기 위해 필요에 따라 인스턴스를 생성하는 autoscale을 지원하는 실행기입니다.

호스트 인스턴스, 운영 체제, 및 연결된 장치에 대한 완전한 액세스가 필요한 작업에 인스턴스 실행기를 사용할 수 있습니다. 인스턴스 실행기는 또한 단일 및 멀티테넌트 작업을 여러 수준의 격리 및 보안에 맞게 구성할 수 있습니다.

중첩 가상화

인스턴스 실행기는 GitLab에서 개발한 중첩 데몬을 사용하여 중첩 가상화를 지원합니다. 중첩 데몬은 작업과 같은 격리되고 단기적인 워크로드용으로 호스트 시스템에 사전 구성된 가상 머신의 생성 및 삭제를 가능하게 합니다. 중첩은 Apple Silicon 인스턴스에서만 지원됩니다.

autoscaling을 위한 환경 준비

대상 플랫폼에서 스케일링을 가능하게 하려면 AWS, Google Cloud, 또는 Azure fleeting 플러그인을 설치해야 합니다. AWS 플러그인은 Beta 상태입니다. Google Cloud와 Azure 플러그인은 Experiments 상태입니다.

GitLab에서 개발한 다른 공식 플러그인의 경우, fleeting 프로젝트를 참조하십시오.

autoscaling을 위한 환경을 준비하려면 다음을 수행하세요:

  1. 호스트 플랫폼용 이진 파일을 설치합니다:
  2. 플러그인 바이너리가 PATH 환경 변수를 통해 발견 가능한지 확인합니다.
  3. 사용할 작업에 필요한 Git, GitLab Runner, 및 종속성이 포함된 플랫폼용 VM 이미지를 생성합니다.

실행기를 autoscaling 환경에 구성

전제 조건:

  • 관리자여야 합니다.

인스턴스 실행기를 autoscaling을 위해 구성하려면 config.toml의 다음 섹션을 업데이트하십시오:

AWS autoscaling 그룹 구성 예시

한 인스턴스 당 하나의 작업

전제 조건:

  • 최소한 git 및 GitLab Runner가 설치된 AMI.
  • AWS Autoscaling 그룹. 스케일링 정책으로 none을 사용합니다. 러너가 스케일링을 처리합니다.
  • 올바른 권한을 가진 IAM 정책.

이 구성은 다음을 지원합니다:

  • 각 인스턴스의 용량은 1입니다.
  • 사용 횟수는 1입니다.
  • idle scale이 5입니다.
  • 대기 시간은 20분입니다.
  • 최대 인스턴스 수는 10입니다.

인스턴스의 용량과 사용 횟수가 각각 1로 설정되어 있으면 각 작업에 안전한 일회성 인스턴스가 제공됩니다. 작업이 완료되면 해당 작업이 실행된 인스턴스가 즉시 삭제됩니다.

각 인스턴스의 용량이 1이고 idle scale이 5인 경우 러너는 미래 수요에 대비하여 5개의 완전한 인스턴스를 유지합니다. 이러한 인스턴스는 적어도 20분간 유지됩니다.

러너 concurrent 필드는 10(인스턴스 당 용량 * 최대 인스턴스 수)로 설정됩니다.

concurrent = 10

[[runners]]
  name = "인스턴스 자동 스케일러 예제"
  url = "https://gitlab.com"
  token = "<token>"
  shell = "sh"

  executor = "인스턴스"

  # 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 그룹 이름
      profile          = "default"                     # 선택 사항, 기본값은 'default'
      config_file      = "/home/user/.aws/config"      # 선택 사항, 기본값은 '~/.aws/config'
      credentials_file = "/home/user/.aws/credentials" # 선택 사항, 기본값은 '~/.aws/credentials'

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

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

한 인스턴스당 다섯 개의 작업과 사용 횟수 무제한

전제 조건:

  • 적어도 git과 GitLab Runner가 설치된 AMI.
  • 스케일링 정책이 none으로 설정된 AWS Auto Scaling 그룹. 러너가 스케일링을 처리합니다.
  • 올바른 권한을 갖춘 IAM 정책.

이 구성은 다음을 지원합니다:

  • 각 인스턴스의 용량이 5이고, 무제한 사용 횟수.
  • 5의 유휴 규모.
  • 20분의 유휴 시간.
  • 최대 인스턴스 수는 10입니다.

인스턴스 당 용량이 5로 설정되고 사용 횟수가 무제한이면, 각 인스턴스는 수명 동안 동시에 5개의 작업을 실행합니다.

유휴 규모가 5이면, 사용 중인 용량이 5 미만일 때 (각 인스턴스의 용량 때문에) 유휴 인스턴스가 만들어져 유휴 시간 동안 유지됩니다. 유휴 인스턴스는 최소 20분 동안 유지됩니다.

이러한 환경에서 실행된 작업은 서로 간의 격리가 적으므로 신뢰할 수 있는 작업이어야 합니다.

런너 concurrent 필드는 50으로 설정됩니다(최대 인스턴스 수 * 인스턴스당 용량).

concurrent = 50

[[runners]]
  name = "인스턴스 오토스케일러 예시"
  url = "https://gitlab.com"
  token = "<token>"
  shell = "sh"
  executor = "instance"

  [runners.autoscaler]
    plugin = "fleeting-plugin-aws"

    capacity_per_instance = 5
    max_use_count = 0
    max_instances = 10

    [runners.autoscaler.plugin_config] # 플러그인별 구성 (플러그인 문서 참조)
      name             = "my-windows-asg"              # AWS Auto Scaling 그룹 이름
      profile          = "default"                     # 선택 사항, 기본값은 'default'
      config_file      = "/home/user/.aws/config"      # 선택 사항, 기본값은 '~/.aws/config'
      credentials_file = "/home/user/.aws/credentials" # 선택 사항, 기본값은 '~/.aws/credentials'

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

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

한 인스턴스당 두 개의 작업, 사용 횟수 무제한, EC2 Mac 인스턴스에서 중첩 가상화

전제 조건:

  • nestingTart이 설치된 Apple Silicon AMI.
  • 러너가 사용하는 Tart VM 이미지. VM 이미지는 작업의 image 키워드로 지정됩니다. VM 이미지에는 적어도 git과 GitLab Runner가 설치되어 있어야 합니다.
  • AWS Auto Scaling 그룹. 스케일링 정책에는 러너가 스케일링을 처리하기 때문에 none을 사용합니다.
  • 올바른 권한을 갖춘 IAM 정책.

이 구성은 다음을 지원합니다:

  • 각 인스턴스의 용량이 2이며, 무제한 사용 횟수.
  • 중첩 가상화를 지원하기 위한 삽입된 가상화. 중첩 가상화는 nesting이 설치된 Apple Silicon 인스턴스에서만 사용할 수 있습니다.
  • 2의 유휴 규모.
  • 20분의 유휴 시간.
  • 최대 인스턴스 수는 10입니다.

인스턴스 당 용량이 2이며 사용 횟수가 무제한일 때, 각 인스턴스는 수명 동안 동시에 2개의 작업을 실행합니다.

유휴 규모가 2이면, 사용 중인 용량이 2 미만일 때 (각 인스턴스의 용량 때문에) 유휴 인스턴스가 만들어져 유휴 시간 동안 유지됩니다. 유휴 인스턴스는 적어도 24시간 동안 유지됩니다. 이 시간은 AWS MacOS 인스턴스 호스트의 24시간 최소 할당 기간 때문입니다.

이 환경에서 실행된 작업은 nesting을 사용하여 중첩 가상화하므로 신뢰할 필요가 없습니다. 이것은 Apple Silicon 인스턴스에서만 작동합니다.

런너 concurrent 필드는 8로 설정됩니다(최대 인스턴스 수 * 인스턴스당 용량).

concurrent = 8

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

  [runners.instance]
    allowed_images = ["*"] # 모든 삽입 이미지 허용

  [runners.autoscaler]
    capacity_per_instance = 2 # AppleSilicon 호스트 당 2개의 VM을 지원합니다
    max_use_count = 0
    max_instances = 4

    plugin = "fleeting-plugin-aws"

    [[runners.autoscaler.policy]]
      idle_count = 2
      idle_time  = "24h" # AWS의 MacOS 인스턴스

    [runners.autoscaler.connector_config]
      username = "ec2-user"
      key_path = "macos-key.pem"
      timeout  = "1h" # MacOS 인스턴스에 연결하는 데 시간이 걸릴 수 있습니다. 프로비저닝이 느릴 수도 있습니다.

    [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 = "중첩-VM-사용자명"
      password = "중첩-VM-암호"
      timeout  = "20m"

Google Cloud 인스턴스 그룹 구성 예시

Google Cloud 인스턴스 그룹을 사용하여 인스턴스당 하나의 작업 수행

전제 조건:

  • 적어도 git 및 GitLab Runner가 설치된 사용자 정의 이미지
  • Auto Scaling 모드가 자동 스케일링하지 않음으로 설정된 Google Cloud 인스턴스 그룹. Runner가 스케일링을 처리합니다.
  • 올바른 권한을 갖춘 IAM 정책

이 구성은 다음을 지원합니다:

  • 인스턴스당 용량 1
  • 사용 횟수 1
  • 유휴 규모 5
  • 유휴 시간 20분
  • 최대 인스턴스 수 10

용량과 사용 횟수가 모두 1로 설정되면 각 작업에 안전한 순간적 인스턴스가 할당되어 다른 작업에 영향을 받지 않습니다. 작업이 완료되면 해당 인스턴스가 즉시 삭제됩니다.

유휴 규모가 5로 설정되면, Runner는 향후 수요를 대비하여 5개의 인스턴스를 유지합니다(인스턴스당 용량이 1이기 때문). 이러한 인스턴스는 적어도 20분간 유지됩니다.

Runner의 concurrent 필드는 10으로 설정됩니다(최대 인스턴스 수 * 인스턴스당 용량).

concurrent = 10

[[runners]]
  name = "인스턴스 오토스케일러 예시"
  url = "https://gitlab.com"
  token = "<토큰>"
  shell = "sh"

  executor = "instance"

  # 오토스케일러 구성
  [runners.autoscaler]
    plugin = "fleeting-plugin-googlecompute"

    capacity_per_instance = 1
    max_use_count = 1
    max_instances = 10

    [runners.autoscaler.plugin_config] # 플러그인별 구성 (플러그인 설명서 참조)
      name             = "내-linux-인스턴스-그룹" # Google Cloud 인스턴스 그룹 이름
      project          = "내-gcp-프로젝트"
      zone             = "europe-west1-c"
      credentials_file = "/home/user/.config/gcloud/application_default_credentials.json" # 선택 사항, 기본값은 '~/.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"

인스턴스당 다섯 개의 작업, 무제한 사용 횟수, Google Cloud 인스턴스 그룹 사용

전제 조건:

  • 적어도 git 및 GitLab Runner가 설치된 사용자 정의 이미지
  • 인스턴스 그룹. “자동 스케일링 모드”에서 “자동 스케일링하지 않음” 선택. Runner가 스케일링을 처리합니다.
  • 올바른 권한을 갖춘 IAM 정책

이 구성은 다음을 지원합니다:

  • 인스턴스당 용량 5
  • 사용 횟수 무제한
  • 유휴 규모 5
  • 유휴 시간 20분
  • 최대 인스턴스 수 10

용량이 5로 설정되고 사용 횟수가 무제한이면 각 인스턴스는 동시에 5개의 작업을 수행합니다.

이러한 환경에서 실행되는 작업은 신뢰할 수 있는 작업이어야 하며 서로 간에 거의 격리되지 않기 때문에 각 작업이 다른 작업의 성능에 영향을 줄 수 있습니다.

유휴 규모가 5로 설정되면, 사용 중인 용량이 5 미만일 때, 1개의 유휴 인스턴스가 만들어지고 (인스턴스당 용량으로 인해) 유휴 용량 5에 대해 적어도 20분간 유지됩니다.

Runner의 concurrent 필드는 50으로 설정됩니다(최대 인스턴스 수 * 인스턴스당 용량).

concurrent = 50

[[runners]]
  name = "인스턴스 오토스케일러 예시"
  url = "https://gitlab.com"
  token = "<토큰>"
  shell = "sh"

  executor = "instance"

  # 오토스케일러 구성
  [runners.autoscaler]
    plugin = "fleeting-plugin-googlecompute"

    capacity_per_instance = 5
    max_use_count = 0
    max_instances = 10

    [runners.autoscaler.plugin_config] # 플러그인별 구성 (플러그인 설명서 참조)
      name             = "내-windows-인스턴스-그룹" # Google Cloud 인스턴스 그룹 이름
      project          = "내-gcp-프로젝트"
      zone             = "europe-west1-c"
      credentials_file = "/home/user/.config/gcloud/application_default_credentials.json" # 선택 사항, 기본값은 '~/.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 스케일 세트 구성 예시

Azure 스케일 세트를 사용하여 인스턴스당 하나의 작업 수행

전제 조건:

  • 적어도 git 및 GitLab Runner가 설치된 사용자 정의 이미지
  • Auto Scaling 모드가 수동으로 설정된 Azure 스케일 세트. Runner가 스케일링을 처리합니다.

이 구성은 다음을 지원합니다:

  • 인스턴스당 용량 1
  • 사용 횟수 1
  • 유휴 규모 5
  • 유휴 시간 20분
  • 최대 인스턴스 수 10

용량과 사용 횟수가 모두 1로 설정되면 각 작업에 안전한 순간적 인스턴스가 할당되어 다른 작업에 영향을 받지 않습니다. 작업이 완료되면 해당 인스턴스가 즉시 삭제됩니다.

유휴 규모가 5로 설정되면, Runner는 향후 수요를 대비하여 5개의 인스턴스를 유지합니다(인스턴스당 용량이 1이기 때문). 이러한 인스턴스는 적어도 20분간 유지됩니다.

Runner의 concurrent 필드는 10으로 설정됩니다(최대 인스턴스 수 * 인스턴스당 용량).

concurrent = 10

[[runners]]
  name = "인스턴스 오토스케일러 예시"
  url = "https://gitlab.com"
  token = "<토큰>"
  shell = "sh"

  executor = "instance"

  # 오토스케일러 구성
  [runners.autoscaler]
    plugin = "fleeting-plugin-azure"

    capacity_per_instance = 1
    max_use_count = 1
    max_instances = 10

    [runners.autoscaler.plugin_config] # 플러그인별 구성 (플러그인 설명서 참조)
      name                = "내-linux-스케일-세트" # Azure 스케일 세트 이름
      subscription_id     = "9b3c4602-cde2-4089-bed8-889e5a3e7102"
      resource_group_name = "내-리소스-그룹"

    [runners.autoscaler.connector_config]
      username               = "runner"
      password               = "내-스케일-세트-정적-암호"
      use_static_credentials = true
      timeout                = "10m"
      use_external_addr      = true

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

인스턴스 당 다섯 개의 작업, 무제한 사용, Google Cloud Instance 그룹 사용

필수 조건:

  • 적어도 git 및 GitLab Runner가 설치된 사용자 정의 이미지.
  • 오토스케일링 모드가 수동으로 설정된 Azure 스케일 세트. 러너가 스케일링을 처리합니다.

이 구성은 다음을 지원합니다:

  • 인스턴스당 용량 5
  • 무제한 사용 횟수
  • 5의 유휴 규모
  • 20분의 유휴 시간
  • 최대 인스턴스 수 10

용량이 5로 설정되고 사용 횟수가 무제한이면 각 인스턴스는 수명 동안 동시에 5개의 작업을 실행합니다.

이러한 환경에서 실행되는 작업은 신뢰할 수 있어야 합니다. 각 작업 간에는 거의 격리가 없으며 각 작업은 다른 작업의 성능에 영향을 줄 수 있습니다.

유휴 규모가 5로 설정되면 사용 중인 용량이 5보다 낮을 때 (인스턴스당 용량으로 인해) 유휴 용량 5를 수용하기 위해 1개의 유휴 인스턴스가 만들어집니다. 유휴 인스턴스는 적어도 20분 동안 유지됩니다.

러너의 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-azure"

    capacity_per_instance = 5
    max_use_count = 0
    max_instances = 10

    [runners.autoscaler.plugin_config] # 플러그인별 구성 (플러그인 설명 참조)
      name                = "my-windows-scale-set" # Azure 스케일 세트 이름
      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 셸로 전환하고 기능 플래그 FF_USE_NEW_BASH_EVAL_STRATEGY를 활성화하세요.