GitLab Runner 설치 및 등록 자동 크기 조정을 위한 Docker Machine

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed
  • 자동 크기 조정 기능은 GitLab Runner 1.1.0에서 소개되었습니다.

자동 크기 조정 아키텍처에 대한 개요는 자동 크기 조정에 대한 포괄적인 설명서 를 참조하세요.

포크된 Docker Machine 버전

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

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

환경 준비

자동 크기 조정 기능을 사용하려면 Docker와 GitLab Runner를 같은 머신에 설치해야 합니다:

  1. Docker가 새로운 머신으로부터 새로운 머신을 생성할 베스천 서버로 제공될 새로운 리눅스 기반 머신에 로그인합니다.
  2. GitLab Runner 설치
  3. Docker Machine 포크에서 Docker Machine 설치
  4. 선택 사항이지만 권장됨, 사용할 수 있는 자동 확장 러너와 함께 사용할 프록시 컨테이너 레지스트리 및 캐시 서버 를 준비합니다.

GitLab Runner 구성

  1. docker-machinegitlab-runner과 함께 사용하는 핵심 컨셉에 익숙해집니다:
  2. 처음 사용하는 경우에는 Docker Machine을 매뉴얼으로 실행하는 것이 가장 좋습니다. gitlab-runner와 함께 docker-machine create ... 명령을 실행하고 GitLab Runner MachineOptions 섹션에서 구성할 옵션과 함께 이 명령을 실행합니다. 이렇게 하면 Docker Machine 환경이 올바르게 설정되며 지정된 옵션의 유효성도 검증됩니다. 이후에 해당 머신을 제거하고 러너를 시작할 수 있습니다.

    note
    처음 사용하는 경우 docker+machine executor를 사용하는 경우 러너는 몇 개의 동시 docker-machine create 명령을 생성할 수 있습니다. Docker Machine이 이 환경에서 이전에 사용된 적이 없는 경우 각 시작된 프로세스는 SSH 키와 SSL 인증서 (자동크기 조정으로 생성된 Docker 엔진과 GitLab Runner 사이의 Docker API 인증을 위한 것)를 준비하려고 시도하고 서로 방해합니다. 이는 작동하지 않는 환경으로 끝날 수 있습니다. 따라서 Docker Machine을 처음 설정할 때는 머신을 매뉴얼으로 만드는 것이 중요합니다.
  3. 러너를 등록하고 물어볼 때 docker+machine executor를 선택합니다.
  4. config.toml을 편집하고 러너가 Docker 머신을 사용하도록 구성합니다. 자세한 정보는 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 사용

  • GitLab Docker Machine 0.16.2-gitlab.10 및 GitLab Runner 13.9에서 소개되었습니다.
note
GPU는 모든 실행자에서 지원됩니다. GPU 지원을 위해 Docker Machine을 사용할 필요가 없습니다. Docker Machine 실행자를 사용하면 GPU 노드의 확장과 축소가 쉽지만, 이는 Kubernetes 실행자를 통해 수행할 수도 있습니다.

포크된 Docker Machine을 사용하여 Google Compute Engine 인스턴스에 그래픽 처리 장치 (GPU)를 가진 Google Compute Engine 인스턴스를 생성할 수 있습니다. Docker 실행자에서 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 드라이버를 설치하도록 지시합니다.

이러한 인수는 구글 컴퓨트를 사용한 명령행 인수에 매핑됩니다. 더 자세한 내용은 연결된 GPU가 있는 VM을 만드는 Google 문서를 참조하세요.

Docker Machine 옵션 확인

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

  1. Docker Machine을 위한 Google Compute Engine 드라이버 자격 증명을 설정하세요. 기본 서비스 계정이 없는 경우 실행자에게 환경 변수를 내보내야 할 수 있습니다. 이는 실행자를 어떻게 시작하느냐에 따라 달라집니다. 예를 들어:

  2. GPU가 있는 원하는 옵션으로 가상 머신을 만들 수 있는지 확인하세요. 예를 들어, 단일 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 구성

  1. 이러한 옵션을 확인한 후, Docker 실행 프로그램을 구성하여 모든 사용 가능한 GPU를 사용하도록 합니다. runners.docker 구성을 참조하세요. 그런 다음, GitLab Runner runners.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 실행 프로그램을 사용하는 중에 다음과 같은 문제가 발생할 수 있습니다.

오류: 머신 생성 중 오류 발생

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에서 더 이상 지원되지 않을 수 있습니다.

이 문제를 해결하기 위해, Docker Machine에서 GitLab Runner이 설치된 환경에서 MACHINE_DEBUG=true를 설정하여 디버깅을 활성화할 수 있습니다.