Docker Machine을 사용한 자동 확장을 위한 GitLab Runner 설치 및 등록
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
Docker Machine executor는 GitLab 17.5에서 지원 중단되었으며 GitLab 20.0(2027년 5월)에 제거될 예정입니다. Docker Machine executor는 오토스케일링을 지원하는 Docker executor의 특별 버전입니다.
Docker Machine executor는 GitLab 17.5에서 지원 중단되었으며 GitLab 20.0(2027년 5월)에 제거될 예정입니다. GitLab 20.0까지 Docker Machine executor를 계속 지원하지만, 새 기능을 추가할 계획은 없습니다. CI/CD 작업 실행을 방해하거나 실행 비용에 영향을 줄 수 있는 치명적인 버그만 처리할 것입니다. Amazon Web Services(AWS) EC2, Microsoft Azure Compute 또는 Google Compute Engine(GCE)에서 Docker Machine executor를 사용하고 있다면 GitLab Runner 오토스케일러로 마이그레이션해야 합니다.
Docker Machine executor는 오토스케일링을 지원하는 Docker executor의 특별 버전입니다. 일반적인 Docker executor처럼 동작하지만, 빌드 호스트는 Docker Machine에 의해 필요 시 생성됩니다. 이로 인해 AWS EC2와 같은 클라우드 환경에서 가변적인 워크로드에 대해 우수한 격리와 확장성을 제공합니다.
자동 확장 아키텍처 개요는 자동 확장에 관한 종합 문서를 참조하세요.
Docker Machine 포크 버전#
Docker는 Docker Machine을 지원 중단했습니다. 그러나
GitLab은 Docker Machine executor에 의존하는 GitLab Runner 사용자를 위해
Docker Machine 포크를 유지 관리합니다.
이 포크는 다음 버그에 대한 추가 패치가 적용된 docker-machine의 최신 main 브랜치를
기반으로 합니다:
- DigitalOcean 드라이버를 RateLimit 인식으로 만들기
- Google 드라이버 작업 확인에 백오프 추가
- 머신 생성을 위한
--google-min-cpu-platform옵션 추가 - Google 드라이버에 캐시된 IP 사용
- AWS 드라이버에 캐시된 IP 사용
- Google Compute Engine에서 GPU 사용 지원 추가
- IMDSv2로 AWS 인스턴스 실행 지원
Docker Machine 포크의 목적은 실행 비용에 영향을 미치는 치명적인 이슈와 버그만 수정하는 것입니다. 새 기능을 추가할 계획은 없습니다.
환경 준비#
자동 확장 기능을 사용하려면 Docker와 GitLab Runner가 동일한 머신에 설치되어야 합니다:
- Docker가 새 머신을 생성하는 배스천 서버 역할을 할 수 있는 새 Linux 기반 머신에 로그인합니다.
- GitLab Runner를 설치합니다.
- Docker Machine 포크에서 Docker Machine을 설치합니다.
- 선택 사항이지만 권장되는 방법으로, 자동 확장 러너와 함께 사용할 프록시 컨테이너 레지스트리와 캐시 서버를 준비합니다.
GitLab Runner 구성#
-
gitlab-runner와 함께docker-machine을 사용하는 핵심 개념을 숙지합니다: -
Docker Machine을 처음 사용할 때는 Docker Machine 드라이버와 함께
docker-machine create ...명령을 수동으로 실행하는 것이 좋습니다.[runners.machine]섹션의 MachineOptions에서 구성하려는 옵션과 함께 이 명령을 실행하세요. 이 방법은 Docker Machine 환경을 올바르게 설정하고 지정된 옵션의 유효성을 검사합니다. 이후docker-machine rm [machine_name]으로 머신을 삭제하고 러너를 시작할 수 있습니다.[!note] 처음 사용 시
docker-machine create에 대한 여러 동시 요청은 좋지 않습니다.docker+machineexecutor를 사용할 때 러너는 몇 가지 동시docker-machine create명령을 실행할 수 있습니다. Docker Machine이 이 환경에 처음인 경우 각 프로세스는 Docker API 인증을 위한 SSH 키와 SSL 인증서를 생성하려고 합니다. 이 작업으로 인해 동시 프로세스가 서로 간섭할 수 있습니다. 이로 인해 작동하지 않는 환경이 될 수 있습니다. 그래서 Docker Machine으로 GitLab Runner를 처음 설정할 때 처음에 수동으로 테스트 머신을 생성하는 것이 중요합니다.- 러너를 등록하고 요청 시
docker+machineexecutor를 선택합니다. config.toml을 편집하여 Docker Machine을 사용하도록 러너를 구성합니다. GitLab Runner 자동 확장에 대한 자세한 정보를 담은 전용 페이지를 방문하세요.- 이제 프로젝트에서 새 파이프라인을 시작해 보세요. 몇 초 후
docker-machine ls를 실행하면 새 머신이 생성되는 것을 볼 수 있습니다.
- 러너를 등록하고 요청 시
GitLab Runner 업그레이드#
-
운영 체제가 GitLab Runner를 자동으로 재시작하도록 구성되어 있는지 확인합니다(예: 서비스 파일 확인):
-
그렇다면, 서비스 매니저가
SIGQUIT를 사용하도록 구성되어 있는지 확인하고 서비스 도구를 사용하여 프로세스를 중지합니다:# systemd의 경우 sudo systemctl stop gitlab-runner # upstart의 경우 sudo service gitlab-runner stop -
그렇지 않다면, 프로세스를 수동으로 중지할 수 있습니다:
sudo killall -SIGQUIT gitlab-runner
SIGQUIT신호를 전송하면 프로세스가 정상적으로 중지됩니다. 프로세스는 새 작업 수락을 중지하고 현재 작업이 완료되는 즉시 종료됩니다. -
-
GitLab Runner가 종료될 때까지 기다립니다.
gitlab-runner status로 상태를 확인하거나 최대 30분 동안 정상 종료를 기다릴 수 있습니다:for i in `seq 1 180`; do # 1800초 = 30분 gitlab-runner status || break sleep 10 done -
이제 실행 중인 작업을 중단하지 않고 새 버전의 GitLab Runner를 안전하게 설치할 수 있습니다.
Docker Machine 포크 버전 사용#
설치#
-
적절한
docker-machine바이너리를 다운로드합니다. 바이너리를PATH에 접근 가능한 위치에 복사하고 실행 가능하게 만듭니다. 예를 들어v0.16.2-gitlab.46를 다운로드하고 설치하려면:curl -O "https://gitlab-docker-machine-downloads.s3.amazonaws.com/v0.16.2-gitlab.46/docker-machine-Linux-x86_64" cp docker-machine-Linux-x86_64 /usr/local/bin/docker-machine chmod +x /usr/local/bin/docker-machine
Google Compute Engine에서 GPU 사용#
GPU는 모든 executor에서 지원됩니다. GPU 지원만을 위해 Docker Machine을 사용할 필요는 없습니다. Docker Machine executor는 GPU 노드를 스케일업 및 스케일다운합니다. 이 목적으로 Kubernetes executor도 사용할 수 있습니다.
Docker Machine 포크를 사용하여 그래픽 처리 장치(GPU)가 있는 Google Compute Engine 인스턴스를 생성할 수 있습니다.
Docker Machine GPU 옵션#
GPU가 있는 인스턴스를 생성하려면 다음 Docker Machine 옵션을 사용하세요:
| 옵션 | 예시 | 설명 |
|---|---|---|
--google-accelerator |
type=nvidia-tesla-p4,count=1 |
인스턴스에 연결할 GPU 가속기의 유형과 수를 지정합니다(type=TYPE,count=N 형식). |
--google-maintenance-policy |
TERMINATE |
Google Cloud는 GPU 인스턴스의 라이브 마이그레이션을 허용하지 않으므로 항상 TERMINATE를 사용하세요. |
--google-machine-image |
https://www.googleapis.com/compute/v1/projects/deeplearning-platform-release/global/images/family/tf2-ent-2-3-cu110 |
GPU 지원 운영 체제의 URL입니다. 사용 가능한 이미지 목록을 참조하세요. |
--google-metadata |
install-nvidia-driver=True |
이 플래그는 이미지에 NVIDIA GPU 드라이버를 설치하도록 지시합니다. |
이 인수들은 gcloud compute에 대한 명령줄 인수에 매핑됩니다.
자세한 내용은 GPU가 연결된 VM 생성에 관한 Google 문서를 참조하세요.
Docker Machine 옵션 검증#
시스템을 준비하고 Google Compute Engine에서 GPU를 생성할 수 있는지 테스트하려면:
-
Docker Machine에 대한 Google Compute Engine 드라이버 자격 증명을 설정합니다. VM에 기본 서비스 계정이 없는 경우 러너에 환경 변수를 내보내야 할 수 있습니다. 이 작업 방식은 러너가 시작되는 방법에 따라 다릅니다. 예를 들어:
systemd또는upstart: 사용자 정의 환경 변수 설정에 관한 문서를 참조하세요.- Helm Chart를 사용한 Kubernetes: the
values.yaml항목을 업데이트하세요. - Docker:
-e옵션을 사용하세요(예:docker run -e GOOGLE_APPLICATION_CREDENTIALS=/path/to/credentials.json gitlab/gitlab-runner).
-
docker-machine이 원하는 옵션으로 가상 머신을 생성할 수 있는지 확인합니다. 예를 들어 단일 NVIDIA Tesla P4 가속기가 있는n1-standard-1머신을 생성하려면test-gpu를 이름으로 대체하고 다음을 실행합니다:docker-machine create --driver google --google-project your-google-project \ --google-disk-size 50 \ --google-machine-type n1-standard-1 \ --google-accelerator type=nvidia-tesla-p4,count=1 \ --google-maintenance-policy TERMINATE \ --google-machine-image https://www.googleapis.com/compute/v1/projects/deeplearning-platform-release/global/images/family/tf2-ent-2-3-cu110 \ --google-metadata "install-nvidia-driver=True" test-gpu -
GPU가 활성화되었는지 확인하려면 머신에 SSH로 접속하여
nvidia-smi를 실행합니다:$ docker-machine ssh test-gpu sudo nvidia-smi +-----------------------------------------------------------------------------+ | NVIDIA-SMI 450.51.06 Driver Version: 450.51.06 CUDA Version: 11.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla P4 Off | 00000000:00:04.0 Off | 0 | | N/A 43C P0 22W / 75W | 0MiB / 7611MiB | 3% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+ -
비용 절감을 위해 이 테스트 인스턴스를 제거합니다:
docker-machine rm test-gpu
GitLab Runner 구성#
-
이러한 옵션을 확인한 후
runners.docker구성에서 사용 가능한 모든 GPU를 사용하도록 Docker executor를 구성합니다. 그런 다음 GitLab Runnerrunners.machine구성의MachineOptions설정에 Docker Machine 옵션을 추가합니다. 예를 들어:[runners.docker] gpus = "all" [runners.machine] MachineOptions = [ "google-project=your-google-project", "google-disk-size=50", "google-disk-type=pd-ssd", "google-machine-type=n1-standard-1", "google-accelerator=count=1,type=nvidia-tesla-p4", "google-maintenance-policy=TERMINATE", "google-machine-image=https://www.googleapis.com/compute/v1/projects/deeplearning-platform-release/global/images/family/tf2-ent-2-3-cu110", "google-metadata=install-nvidia-driver=True" ]
문제 해결#
Docker Machine executor를 사용할 때 다음 이슈가 발생할 수 있습니다.
오류: Error creating machine#
Docker Machine을 설치할 때 ERROR: Error creating machine: Error running provisioning: error installing docker 오류가 발생할 수 있습니다.
Docker Machine은 다음 스크립트를 사용하여 새로 프로비저닝된 가상 머신에 Docker를 설치하려고 합니다:
if ! type docker; then curl -sSL "https://get.docker.com" | sh -; fi
docker 명령이 성공하면 Docker Machine은 Docker가 설치되어 있다고 가정하고 계속합니다.
성공하지 못하면 Docker Machine은 https://get.docker.com의 스크립트를 다운로드하여 실행하려고 합니다. 설치가 실패하면 운영 체제가 Docker에서 더 이상 지원하지 않을 수 있습니다.
이 이슈를 해결하려면 GitLab Runner가 설치된 환경에서 MACHINE_DEBUG=true를 설정하여
Docker Machine에서 디버깅을 활성화할 수 있습니다.
오류: Cannot connect to the Docker daemon#
prepare 단계에서 다음 오류 메시지와 함께 작업이 실패할 수 있습니다:
Preparing environment
ERROR: Job failed (system failure): prepare environment: Cannot connect to the Docker daemon at tcp://10.200.142.223:2376. Is the docker daemon running? (docker.go:650:120s). Check https://docs.gitlab.com/runner/shells/#shell-profile-loading for more information
이 오류는 Docker Machine executor가 생성한 VM에서 Docker 데몬이 예상 시간 내에 시작하지 못할 때 발생합니다. 이 이슈를 해결하려면
[runners.docker] 섹션에서
wait_for_services_timeout 값을 늘리세요.
