- 중첩 가상화
- 자동 확장을 위한 환경 준비
- 실행기를 자동 확장하도록 구성
- AWS 자동 확장 그룹 구성 예시
- Google Cloud 인스턴스 그룹 구성 예제
- Azure 스케일 세트 구성 예제
- 문제 해결
인스턴스 실행기
- 실험으로 GitLab Runner 15.11.0에 소개되었습니다.
- Beta로 GitLab Runner 16.6에서 변경되었습니다.
인스턴스 실행기는 러너 관리자가 처리하는 작업의 예상 볼륨을 수용하기 위해 필요에 따라 인스턴스를 생성하는 자동 확장이 가능한 실행기입니다.
작업이 호스트 인스턴스, 운영 체제 및 연결된 장치에 완전한 액세스가 필요할 때 인스턴스 실행기를 사용할 수 있습니다. 또한 인스턴스 실행기를 확장하여 단일 및 다중 테넌트 작업을 여러 수준의 격리 및 보안으로 수용할 수 있습니다.
중첩 가상화
인스턴스 실행기는 GitLab이 개발한 중첩 데몬을 사용하여 중첩 가상화를 지원합니다. 중첩 데몬은 작업과 같이 격리되고 일시적인 워크로드에 사용되는 호스트 시스템에서 사전 구성된 가상 머신의 생성 및 삭제를 가능하게 합니다. 중첩은 Apple Silicon 인스턴스에서만 지원됩니다.
자동 확장을 위한 환경 준비
자동 확장을 위한 환경을 준비하려면:
- 대상 플랫폼에 대한 일시적 플러그인을 설치합니다.
- 사용할 플랫폼에 대해 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
를 활성화하세요.