GitLab Runner를 설치하고 Docker Machine을 사용하여 자동 스케일링 등록하기


Tier: Free, Premium, Ultimate
Offering: GitLab.com, Self-managed
  • 자동 스케일링 기능은 GitLab Runner 1.1.0에서 도입되었습니다.

참고:
Docker Machine executor는 GitLab 17.5에서 사용 중단되었습니다.
AWS(Amazon Web Services) EC2, Microsoft Azure Compute, 또는 Google Compute Engine (GCE)에서 Docker Machine executor를 사용 중이라면 GitLab Runner Autoscaler로 이주하십시오.

자동 확장 아키텍처에 대한 개요는 자동 확장에 대한 포괄적인 문서를 참조하십시오.

Docker Machine의 포크 버전

Docker는 Docker Machine을 사용 안 함을 공지했습니다. 그러나, Docker Machine executor를 사용하는 GitLab Runner 사용자를 위해 GitLab은 Docker Machine 포크를 유지합니다. 이 포크는 main 브랜치의 docker-machine을 기반으로 하며 다음과 같은 버그에 대한 몇 가지 추가 패치가 있습니다:

Docker Machine 포크의 의도는 운영 비용에 영향을 미치는 심각한 문제와 버그만 수정하는 것입니다. 새로운 기능은 추가되지 않을 것입니다.

환경 준비

자동 확장 기능을 사용하려면 Docker 및 GitLab Runner가 동일한 머신에 설치되어 있어야 합니다:

  1. Docker가 새로운 머신으로부터 새로운 머신을 생성할 bastion 서버로 사용할 수 있도록 Linux 기반 새 머신에 로그인합니다.
  2. GitLab Runner 설치.
  3. Docker Machine fork에서 Docker Machine 설치
  4. 선택적으로 권장되는대로 프록시 컨테이너 레지스트리 및 캐시 서버를 준비합니다. 이것은 자동 확장 러너와 함께 사용될 수 있습니다.

GitLab Runner 구성

  1. gitlab-runnerdocker-machine을 사용하는 핵심 개념을 숙지합니다:
  2. Docker Machine을 처음 사용하는 경우, Docker Machine Driver와 함께 docker-machine create ... 명령을 수동으로 실행하는 것이 가장 좋습니다. 이 명령은 [runners.machine] 섹션 아래의 MachineOptions을 구성할 의도로 실행됩니다. 이것은 Docker Machine 환경을 올바르게 설정하며 지정된 옵션을 검증하기에 좋습니다. 이후에 docker-machine rm [machine_name]를 사용하여 머신을 제거하고 러너를 시작할 수 있습니다.

    참고:
    docker-machine create로 여러 동시 요청을 하면 좋지 않습니다. docker+machine executor를 사용할 때 러너는 몇 개의 동시 docker-machine create 명령을 실행할 수 있습니다. Docker Machine이 이 환경에서 이전에 사용되지 않았다면 각 시작된 프로세스는 SSH 키와 SSL 인증서(자동 확장된 스폰 된 머신에서 GitLab Runner와 Docker Engine 간의 Docker API 인증을 위해)를 준비하려고 시도하고 이러한 동시 프로세스는 서로 방해합니다. 이것은 작동하지 않는 환경으로 끝날 수 있습니다. 따라서 Docker Machine을 사용하는 경우, 매우 처음에는 수동으로 테스트 머신을 만드는 것이 중요합니다.

  3. 러너 등록 및 요청 시 docker+machine executor 선택.
  4. config.toml 파일을 편집하고 러너가 Docker 머신을 사용하도록 구성합니다. [GitLab Runner Autoscaling]에 대해 자세한 정보가 포함된 전용 페이지를 방문하십시오.
  5. 이제 프로젝트에서 새 파이프라인을 시작해볼 수 있습니다. 몇 초 후에 docker-machine ls를 실행하면 새 머신이 생성되는 것을 볼 수 있어야 합니다.

GitLab Runner 업그레이드

  1. 운영 체제가 GitLab Runner를 자동으로 다시 시작하도록 구성되어 있는지 확인합니다(예: 해당 서비스 파일을 확인하여).
    • 구성되어 있는 경우, 서비스 관리자가 SIGQUIT를 사용하도록 구성하고 프로세스를 중지하도록 할 수 있습니다:

      # systemd의 경우
      sudo systemctl stop gitlab-runner
      
      # upstart의 경우
      sudo service gitlab-runner stop
      
    • 구성되어 있지 않은 경우, 프로세스를 수동으로 중지할 수 있습니다:

      sudo killall -SIGQUIT gitlab-runner
      

    참고:
    SIGQUIT 신호를 보내면 프로세스가 정상적으로 중지됩니다. 프로세스는 새 작업을 수락하지 않고 현재 작업이 완료되는대로 종료됩니다.

  2. GitLab Runner가 종료될 때까지 기다립니다. gitlab-runner status를 사용하여 상태를 확인하거나 다음 명령을 사용하여 30분간 우아한 종료를 기다릴 수 있습니다:

    for i in `seq 1 180`; do # 1800초 = 30분
        gitlab-runner status || break
        sleep 10
    done
    
  3. 이제 새 버전의 GitLab Runner를 안전하게 설치할 수 있으며 작업을 중지시키지 않습니다.

forked 버전의 Docker Machine 사용

설치

  1. 적절한 docker-machine 이진 파일을 다운로드합니다.
    해당 이진 파일을 PATH에서 접근 가능한 위치로 복사하고 실행 가능하도록 만듭니다. 예를 들어, v0.16.2-gitlab.29를 다운로드하고 설치하려면 다음을 실행합니다:

     curl -O "https://gitlab-docker-machine-downloads.s3.amazonaws.com/v0.16.2-gitlab.29/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는 모든 에그제큐터에서 지원됩니다. GPU 지원을 위해 Docker Machine을 사용할 필요는 없습니다. Docker Machine 에그제큐터를 사용하면 GPU 노드의 스케일 업 및 다운이 쉬워지지만, 이는 Kubernetes 에그제큐터로도 수행할 수 있습니다.

Docker Machine의 fork을 사용하여 Google Compute Engine 인스턴스에 그래픽 처리 장치(GPU)를 만들 수 있습니다. Docker Executor에서 GPU가 작동하려면 GitLab Runner 13.9가 필요합니다.

Docker Machine GPU 옵션

GPU를 사용하는 인스턴스를 만들려면 다음 Docker Machine 옵션을 사용합니다:

옵션 예시 설명
--google-accelerator type=nvidia-tesla-p4,count=1 인스턴스에 연결할 GPU 가속기의 유형 및 수를 지정합니다(type=TYPE,count=N 형식)
--google-maintenance-policy TERMINATE GPU 인스턴스의 라이브 마이그레이션을 허용하지 않는 Google Cloud이기 때문에 항상 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 생성에 관한 구글 문서를 참조하세요.

Docker Machine 옵션 확인

시스템을 준비하고 Google Compute Engine에서 GPU를 만들 수 있는지 테스트하려면 다음을 수행합니다:

  1. Docker Machine을 위해 Google Compute Engine 드라이버 자격 증명을 설치합니다. VM에 기본 서비스 계정이 없으면 실행자에게 환경 변수를 내보내야할 수 있습니다. 실행자가 어떻게 시작되었는지에 따라 수행 방법이 달라집니다.

  2. docker-machine이 원하는 옵션으로 가상 머신을 생성할 수 있는지 확인합니다. 예를 들어, test-gpu 대신 원하는 이름으로 n1-standard-1 머신 및 단일 NVIDIA Tesla P4 가속기를 만들려면 다음을 실행합니다:

    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
    
  3. 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                                                 |
    +-----------------------------------------------------------------------------+
    
  4. 비용을 절약하기 위해 이 테스트 인스턴스를 제거합니다:

    docker-machine rm test-gpu
    

GitLab 러너 구성

  1. 이러한 옵션을 확인한 후, runners.docker 구성에서 Docker 실행자를 구성하여 모든 사용 가능한 GPU를 사용하도록합니다. 그런 다음, GitLab 러너 runners.machine 구성의 MachineOptions 설정에 Docker 머신 옵션을 추가합니다. 예를 들어:

    [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 실행자를 사용할 때 다음과 같은 문제가 발생할 수 있습니다.

ERROR: 머신 생성 오류

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 러너가 설치된 환경에서 MACHINE_DEBUG=true를 설정하여 Docker Machine의 디버깅을 활성화할 수 있습니다.