GitLab Runner를 위한 자동 확장을 위한 설치 및 등록

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed
  • 자동 확장 기능은 GitLab Runner 1.1.0에서 도입되었습니다.
note
Docker Machine 실행기는 GitLab 17.5에서 사용 중단되었습니다.
Amazon Web Services (AWS) EC2, Microsoft Azure Compute 또는 Google Compute Engine (GCE)에서
Docker Machine 실행기를 사용하고 있는 경우,
GitLab Runner Autoscaler로 마이그레이션하세요.

자동 확장 아키텍처에 대한 개요는 다음을 참조하세요:
자동 확장에 대한 포괄적인 문서

Docker 머신의 포크 버전

Docker에서 Docker Machine을 사용 중단했습니다. 하지만,
GitLab은 Docker Machine 실행기에 의존하는 GitLab Runner 사용자들을 위한
Docker Machine 포크를 유지합니다. 이 포크는
다음 버그에 대한 추가 패치와 함께
docker-machine의 최신 main 브랜치를 기반으로 합니다:

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

환경 준비

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

  1. Docker가 새 머신을 생성하는 데 사용할 리눅스 기반의 새로운 머신에 로그인하세요.
  2. GitLab Runner 설치.
  3. Docker Machine 포크에서 Docker Machine을 설치합니다.
  4. 옵션으로, 하지만 권장되므로, 자동 확장된 실행기와 함께 사용할
    프록시 컨테이너 레지스트리 및 캐시 서버를 준비하세요.

GitLab Runner 설정

  1. gitlab-runner와 함께 docker-machine을 사용할 때의
    핵심 개념을 숙지하세요:
  2. Docker Machine을 처음 사용할 때
    Docker Machine Driver와 함께
    docker-machine create ... 명령을 수동으로 실행하는 것이 가장 좋습니다.
    이 명령을
    MachineOptions
    [runners.machine] 섹션에 구성할 옵션으로 실행하세요.
    이렇게 하면 Docker Machine 환경이 제대로 설정되며,
    지정된 옵션을 검증하는 데에도 좋습니다.
    이후 docker-machine rm [machine_name]로 머신을 삭제하고 러너를 시작할 수 있습니다.

    note
    첫 사용 시 docker-machine create에 대한 여러 동시 요청은 좋지 않습니다.
    docker+machine 실행기를 사용하는 경우, 러너는
    몇 개의 동시 docker-machine create 명령을 실행할 수 있습니다.
    이 환경에서 Docker Machine이 이전에 사용되지 않았다면,
    시작된 각 프로세스는 SSH 키와 SSL 인증서를 준비하려고 시도합니다
    (자동 확장된 머신에서 GitLab Runner와 Docker Engine 간의 Docker API 인증을 위해).
    이러한 동시 프로세스는 서로 방해가 될 수 있습니다.
    이로 인해 작동하지 않는 환경이 될 수 있습니다.
    따라서 GitLab Runner를 Docker Machine과 함께 설정할 때는
    처음에 테스트 머신을 수동으로 생성하는 것이 중요합니다.
  3. 런너 등록 및 요청 시
    docker+machine 실행기를 선택하세요.

  4. config.toml을 편집하고
    러너가 Docker Machine을 사용하도록 구성하세요.
    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를 설치할 수 있습니다.

포크된 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 사용하기

  • GitLab Docker Machine 0.16.2-gitlab.10 및 GitLab Runner 13.9에서 소개됨.

참고: GPU는 모든 실행기에서 지원됩니다. GPU 지원을 위해 꼭 Docker Machine을 사용할 필요는 없습니다. Docker Machine 실행기를 사용하면 GPU 노드를 쉽게 확장하고 축소할 수 있지만, 이는 Kubernetes 실행기로도 가능합니다.

포크된 Docker Machine을 사용하여 그래픽 처리 장치(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 인스턴스의 라이브 마이그레이션이 허용되지 않으므로 항상 TERMINATE를 사용하세요. Google Cloud는 라이브 마이그레이션을 허용하지 않습니다.
--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이 원하는 옵션으로 가상 머신을 생성할 수 있는지 확인하세요.

    예를 들어, 단일 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
    
  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. 이러한 옵션을 확인한 후, runners.docker 구성에서 사용할 수 있는 모든 GPU를 사용하도록 Docker 실행기를 구성합니다. 그런 다음 `GitLab Runner ‘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 머신 실행기를 사용할 때 다음과 같은 문제가 발생할 수 있습니다.

ERROR: 머신 생성 중 오류

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

Docker 머신은 새로 프로비저닝된 가상 머신에 Docker를 설치하기 위해 이 스크립트를 사용합니다:

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

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

성공하지 않는 경우, Docker 머신은 https://get.docker.com에서 스크립트를 다운로드하고 실행하려고 합니다. 설치가 실패하면 운영 체제가 더 이상 Docker에서 지원되지 않을 가능성이 있습니다.

이 문제를 해결하려면 GitLab Runner가 설치된 환경에서 MACHINE_DEBUG=true로 설정하여 Docker 머신에서 디버깅을 활성화할 수 있습니다.