인스턴스 실행기

Status: Beta

인스턴스 실행기는 러너 관리자가 처리하는 작업의 예상 볼륨을 수용하기 위해 필요에 따라 인스턴스를 생성하는 자동 확장이 가능한 실행기입니다.

작업이 호스트 인스턴스, 운영 체제 및 연결된 장치에 완전한 액세스가 필요할 때 인스턴스 실행기를 사용할 수 있습니다. 또한 인스턴스 실행기를 확장하여 단일 및 다중 테넌트 작업을 여러 수준의 격리 및 보안으로 수용할 수 있습니다.

중첩 가상화

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

자동 확장을 위한 환경 준비

자동 확장을 위한 환경을 준비하려면:

  1. 대상 플랫폼에 대한 일시적 플러그인을 설치합니다.
  2. 사용할 플랫폼에 대해 VM 이미지를 만듭니다. 이미지에는 다음이 포함되어야 합니다:
    • Git
    • GitLab Runner
    • 실행할 작업에 필요한 의존성

실행기를 자동 확장하도록 구성

사전 요구 사항:

  • 관리자이어야 합니다.

인스턴스 실행기를 자동 확장하려면 config.toml의 다음 섹션을 업데이트합니다:

AWS 자동 확장 그룹 구성 예시

인스턴스 당 하나의 작업

사전 요구 사항:

  • 적어도 git 및 GitLab Runner가 설치된 AMI.
  • 크기 조정 정책에 none을 사용하는 AWS 자동 확장 그룹. 러너가 크기 조정을 처리합니다.
  • 올바른 권한을 가진 IAM 정책.

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

  • 각 인스턴스의 수용량:1
  • 사용 횟수:1
  • 유휴 배율:5
  • 유휴 시간: 20분
  • 최대 인스턴스 수: 10

각 작업에 1의 수용량과 사용 횟수가 설정되어 있고, 각 작업은 다른 작업에 영향을 받지 않는 안전한 일시적 인스턴스를 받습니다. 작업이 완료되면 실행된 인스턴스가 즉시 삭제됩니다.

각 인스턴스의 수용량이 1이고, 유휴 배율이 5인 경우, 러너는 미래 수요를 고려하여 5개의 완전한 인스턴스를 유지합니다. 이러한 인스턴스는 최소 20분간 유지됩니다.

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

concurrent = 10

[[runners]]
  name = "인스턴스 자동 확장기 예시"
  url = "https://gitlab.com"
  token = "<토큰>"
  shell = "sh"
  
  executor = "instance"
  
  # 자동 확장 구성
  [runners.autoscaler]
    plugin = "aws" # 16.11 이상의 경우, 플러그인을 자동으로 설치하려면 `gitlab-runner fleeting install`을 실행합니다
    
    # 17.0 미만의 경우, 플러그인을 매뉴얼으로 설치하고 다음을 사용합니다:
    # plugin = "fleeting-plugin-aws"
    
    capacity_per_instance = 1
    max_use_count = 1
    max_instances = 10
    
    [runners.autoscaler.plugin_config] # 플러그인 별 구성 (플러그인 설명서 참조)
      name             = "my-linux-asg"                # AWS 자동 확장 그룹 이름
      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"
## 1 인스턴스 당 5개의 작업 및 무제한 사용

사전 요구 사항:

- 적어도 `git` 및 GitLab Runner가 설치된 AMI.
- 크기 조정 정책이 `none`으로 설정된 AWS 자동 확장 그룹. 러너가 크기 조정을 처리합니다.
- [올바른 권한](https://gitlab.com/gitlab-org/fleeting/fleeting-plugin-aws#recommended-iam-policy)을 가진 IAM 정책.

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

- 각 인스턴스의 수용량:`5`
- 무제한 사용 횟수
- 유휴 배율:`5`
- 유휴 시간: 20분
- 최대 인스턴스 수: `10`

각 인스턴스의 수용량이 `5`이고 사용 횟수가 무제한인 경우, 각 인스턴스는 수명 동안 5개의 작업을 동시에 실행합니다.

유휴 배율이 `5`인 경우, 사용 중인 용량이 5보다 작을 때마다(각 인스턴스의 수용량으로 인해) 1개의 유휴 인스턴스가 생성됩니다. 유휴 인스턴스는 적어도 20분간 유지됩니다.

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

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

```toml
concurrent = 50

[[runners]]
  name = "인스턴스 자동 확장기 예시"
  url = "https://gitlab.com"
  token = "<토큰>"
  shell = "sh"
  
  executor = "instance"
  
  # 자동 확장 구성
  [runners.autoscaler]
    plugin = "aws" # 16.11 이상의 경우, 플러그인을 자동으로 설치하려면 `gitlab-runner fleeting install`을 실행합니다
    
    # 17.0 미만의 경우, 플러그인을 매뉴얼으로 설치하고 다음을 사용합니다:
    # plugin = "fleeting-plugin-aws"
    
    capacity_per_instance = 5
    max_use_count = 0
    max_instances = 10
    
    [runners.autoscaler.plugin_config] # 플러그인 별 구성 (플러그인 설명서 참조)
      name             = "my-windows-asg"              # AWS 자동 확장 그룹 이름
      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 인스턴스에서 중첩 가상화

사전 요구 사항:

- [중첩](https://gitlab.com/gitlab-org/fleeting/nesting)[Tart](https://github.com/cirruslabs/tart)이 설치된 Apple Silicon AMI.
- 러너가 사용하는 Tart VM 이미지. VM 이미지는 작업의 `이미지` 키워드로 지정됩니다. VM 이미지에는 최소한 `git` 및 GitLab Runner가 설치되어 있어야 합니다.
- 크기 조정 정책이 `none`으로 설정된 AWS 자동 확장 그룹. 러너가 크기 조정을 처리합니다. MacOS에 대한 ASG 구성 방법에 대한 정보는 [EC2 Mac 인스턴스에 대한 자동 확장 구현](https://aws.amazon.com/blogs/compute/implementing-autoscaling-for-ec2-mac-instances/)을 참조하십시오.
- [올바른 권한](https://gitlab.com/gitlab-org/fleeting/fleeting-plugin-aws#recommended-iam-policy)을 가진 IAM 정책.

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

- 각 인스턴스의 수용량:`2`
- 무제한 사용 횟수
- 중첩 가상화를 지원하기 위한 Apple Silicon 인스턴스에서 가능한 경우
- 유휴 배율:`5`
- 유휴 시간: 24시간
- 최대 인스턴스 수: `10`

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

유휴 배율이 `2`인 경우, 사용 중인 용량이 2보다 작을 때마다(각 인스턴스의 수용량으로 인해) 1개의 유휴 인스턴스가 생성됩니다. 유휴 인스턴스는 적어도 24시간간 유지됩니다. 이 시간은 AWS MacOS 인스턴스 호스트의 24시간 최소 할당 기간 때문입니다.

이 환경에서 실행되는 작업은 [중첩](https://gitlab.com/gitlab-org/fleeting/nesting)을 사용하여 각 작업에 대한 중첩 가상화를 지원하기 때문에 **신뢰할 수 없는** 작업일 필요가 없습니다. 이 기능은 Apple Silicon 인스턴스에서만 작동합니다.

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

```toml
concurrent = 8

[[runners]]
  name = "macos applesilicon 자동 확장기 예시"
  url = "https://gitlab.com"
  token = "<토큰>"
  executor = "instance"
  
  [runners.instance]
    allowed_images = ["*"] # 모든 중첩 이미지 허용
  
  [runners.autoscaler]
    capacity_per_instance = 2 # AppleSilicon은 호스트 당 2개의 VM을 지원합니다
    max_use_count = 0
    max_instances = 4
    
    plugin = "aws" # 16.11 이상의 경우, 플러그인을 자동으로 설치하려면 `gitlab-runner fleeting install`을 실행합니다
    
    # 17.0 미만의 경우, 플러그인을 매뉴얼으로 설치하고 다음을 사용합니다:
    # 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 = "nested-vm-username"
      password = "nested-vm-password"
      timeout  = "20m"

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

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

전제 조건:

  • 적어도 git 및 GitLab Runner가 설치된 사용자 정의 이미지
  • 자동 스케일링 모드가 자동 스케일링 안 함으로 설정된 Google Cloud 인스턴스 그룹. Runner가 스케일링을 처리함.
  • 올바른 권한을 가진 IAM 정책

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

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

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

유휴 스케일이 5로 설정되면 러너는 미래 수요를 대비하여 5개의 인스턴스를 유지합니다 (인스턴스 당 용량이 1이기 때문).

이러한 인스턴스는 적어도 20분 동안 유지됩니다.

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

concurrent = 10

[[runners]]
  name = "instance autoscaler example"
  url = "https://gitlab.com"
  token = "<token>"
  shell = "sh"
  
  executor = "instance"
  
  # Autoscaler config
  [runners.autoscaler]
    plugin = "googlecloud" # 16.11 이상의 경우, 플러그인을 자동으로 설치하려면 `gitlab-runner fleeting install`을 실행합니다.
    
    # 17.0 미만의 경우, 플러그인을 매뉴얼으로 설치하고 다음을 사용합니다.
    # plugin = "fleeting-plugin-googlecompute"
    
    capacity_per_instance = 1
    max_use_count = 1
    max_instances = 10
    
    [runners.autoscaler.plugin_config] # 플러그인별 구성 (플러그인 설명서 참조)
      name             = "my-linux-instance-group" # Google Cloud 인스턴스 그룹 이름
      project          = "my-gcp-project"
      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가 설치된 사용자 정의 이미지
  • 인스턴스 그룹. “자동 스케일링 모드”에서 “자동 스케일링 안 함” 선택(러너가 스케일링을 처리함).
  • 올바른 권한을 가진 IAM 정책

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

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

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

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

유휴 스케일이 5로 설정되면 사용중인 용량이 5보다 작을 때(인스턴스 당 용량으로 인해) 1개의 유휴 인스턴스가 생성되어 유휴 용량 5를 수용합니다. 유휴 인스턴스는 적어도 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 = "googlecloud" # 16.11 이상의 경우, 플러그인을 자동으로 설치하려면 `gitlab-runner fleeting install`을 실행합니다.
    
    # 17.0 미만의 경우, 플러그인을 매뉴얼으로 설치하고 다음을 사용합니다.
    # plugin = "fleeting-plugin-googlecompute"
    
    capacity_per_instance = 5
    max_use_count = 0
    max_instances = 10
    
    [runners.autoscaler.plugin_config] # 플러그인별 구성 (플러그인 설명서 참조)
      name             = "my-windows-instance-group" # Google Cloud 인스턴스 그룹 이름
      project          = "my-gcp-project"
      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가 설치된 사용자 정의 이미지
  • 자동 스케일링 모드가 매뉴얼으로 설정된 Azure 스케일 세트. Runner가 스케일링을 처리함.

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

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

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

유휴 스케일이 5로 설정되면 러너는 미래 수요를 대비하여 5개의 인스턴스를 유지합니다 (인스턴스 당 용량이 1이기 때문).

이러한 인스턴스는 적어도 20분 동안 유지됩니다.

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

concurrent = 10

[[runners]]
  name = "instance autoscaler example"
  url = "https://gitlab.com"
  token = "<token>"
  shell = "sh"
  
  executor = "instance"
  
  # Autoscaler config
  [runners.autoscaler]
    plugin = "azure" # 16.11 이상의 경우, 플러그인을 자동으로 설치하려면 `gitlab-runner fleeting install`를 실행합니다.
    
    # 17.0 미만의 경우, 플러그인을 매뉴얼으로 설치하고 다음을 사용합니다.
    # plugin = "fleeting-plugin-azure"
    
    capacity_per_instance = 1
    max_use_count = 1
    max_instances = 10
    
    [runners.autoscaler.plugin_config] # 플러그인별 구성 (플러그인 설명서 참조)
      name                = "my-linux-scale-set" # Azure 스케일 세트 이름
      subscription_id     = "9b3c4602-cde2-4089-bed8-889e5a3e7102"
      resource_group_name = "my-resource-group"
    
    [runners.autoscaler.connector_config]
      username               = "runner"
      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"

인스턴스 당 다섯 개의 작업, 무제한 사용 횟수, Azure 스케일 세트 사용

전제 조건:

  • 적어도 git 및 GitLab Runner가 설치된 사용자 정의 이미지
  • 자동 스케일링 모드가 매뉴얼으로 설정된 Azure 스케일 세트. Runner가 스케일링을 처리함.

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

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

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

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

유휴 스케일이 5로 설정되면 사용중인 용량이 5보다 작을 때(인스턴스 당 용량으로 인해) 1개의 유휴 인스턴스가 생성되어 유휴 용량 5를 수용합니다. 유휴 인스턴스는 적어도 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 = "azure" # 16.11 이상의 경우, 플러그인을 자동으로 설치하려면 `gitlab-runner fleeting install`를 실행합니다.
    
    # 17.0 미만의 경우, 플러그인을 매뉴얼으로 설치하고 다음을 사용합니다.
    # 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를 활성화하세요.