- 중첩 가상화
- 오토스케일을 위한 환경 준비
- 오토스케일링을 위한 실행 인스턴스 구성
idle_count
와 선제 방식- AWS 오토스케일링 그룹 구성 예제
- 구글 클라우드 인스턴스 그룹 구성 예시
- Azure 스케일 세트 구성 예시
- 문제 해결
실행 인스턴스
- 실험으로 GitLab Runner 15.11.0에 도입됨.
- GitLab Runner 16.6에서 베타로 변경됨.
- GitLab Runner 17.1에서 일반적으로 사용 가능해짐.
실행 인스턴스(executor)는 러너 매니저가 처리하는 작업의 예상 볼륨을 수용하기 위해 필요에 따라 인스턴스를 생성하는 오토스케일 기능이 추가된 실행 인스턴스입니다.
작업이 호스트 인스턴스, 운영 체제 및 연결된 장치에 완전한 액세스가 필요한 경우 실행 인스턴스를 사용할 수 있습니다. 실행 인스턴스는 단일 및 다중 테넌트 작업을 독립성과 보안 수준이 다른 여러 수준으로 설정할 수도 있습니다.
중첩 가상화
실행 인스턴스는 GitLab에서 개발한 중첩 데몬을 사용한 중첩 가상화를 지원합니다. 중첩 데몬은 작업과 같이 격리되고 일시적인 워크로드에 사용되는 호스트 시스템에서 미리 구성된 가상 머신의 생성 및 삭제를 가능케 합니다. 중첩은 Apple Silicon 인스턴스에서만 지원됩니다.
오토스케일을 위한 환경 준비
오토스케일을 위한 환경을 준비하려면:
- 러너 매니저가 설치되고 구성된 대상 플랫폼에 맞는 일시적 플러그인을 설치합니다.
- 사용할 플랫폼에 대한 VM 이미지를 생성합니다. 이미지에는 다음이 포함되어야 합니다:
- Git
-
GitLab Runner
참고: 가상 머신에 GitLab Runner 바이너리를 설치하고 실행하여 작업 아티팩트 및 캐시를 처리할 수 있지만, 가상 머신에서 GitLab Runner 서비스 자체를 구성하거나 시작할 필요는 없습니다.
- 실행할 작업에서 필요한 종속성
오토스케일링을 위한 실행 인스턴스 구성
전제 조건:
- 관리자 권한이 있어야 합니다.
오토스케일링을 위해 실행 인스턴스를 구성하려면 config.toml
의 다음 섹션을 업데이트합니다.:
idle_count
와 선제 방식
일시적 및 작업 스케일러(fleeting and taskscaler)와 함께:
-
idle_count
가0
보다 크면 선제 모드가 활성화됩니다. 러너 매니저는 유휴 인스턴스를 사용할 때까지 새 CI/CD 작업을 요청하지 않습니다. 이 모드에서 CI/CD 작업은 거의 즉시 실행됩니다. -
idle_count
가0
이면 선제 모드가 비활성화됩니다. 러너 매니저는 유휴 인스턴스의 유무에 관계없이 새 CI/CD 작업을 요청합니다. 작업 수는max_instances
와capacity_per_instance
에 따라 결정됩니다. 이 모드에서 CI/CD 작업의 시작 시간은 느릴 수 있습니다. 또한 새로운 인스턴스를 프로비저닝할 수 없어 CI/CD 작업이 실행되지 않을 수도 있습니다.
AWS 오토스케일링 그룹 구성 예제
인스턴스 당 작업 한 개
전제 조건:
- 적어도
git
와 GitLab Runner가 설치된 AMI(아마존 머신 이미지). - 스케일링 정책에
없음
을 설정한 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" # 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"
인스턴스 당 다섯 개의 작업 및 무제한 사용
전제 조건:
- 적어도
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 = "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 오토스케일링 그룹 이름
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 인스턴스에서의 중첩 가상화
사전 요구 사항:
- nesting 및 Tart이 설치된 Apple Silicon AMI.
- 실행 중인 러너가 사용하는 Tart VM 이미지. VM 이미지는 작업의
이미지
키워드로 지정됩니다. VM 이미지에는 적어도git
및 GitLab Runner가 설치되어 있어야 합니다. - AWS 자동 스케일링 그룹. 스케일링 정책에는 러너가 스케일링을 처리하므로
none
을 사용합니다. MacOS용 ASG 설정 방법은 EC2 Mac 인스턴스에 대한 자동 스케일링 구현을 참조하세요. - 올바른 권한이 있는 IAM 정책.
이 구성은 다음을 지원합니다:
- 각 인스턴스당
2
의 용량. - 무제한 사용 횟수.
- 격리된 작업을 지원하기 위한 중첩 가상화. 중첩 가상화는 nesting가 설치된 Apple Silicon 인스턴스에서만 사용할 수 있습니다.
-
5
의 유휴 스케일. - 20분의 유휴 시간.
- 최대 인스턴스 수는
10
입니다.
각 인스턴스의 용량이 2
이고 사용 횟수가 무제한이면, 각 인스턴스는 평생동안 2개의 작업을 동시에 실행합니다.
유휴 스케일이 2
인 경우, 사용 중인 용량이 2 미만일 때 유휴 용량에 맞춰 1개의 유휴 인스턴스가 생성됩니다.
유휴 인스턴스는 적어도 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 = ["*"] # 어떤 nesting 이미지든 허용됨
[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"
구글 클라우드 인스턴스 그룹 구성 예시
구글 클라우드 인스턴스 그룹을 사용하여 인스턴스당 하나의 작업
사전 요구 사항:
- 적어도
git
와 GitLab Runner가 설치된 사용자 정의 이미지. - 자동 스케일링 모드가
자동 스케일링하지 않음
으로 설정된 구글 클라우드 인스턴스 그룹. 러너가 스케일링을 처리합니다. -
올바른 권한이 있는 IAM 정책.
러너를 GKE 클러스터에 배포하는 경우 Kubernetes 서비스 계정과 GCP 서비스 계정 간의 IAM 바인딩을 추가할 수 있습니다.
iam.workloadIdentityUser
역할을 사용하여 GCP에 인증하는 경우credentials_file
을 사용하는 대신 키 파일을 사용하지 않도록 설정할 수 있습니다.
이 구성은 다음을 지원합니다:
- 각 인스턴스당 용량이 1
- 사용 횟수 1
- 유휴 스케일 5
- 유휴 시간 20분
- 최대 인스턴스 수는 10
용량과 사용 횟수가 각각 1
로 설정된 경우, 각 작업은 다른 작업에 영향을 받지 않는 안전한 임시 인스턴스를 받습니다. 작업이 완료되면 실행된 인스턴스가 즉시 삭제됩니다.
유휴 스케일이 5
로 설정된 경우, 러너는 20분 이상 지속되는 미래 요구를 위해 5개의 인스턴스를 유지합니다 (인스턴스당 용량이 1이므로).
러너 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가 설치된 사용자 정의 이미지 - 인스턴스 그룹. “자동 스케일링 모드”에 “자동 스케일링 사용 안 함”을 선택하고, Runner가 스케일링을 처리하도록 함
- 올바른 권한을 가진 IAM 정책
이 구성은 다음을 지원합니다:
- 인스턴스 당 용량은 5
- 무제한 사용 횟수
- 5의 유휴 스케일
- 20분의 유휴 시간
- 최대 인스턴스 수는 10
용량이 5
로 설정되고 사용 횟수가 무제한이면, 각 인스턴스는 수명 동안 동시에 5개의 작업을 실행합니다.
이러한 환경에서 실행된 작업은 상호 간에 격리가 적고 각 작업이 다른 작업의 성능에 영향을 줄 수 있으므로 신뢰할 수 있는 작업이어야 합니다.
유휴 스케일이 5
로 설정된 경우, 사용 중인 용량이 5보다 적을 때(인스턴스 당 용량 때문에) 1개의 유휴 인스턴스가 생성됩니다. 유휴 인스턴스는 최소 20분간 지속됩니다.
Runner의 concurrent
필드는 50으로 설정됩니다(최대 인스턴스 수 * 인스턴스 당 용량).
concurrent = 50
[[runners]]
name = "인스턴스 오토스케일러 예시"
url = "https://gitlab.com"
token = "<토큰>"
shell = "sh"
executor = "instance"
# 오토스케일러 구성
[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 = "내 윈도우 인스턴스 그룹" # 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가 설치된 사용자 정의 이미지 - “자동 스케일링 모드”가
수동
으로 설정된 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 = "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 = "내 리눅스 스케일 세트" # 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 인스턴스 그룹 사용
전제 조건:
- 적어도
git
및 GitLab Runner가 설치된 사용자 정의 이미지 - “자동 스케일링 모드”가
수동
으로 설정된 Azure 스케일 세트. Runner가 스케일링을 처리하도록 함
이 구성은 다음을 지원합니다:
- 인스턴스 당 용량은 5
- 무제한 사용 횟수
- 5의 유휴 스케일
- 20분의 유휴 시간
- 최대 인스턴스 수는 10
용량이 5
로 설정되고 사용 횟수가 무제한이면, 각 인스턴스는 수명 동안 동시에 5개의 작업을 실행합니다.
이러한 환경에서 실행된 작업은 상호 간에 격리가 적고 각 작업이 다른 작업의 성능에 영향을 줄 수 있으므로 신뢰할 수 있는 작업이어야 합니다.
유휴 스케일이 5
로 설정된 경우, 사용 중인 용량이 5보다 적을 때(인스턴스 당 용량 때문에) 1개의 유휴 인스턴스가 생성됩니다. 유휴 인스턴스는 최소 20분간 지속됩니다.
Runner의 concurrent
필드는 50으로 설정됩니다(최대 인스턴스 수 * 인스턴스 당 용량).
concurrent = 50
[[runners]]
name = "인스턴스 오토스케일러 예시"
url = "https://gitlab.com"
token = "<토큰>"
shell = "sh"
executor = "instance"
# 오토스케일러 구성
[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 = "내 윈도우 스케일 세트" # Azure 스케일 세트 이름
subscription_id = "9b3c4602-cde2-4089-bed8-889e5a3e7102"
resource_group_name = "내-리소스-그룹"
[runners.autoscaler.connector_config]
username = "Administrator"
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
를 활성화하세요.