GitLab Runner를 Docker Machine과 함께 자동 스케일링하기 위한 설치 및 등록

Tier: Free, Premium, Ultimate Offering: GitLab.com, 자체 관리
  • Autoscaling 기능은 GitLab Runner 1.1.0에서 소개되었습니다.

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

포크된 버전의 Docker Machine

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

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

환경 준비

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

  1. Docker가 새로 생성될 머신으로 작동할 산막 서버로 로그인
  2. GitLab Runner 설치
  3. Docker Machine fork에서 Docker Machine 설치
  4. 선택적으로, 권장되는 것은 자동으로 확장되는 러너와 함께 사용될 프록시 컨테이너 레지스트리 및 캐시 서버 미리 준비하는 것입니다.

GitLab Runner 구성

  1. docker-machine을 사용하는 핵심적인 개념에 익숙해지십시오:
  2. 처음으로 Docker Machine을 사용하는 경우, Docker Machine Driver와 함께 docker-machine create ... 명령을 수동으로 실행하는 것이 가장 좋습니다. 이 명령은 GitLab Runner MachineOptions 섹션에서 구성할 옵션과 함께 실행하세요. 이렇게 하면 Docker Machine 환경이 올바르게 설정되고 지정된 옵션의 유효성도 검증됩니다. 이후에, 머신을 docker-machine rm [machine_name]으로 제거하고 러너를 시작하세요.

    참고: 처음 사용할 때 동시에 여러 요청으로 docker-machine create를 수행하는 것은 좋지 않습니다. docker+machine executor를 사용하는 경우, 러너는 여러 동시 docker-machine create 명령을 실행할 수 있습니다. Docker Machine이 이 환경에서 이전에 사용되지 않은 경우, 각 시작된 프로세스는 SSH 키와 SSL 인증서를 준비하려고 시도하며, 이러한 동시 프로세스는 서로 방해합니다. 이는 작동하지 않는 환경으로 끝날 수 있습니다. 따라서 GitLab Runner를 Docker Machine으로 처음 설정할 때 매우 중요한 것은 테스트 머신을 수동으로 생성하는 것입니다.

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

GitLab Runner 업그레이드

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

      # systemd의 경우
      sudo systemctl stop gitlab-runner
      
      # upstart의 경우
      sudo service gitlab-runner stop
      
    • no인 경우, 프로세스를 수동으로 중지할 수 있습니다:

      sudo killall -SIGQUIT gitlab-runner
      
    note
    SIGQUIT 신호를 보내면 프로세스가 정상적으로 중지됩니다. 프로세스는 새 작업을 수락하지 않으며, 현재 작업이 완료되면 종료됩니다.
  2. GitLab Runner가 종료될 때까지 기다립니다. gitlab-runner status로 상태를 확인하거나 다음과 같이 최대 30분 동안 정상적인 종료를 기다릴 수 있습니다:

    for i in `seq 1 180`; do # 1800 seconds = 30 minutes
        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 지원을 위해 도커 머신을 사용할 필요가 없습니다. 도커 머신 실행 프로그램을 사용하면 GPU 노드를 쉽게 확장하거나 축소할 수 있지만, 이는 Kubernetes 실행 프로그램에서도 수행할 수 있습니다.

Docker Machine의 포크를 사용하여 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 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를 생성할 수 있는지 확인하려면 다음을 수행하세요:

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

  2. docker-machine이 원하는 옵션을 사용하여 가상 머신을 생성할 수 있는지 확인하세요. 예를 들어, n1-standard-1 머신을 하나의 NVIDIA Tesla P4 가속기와 함께 만들려면 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
    
  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 executor를 구성하여 모든 사용 가능한 GPU를 사용하도록 합니다. runners.docker configuration에서. 그런 다음 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 executor를 사용할 때 다음과 같은 문제가 발생할 수 있습니다.

ERROR: 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의 디버깅을 활성화할 수 있습니다.