인스턴스 실행기

Status: Beta
  • 실험으로 GitLab Runner 15.11.0에 처음 소개되었습니다.
  • GitLab Runner 16.6에서 베타변경되었습니다.

인스턴스 실행기는 러너 관리자가 처리하는 작업의 예상 볼륨을 수용하기 위해 필요한 작업당 호스트 인스턴스, 운영 체제 및 연결된 장치에 완전한 액세스를 필요로 하는 실행기입니다.

작업이 호스트 인스턴스, 운영 체제 및 장치에 완전한 액세스가 필요한 경우 인스턴스 실행기를 사용할 수 있습니다. 또한 인스턴스 실행기는 단일 및 다중 테넌트 작업을 다양한 격리 및 보안 수준으로 구성할 수 있습니다.

중첩 가상화

인스턴스 실행기는 GitLab에서 개발한 중첩 데몬을 사용한 중첩 가상화를 지원합니다. 중첩 데몬을 사용하면 격리되고 단기간의 작업에 사용되는 호스트 시스템에 사전 구성된 가상 머신을 만들고 삭제할 수 있습니다. 중첩은 Apple Silicon 인스턴스에서만 지원됩니다.

환경을 자동 확장하기 위한 준비

대상 플랫폼에 대한 확장을 활성화하려면 AWS, Google Cloud 또는 Azure fleeting 플러그인을 설치하십시오. AWS 플러그인은 베타 상태입니다. Google Cloud 및 Azure 플러그인은 실험 상태입니다.

GitLab에서 개발한 기타 공식 플러그인에 대해서는 fleeting 프로젝트를 참조하십시오.

환경을 자동으로 확장하려면 다음 단계를 수행하십시오:

  1. 호스트 플랫폼용 바이너리를 설치하십시오:
  2. 플러그인 바이너리가 PATH 환경 변수를 통해 찾을 수 있도록 확인하십시오.
  3. 사용할 작업에 필요한 Git, GitLab Runner 및 의존성이 포함된 플랫폼용 VM 이미지를 만드십시오.

실행기를 자동으로 구성

준비 사항:

  • 관리자이어야 합니다.

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

AWS 자동 확장 그룹 구성 예시

인스턴스 당 하나의 작업

준비 사항:

  • 적어도 git 및 GitLab Runner가 설치된 AMI.
  • AWS 자동 확장 그룹. 확장 정책에 none을 사용하십시오. 러너가 확장을 처리합니다.
  • 올바른 권한을 갖춘 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 = "fleeting-plugin-aws"
    
    각_인스턴스의_용량 = 1
    최대_사용_횟수 = 1
    최대_인스턴스_수 = 10
    
    [runners.autoscaler.plugin_config] # 플러그인 특정 구성 (플러그인 설명서 참조)
      name             = "내-linux-asg"                # AWS 자동 확장 그룹 이름
      profile          = "기본값"                     # 선택 사항, 기본값은 '기본값'
      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 자동 확장 그룹. 러너가 확장을 처리합니다.
  • 올바른 권한을 갖춘 IAM 정책.

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

  • 각 인스턴스에 대한 용량은 5.
  • 사용 횟수에 제한이 없습니다.
  • 유휴 배율은 5.
  • 유휴 시간은 20분.
  • 최대 인스턴스 수는 10.

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

유휴 배율이 5이므로 사용 중인 용량이 5 미만인 경우(각 인스턴스 용량으로 인해) 유휴할 수 있는 인스턴스가 1개 생성됩니다. 유휴 인스턴스는 적어도 20분 동안 유지됩니다.

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

러너의 concurrent 필드를 50으로 설정합니다 (최대 인스턴스 수 * 각 인스턴스의 용량).

concurrent = 50

[[runners]]
  name = "인스턴스 자동 스케일러 예시"
  url = "https://gitlab.com"
  token = "<토큰>"
  shell = "sh"
  
  executor = "instance"
  
  # 자동 스케일러 설정
  [runners.autoscaler]
    plugin = "fleeting-plugin-aws"
    
    각_인스턴스의_용량 = 5
    최대_사용_횟수 = 0
    최대_인스턴스_수 = 10
    
    [runners.autoscaler.plugin_config] # 플러그인 특정 구성 (플러그인 설명서 참조)
      name             = "내-windows-asg"              # AWS 자동 확장 그룹 이름
      profile          = "기본값"                     # 선택 사항, 기본값은 '기본값'
      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.
  • Runner가 사용하는 Tart VM 이미지. VM 이미지는 작업의 image 키워드로 지정됩니다. VM 이미지에는 적어도 git 및 GitLab Runner가 설치되어 있어야 합니다.
  • AWS Autoscaling 그룹. 스케일링 정책에는 러너가 스케일을 처리하므로 none을 사용하십시오. MacOS에 대한 ASG 설정 방법은 EC2 Mac 인스턴스에 대한 자동 조정 구현을 참조하십시오.
  • 올바른 권한이 있는 IAM 정책.

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

  • 각 인스턴스에 대해 2의 용량.
  • 무제한 사용 횟수.
  • 격리된 작업을 지원하기 위한 중첩 가상화. 중첩 가상화는 nesting이 설치된 Apple Silicon 인스턴스에서만 사용할 수 있습니다.
  • 5의 유휴 스케일.
  • 20분의 유휴 시간.
  • 최대 인스턴스 개수는 10.

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

유휴 스케일이 2일 때 사용 가능한 용량이 2 미만인 경우(인스턴스당 용량으로 인해), 유휴 인스턴스가 생성되어 대기 중인 용량 2개를 수용합니다. 유휴 인스턴스는 최소 24시간 이상 유지됩니다. 이 시간은 AWS MacOS 인스턴스 호스트의 최소 24시간 할당 기간 때문입니다.

이 환경에서 실행되는 작업은 각 작업에 대해 중첩 가상화를 사용하므로 신뢰할 필요가 없습니다. 이는 Apple Silicon 인스턴스에서만 작동합니다.

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

Google 클라우드 인스턴스 그룹 구성 예시

Google 클라우드 인스턴스 그룹을 사용하여 인스턴스 당 하나의 작업

필수 사항:

  • 적어도 git 및 GitLab Runner가 설치된 사용자 정의 이미지.
  • Google 클라우드 인스턴스 그룹을 사용하고 있는 경우 스케일링 모드가 자동 조정하지 않음으로 설정되어 있어야 합니다. 러너가 스케일을 처리합니다.
  • 올바른 권한이 있는 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 = "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" # Google Cloud 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"

Google 클라우드 인스턴스 그룹을 사용하여 인스턴스 당 다섯 개의 작업

필수 사항:

  • 적어도 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 = "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" # Google Cloud 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"

Azure 스케일 세트 구성 예시

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

전제 조건:

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

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

  • 인스턴스 당 처리 능력 1
  • 사용 횟수 1
  • 5분 후 비활성 상태로 전환
  • 20분 후 폐기 비활성
  • 최대 인스턴스 개수 10

처리 능력과 사용 횟수 모두 1로 설정되면 각 작업은 다른 작업에 영향을받지 않는 안전한 짧은 인스턴스를 사용합니다. 작업이 완료되면 실행된 인스턴스는 즉시 삭제됩니다.

비활성 상태로 설정된 가용 인스턴스가 5개인 경우(인스턴스 당 처리 능력이 1이기 때문에), 러너는 후속 수요를 위해 5개의 인스턴스를 유지합니다. 이러한 인스턴스는 적어도 20분 동안 유지됩니다.

러너 ‘concurrent’ 필드는 10(최대 인스턴스 수 * 인스턴스 당 처리 능력)로 설정됩니다.

concurrent = 10

[[runners]]
  name = "인스턴스 자동 스케일러 예시"
  url = "https://gitlab.com"
  token = "<token>"
  shell = "sh"
  
  executor = "instance"
  
  # 자동 스케일러 구성
  [runners.autoscaler]
    plugin = "fleeting-plugin-azure"
    
    인스턴스  처리 능력 = 1
    최대 사용 횟수 = 1
    최대 인스턴스 = 10
    
    [runners.autoscaler.plugin_config] # 플러그인별 구성 (플러그인 설명 참조)
      name                = "내 리눅스 스케일 세트" # Azure 스케일 세트 이름
      구독 ID     = "9b3c4602-cde2-4089-bed8-889e5a3e7102"
      리소스 그룹 이름 = "내 리소스 그룹"
    
    [runners.autoscaler.connector_config]
      사용자 이름          = "러너"
      암호         = "내 스케일 세트 정적 암호"
      정적 자격 증명 사용 = true
      타임아웃               = "10분"
      외부 주소 사용     = true
    
    [[runners.autoscaler.policy]]
      비활성 카운트 = 5
      비활성 시간 = "20m0s"

인스턴스 그룹을 사용하여 인스턴스 당 다섯 개의 작업, 무제한 사용 수

전제 조건:

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

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

  • 인스턴스 당 처리 능력 5
  • 무제한 사용 횟수
  • 5분 후 비활성 상태로 전환
  • 20분 후 폐기 비활성
  • 최대 인스턴스 개수 10

처리 능력을 5로 설정하고 사용 횟수를 무제한으로 설정할 경우 각 인스턴스는 수명 동안 5개의 작업을 동시에 실행합니다.

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

비활성 상태로 설정된 가용 인스턴스가 5인 경우(인스턴스 당 처리 능력 때문에), 미사용 용량이 5개 미만일 때 1개의 비활성 인스턴스가 만들어집니다. 비활성 인스턴스는 적어도 20분 동안 유지됩니다.

러너 ‘concurrent’ 필드는 50(최대 인스턴스 수 * 인스턴스 당 처리 능력)로 설정됩니다.

concurrent = 50

[[runners]]
  name = "인스턴스 자동 스케일러 예시"
  url = "https://gitlab.com"
  token = "<token>"
  shell = "sh"
  
  executor = "instance"
  
  # 자동 스케일러 구성
  [runners.autoscaler]
    plugin = "fleeting-plugin-azure"
    
    인스턴스  처리 능력 = 5
    최대 사용 횟수 = 0
    최대 인스턴스 = 10
    
    [runners.autoscaler.plugin_config] # 플러그인별 구성 (플러그인 설명 참조)
      name                = "내 윈도우 스케일 세트" # Azure 스케일 세트 이름
      구독 ID     = "9b3c4602-cde2-4089-bee8-889e5a3e7102"
      리소스 그룹 이름 = "내 리소스 그룹"
    
    [runners.autoscaler.connector_config]
      사용자 이름               = "관리자"
      암호         = "내 스케일 세트 정적 암호"
      정적 자격 증명 사용   = true
      타임아웃                     = "10분"
      외부 주소 사용         = true
    
    [[runners.autoscaler.policy]]
      비활성 카운트 = 5
      비활성 시간 = "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를 활성화하세요.