인스턴스 실행기

인스턴스 실행기는 실행기이며, 자동 확장 기능이 활성화되어 있어 런너 관리자가 처리하는 예상 작업량에 맞추어 인스턴스를 온디맨드로 생성합니다.

작업이 호스트 인스턴스, 운영 체제 및 연결된 장치에 대한 전체 액세스가 필요할 때 인스턴스 실행기를 사용할 수 있습니다. 인스턴스 실행기는 다양한 수준의 분리 및 보안을 갖춘 단일 및 다중 테넌트 작업을 수용하도록 구성할 수 있습니다.

중첩 가상화

인스턴스 실행기는 GitLab에서 개발한 중첩 데몬을 지원합니다. 중첩 데몬은 격리되고 짧은 수명의 작업과 같은 미리 구성된 가상 머신을 호스트 시스템에서 생성하고 삭제할 수 있게 해줍니다. 중첩은 Apple Silicon 인스턴스에서만 지원됩니다.

자동 확장을 위한 환경 준비

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

  1. 런너 관리자가 설치되고 구성된 대상 플랫폼에 대한 임시 플러그인 설치.
  2. 사용 중인 플랫폼에 대한 VM 이미지를 생성합니다. 이미지는 다음을 포함해야 합니다:
    • Git
    • GitLab Runner

      참고: 가상 머신에 GitLab Runner 바이너리를 설치하고, 작업 아티팩트 및 캐시를 처리하기 위해 실행기를 기본 경로에 두어야 합니다. 가상 머신에서 GitLab Runner 서비스를 구성하거나 시작할 필요는 없습니다.

    • 실행할 계획인 작업에 필요한 종속성

실행기를 자동 확장으로 구성

전제 조건:

  • 관리자가 되어야 합니다.

인스턴스 실행기를 자동 확장을 위해 구성하려면 config.toml의 다음 섹션을 업데이트하세요:

idle_count 및 사전 차단 모드

임시 및 작업 조정기가 있는 경우:

  • idle_count0보다 클 경우, 사전 차단 모드가 활성화됩니다. 런너 관리자는 유휴 인스턴스가 사용 가능할 때까지 새로운 CI/CD 작업을 요청하지 않습니다. 이 모드에서 CI/CD 작업은 거의 즉시 실행됩니다.

  • idle_count0일 경우, 사전 차단 모드가 비활성화됩니다. 런너 관리자는 유휴 인스턴스가 이러한 작업을 실행할 수 있는지 여부에 관계없이 새로운 CI/CD 작업을 요청합니다. 작업의 수는 max_instancescapacity_per_instance를 기준으로 합니다. 이 모드에서 CI/CD 작업의 시작 시간이 느려집니다. 새로운 인스턴스를 프로비전할 수 없을 수도 있으며, 따라서 CI/CD 작업이 실행되지 않을 수도 있습니다.

AWS 자동 확장 그룹 구성 예시

인스턴스당 하나의 작업

전제 조건:

  • git 및 GitLab Runner가 설치된 AMI.
  • AWS 자동 확장 그룹. 스케일링 정책에 none 사용. 런너가 스케일링을 처리합니다.
  • 올바른 권한을 가진 IAM 정책.

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

  • 각 인스턴스에 대한 용량 1.
  • 사용 횟수 1.
  • 유휴 스케일 5.
  • 유휴 시간 20분.
  • 최대 인스턴스 수 10.

각 작업은 다른 작업에 의해 영향을 받을 수 없는 안전한 임시 인스턴스를 제공합니다. 작업이 완료되면, 해당 작업이 실행된 인스턴스는 즉시 삭제됩니다.

각 인스턴스의 용량이 1이고, 유휴 스케일이 5일 때, 런너는 향후 수요에 대해 5개의 전체 인스턴스를 유지합니다. 이 인스턴스는 최소 20분 동안 유지됩니다.

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

concurrent = 10

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

  executor = "instance"

  # 자동 확장기 구성
  [runners.autoscaler]
    plugin = "aws" # GitLab 16.11 및 이후 버전에서는 `gitlab-runner fleeting install`을 실행하여 플러그인을 자동으로 설치해야 합니다.

    # GitLab 16.10 및 이전 버전에서는 플러그인을 수동으로 설치하고 다음을 사용하세요:
    # 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"

인스턴스당 5개의 작업, 무제한 사용

전제 조건:

  • git 및 GitLab Runner가 설치된 AMI.
  • 스케일링 정책이 none으로 설정된 AWS Auto Scaling 그룹. 러너가 스케일링을 처리합니다.
  • 정확한 권한이 있는 IAM 정책.

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

  • 각 인스턴스에 대한 용량 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 = "aws" # GitLab 16.11 및 이후 버전에서 플러그인을 자동으로 설치하려면 `gitlab-runner fleeting install`을 실행하세요.

    # GitLab 16.10 및 이전 버전에서 플러그인을 수동으로 설치하고 사용하세요:
    # 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"

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

전제 조건:

  • 중첩 가상화Tart가 설치된 Apple Silicon AMI.
  • 러너가 사용하는 Tart VM 이미지. VM 이미지는 작업의 image 키워드로 지정됩니다. VM 이미지는 git 및 GitLab Runner가 설치되어 있어야 합니다.
  • AWS Auto Scaling 그룹. 스케일링 정책으로 none을 사용하세요. 러너가 스케일링을 처리하기 때문입니다. MacOS용 ASG를 설정하는 방법에 대한 정보는 EC2 Mac 인스턴스에 대한 자동 스케일링 구현을 참조하세요.
  • 정확한 권한이 있는 IAM 정책.

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

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

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

유휴 스케일이 2일 때, 사용 중인 용량이 2보다 낮을 때마다 유휴 용량 2를 수용하기 위해 1개의 유휴 인스턴스가 생성됩니다(각 인스턴스의 용량 때문). 유휴 인스턴스는 최소 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 = ["*"] # 모든 중첩 이미지를 허용

  [runners.autoscaler]
    capacity_per_instance = 2 # AppleSilicon은 호스트당 2개의 VM만 지원 가능
    max_use_count = 0
    max_instances = 4

    plugin = "aws" # GitLab 16.11 및 이후 버전에서 플러그인을 자동으로 설치하려면 `gitlab-runner fleeting install`을 실행하세요.

    # GitLab 16.10 및 이전 버전에서 플러그인을 수동으로 설치하고 사용하세요:
    # 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가 설치된 사용자 정의 이미지.
  • Autoscaling 모드가 do not autoscale로 설정된 Google Cloud 인스턴스 그룹. Runner가 스케일링을 처리합니다.
  • 올바른 권한이 있는 IAM 정책입니다. GKE 클러스터에 Runner를 배포하는 경우 Kubernetes 서비스 계정과 GCP 서비스 계정 간의 IAM 바인딩을 추가할 수 있습니다. 이 바인딩을 iam.workloadIdentityUser 역할로 추가하여 GCP에 인증할 수 있습니다. 대신 credentials_file을 사용하여 키 파일을 사용할 수 있습니다.

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

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

용량과 사용 횟수가 모두 1로 설정되면 각 작업에 대해 다른 작업에 영향을 받지 않는 보안 임시 인스턴스가 제공됩니다. 작업이 완료되면 실행된 인스턴스는 즉시 삭제됩니다.

유휴 스케일이 5로 설정되면 Runner는 향후 수요에 대비하여 5개의 인스턴스를 유지합니다(각 인스턴스당 용량이 1이기 때문입니다). 이러한 인스턴스는 최소 20분 동안 유지됩니다.

Runner의 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" # for >= 16.11, ensure you run `gitlab-runner fleeting install` to automatically install the plugin

    # for versions < 17.0, manually install the plugin and use:
    # 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"

인스턴스당 5개 작업, 무제한 사용, Google Cloud 인스턴스 그룹 사용

필수 조건:

  • git와 GitLab Runner가 설치된 사용자 정의 이미지.
  • 인스턴스 그룹. “Autoscaling mode”에서 “do not autoscale”을 선택하십시오. Runner가 스케일링을 처리합니다.
  • 올바른 권한을 가진 IAM 정책입니다.

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

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

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

이러한 환경에서 실행되는 작업은 신뢰할 수 있는 것으로 간주되어야 합니다. 왜냐하면 그들 간의 격리가 거의 없기 때문에 하나의 작업이 다른 작업의 성능에 영향을 미칠 수 있습니다.

유휴 스케일이 5로 설정되면 5의 유휴 용량을 수용하기 위해 1개의 유휴 인스턴스가 생성됩니다(각 인스턴스당 용량 때문에) 인스턴스가 사용 중인 용량이 5보다 낮을 때마다. 유휴 인스턴스는 최소 20분 동안 유지됩니다.

Runner의 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" # for >= 16.11, ensure you run `gitlab-runner fleeting install` to automatically install the plugin

    # for versions < 17.0, manually install the plugin and use:
    # 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로 설정되면, 러너는 향후 수요를 위해 5개의 인스턴스를 유지합니다(인스턴스당 용량이 1이기 때문에). 이러한 인스턴스는 최소 20분 동안 유지됩니다.

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

concurrent = 10

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

  executor = "instance"

  # Autoscaler config
  [runners.autoscaler]
    plugin = "azure" # for >= 16.11, ensure you run `gitlab-runner fleeting install` to automatically install the plugin

    # for versions < 17.0, manually install the plugin and use:
    # plugin = "fleeting-plugin-azure"

    capacity_per_instance = 1
    max_use_count = 1
    max_instances = 10

    [runners.autoscaler.plugin_config] # plugin specific configuration (see plugin documentation)
      name                = "my-linux-scale-set" # Azure scale set name
      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"

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

사전 요구 사항:

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

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

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

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

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

유휴 스케일이 5로 설정되면, 5의 유휴 용량을 수용하기 위해 1개의 유휴 인스턴스가 생성됩니다(인스턴스당 용량 때문). 사용 중인 용량이 5보다 낮을 때 유휴 인스턴스가 유지됩니다. 유휴 인스턴스는 최소 20분 동안 유지됩니다.

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

concurrent = 50

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

  executor = "instance"

  # Autoscaler config
  [runners.autoscaler]
    plugin = "azure" # for >= 16.11, ensure you run `gitlab-runner fleeting install` to automatically install the plugin

    # for versions < 17.0, manually install the plugin and use:
    # plugin = "fleeting-plugin-azure"

    capacity_per_instance = 5
    max_use_count = 0
    max_instances = 10

    [runners.autoscaler.plugin_config] # plugin specific configuration (see plugin documentation)
      name                = "my-windows-scale-set" # Azure scale set name
      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"

문제 해결

Instance executor로 작업할 때 다음 문제를 겪을 수 있습니다:

sh: 1: eval: Running on ip-x.x.x.x via runner-host...n: not found

이 오류는 일반적으로 준비 단계에서 eval 명령이 실패할 때 발생합니다. 이 오류를 해결하려면 bash 셸로 전환하고 기능 플래그 FF_USE_NEW_BASH_EVAL_STRATEGY를 활성화하세요.