GitLab Runner을 Docker Machine과 함께 자동 스케일링하고 등록하기

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-Managed
  • Autoscaling 기능은 GitLab Runner 1.1.0에서 소개되었습니다.

자동스케일 아키텍처에 대한 개요는 자동스케일링에 대한 종합 문서를 참조하십시오.

포크된 Docker Machine 버전

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

Docker Machine fork의 의도는 실행 비용에 영향을 주는 중요한 문제와 버그만 수정하는 것입니다. 새로운 기능은 추가되지 않을 것입니다.

환경 준비

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

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

GitLab Runner 구성

  1. docker-machinegitlab-runner와 함께 사용하는 기본 개념에 익숙해집니다:
  2. 처음 사용하는 경우, Docker Machine Driver를 사용하여 docker-machine create ... 명령어를 매뉴얼으로 실행하는 것이 가장 좋습니다. ‘MachineOptions‘에서 구성할 옵션으로 이 명령을 실행합니다. 이는 Docker Machine 환경을 올바르게 설정하고 지정된 옵션의 유효성을 검증하는 좋은 방법입니다. 이후에 docker-machine rm [machine_name] 명령을 사용하여 머신을 파괴하고 러너를 시작할 수 있습니다.

    note
    첫 사용 시 docker-machine create에 대한 여러 동시 요청은 좋지 않습니다. docker+machine executor를 사용할 때, 러너가 몇 개의 동시 docker-machine create 명령을 시작할 수 있습니다. Docker Machine이 이 환경에서 이전에 사용되지 않았다면, 각 시작된 프로세스는 SSH 키와 SSL 인증서 (자동으로 생성되는 러너와 Docker Engine 간의 Docker API 인증을 위한) 를 준비하려고 하며, 이러한 동시 프로세스들은 서로 방해를 줍니다. 이는 동작하지 않는 환경으로 끝날 수 있습니다. 따라서 Docker Machine을 GitLab Runner 설정과 함께 최초 매뉴얼으로 테스트 머신을 생성하는 것이 중요합니다.
  3. 러너 등록 및 요청 시 docker+machine executor를 선택합니다.
  4. config.toml 파일을 편집하고 러너가 Docker Machine을 사용하도록 구성합니다. 자세한 정보는 GitLab Runner 자동 스케일링을 포함한 전용 페이지를 방문하십시오.
  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
      
    note
    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를 설치할 수 있으며, 작업을 중단시키지 않고도 안전하게 진행할 수 있습니다.

포크된 Docker Machine 버전 사용

설치

  1. 적절한 docker-machine 이진 파일을 다운로드합니다. 이진 파일을 PATH에 접근 가능한 위치로 복사하고 실행 가능하게 만듭니다. 예를 들어, v0.16.2-gitlab.25를 다운로드하고 설치하는 경우:

     curl -O "https://gitlab-docker-machine-downloads.s3.amazonaws.com/v0.16.2-gitlab.25/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 사용

note
GPU는 모든 executor에서 지원됩니다. GPU 지원을 위해 Docker Machine을 사용할 필요는 없습니다. Docker Machine executor를 사용하면 GPU 노드를 쉽게 확장하고 축소할 수 있지만, 이는 Kubernetes executor를 사용하여도 수행할 수 있습니다.

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 인스턴스가 라이브 마이그레이션을 허용하지 않기 때문에 항상 TERMINATE를 사용합니다(Google Cloud는 GPU 인스턴스의 라이브 마이그레이션을 허용하지 않음).
--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의 명령줄 인수에 매핑됩니다. 더 많은 자세한 내용은 Google 문서의 GPU가 부착된 VM 생성을 참조하세요.

Docker Machine 옵션 확인

시스템을 준비하고 Google Compute Engine에서 GPU를 생성할 수 있는지 테스트하려면 다음을 수행하세요:

  1. Docker Machine에 대한 Google Compute Engine 드라이버 자격 증명을 설정합니다. VM에 기본 서비스 계정이 없는 경우 실행자에게 환경 변수를 내보내야 할 수 있습니다. 이는 실행자가 어떻게 시작되었는지에 따라 다릅니다. 예를 들면:

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

     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 Runner 구성

이러한 옵션을 확인한 후 Docker 실행자를 구성하여 runners.docker 구성에서 사용 가능한 모든 GPU를 사용하도록 구성하고, Docker Machine 옵션을 GitLab Runner의 runners.machine 구성MachineOptions 설정에 추가하세요. 예를 들면:

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

오류: 머신 생성 오류

Docker Machine을 설치하는 중 ERROR: Error creating machine: Error running provisioning: error installing docker라는 오류가 발생할 수 있습니다.

Docker Machine은 새로 프로비저닝된 가상 머신에 Docker를 설치하려고 시도합니다. 해당 스크립트를 사용하여 Docker를 설치하려 합니다:

if ! type docker; then curl -sSL "https://get.docker.com" | sh -; fi

docker 명령어가 성공하면 Docker Machine은 Docker가 설치되었다고 가정하고 계속 진행합니다.

성공하지 않으면 Docker Machine은 https://get.docker.com의 스크립트를 다운로드하고 실행하려고 합니다. 설치가 실패하면 해당 운영 체제가 더 이상 Docker에서 지원되지 않을 수 있습니다.

이 문제를 해결하려면 Docker Machine에서 디버깅을 활성화하여 GitLab Runner가 설치된 환경에서 MACHINE_DEBUG=true로 설정하세요.