AWS Spot Instance로 Gitlab Runner 비용 절감하기

Michael Shin
Michael Shin | Software Engineer

GitLab에서 CI/CD 및 배포를 설정하려면 두 가지 옵션이 있습니다. 먼저, 기본적으로 GitLab에서 제공되는 GitLab shared runner를 사용하는 것입니다. 이 경우 한 달에 2,000분의 무료 CI 파이프라인을 사용할 수 있습니다. 다음으로는, 자신의 GitLab runner를 설정하는 것입니다. GitLab은 이미 GCP와 AWS와 잘 통합되도록 설정 할 수 있게 준비되어 있습니다. 설정 대시보드에서 간단히 Google Kubernetes 클러스터와 Amazon에 GitLab runner를 설정하고 배포 할 수 있습니다. 하지만 이럴 경우 runner를 몇 번 사용하지 않았음에도 불구하고 한 달 후에 받는 비용청구서의 금액은 상상한 것보다 많을 것입니다.

Spot Instance?#

스팟 인스턴스는 온디맨드 가격보다 저렴한 비용으로 사용할 수 있는 미사용 EC2 인스턴스입니다. 스팟 인스턴스는 큰 할인율로 미사용 EC2 인스턴스를 요청할 수 있게 해주므로 사용자는 Amazon EC2 비용을 대폭 낮출 수 있습니다. 스팟 인스턴스의 시간당 가격을 스팟 가격이라고 합니다. 각 가용 영역 내 인스턴스 유형별 스팟 가격은 Amazon EC2에서 설정하며, 스팟 인스턴스의 장기적 공급 및 수요에 따라 점진적으로 조정됩니다. 스팟 인스턴스는 용량이 가용 상태이고 요청에 대한 시간당 최고 가격이 스팟 가격보다 더 높을 때마다 실행됩니다.

스팟 인스턴스는 애플리케이션이 실행되는 시간을 유연하게 조정할 수 있고 애플리케이션을 중단할 수 있는 경우에 선택하는 비용 효율적인 방법입니다. 예를 들어 스팟 인스턴스는 데이터 분석, 배치 작업, 백그라운드 프로세싱 및 선택적 작업에 적합합니다.

출처: https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/using-spot-instances.html

GitLab Runner 구성하기#

1. Autoscaler 인스턴스 생성#

이 인스턴스는 단지 작업을 실행하는 역할이 아니라 필요에 따라 AWS 스팟 인스턴스를 가동 및 중지하는 역할을 수행하여 인스턴스를 관리합니다. 24시간 작동해야 하는 인스턴스이므로 여기서는 2.micro linux (ubuntu) 인스턴스를 생성하였습니다.

  1. AmazonEC2FullAccess 및 AmazonS3FullAccess가 부여된 GitLab 사용자 권한 생성
  2. Gitlab Runner 관리자 인스턴스로 사용할 t2.micro 우분투 인스턴스를 만듭니다. 설정은 기본 옵션으로 하겠습니다.

2. 인스턴스에 Docker 설치#

먼저 ssh를 통해 인스턴스에 접속합니다.

  1. apt-get 업데이트 및 필요 패키지 설치
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  1. Docker의 공식 GPG 키 추가 및 저장소 설정
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  1. apt 패키지 업데이트 및 Docker 설치
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
  1. Docker 머신 설치
base=https://github.com/docker/machine/releases/download/v0.16.0 &&
curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
sudo mv /tmp/docker-machine /usr/local/bin/docker-machine &&
chmod +x /usr/local/bin/docker-machine

공식 문서 참고: https://docs.docker.com/machine/install-machine/

3. Gitlab Runner 설치#

  1. GitLab 공식 저장소 추가

    curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
  2. GitLab Runner 설치

    sudo apt-get install gitlab-runner

4. Gitlab Runner 등록#

Gitlab Runner는 그룹 레벨과 프로젝트 레벨로 나눠서 등록할 수 있습니다. 그룹 레벨은 그룹의 모든 프로젝트에서 사용할 수 있고, 프로젝트 레벨은 단일 저장소의 프로젝트 안에서만 사용할 수 있습니다.

프로젝트 또는 그룹에서 Settings >> Runners로 이동하여 Runner 섹션에서 표시된 토큰을 복사합니다.

photo | 인포그랩 GitLab | 인포그랩 GitLab

그리고 인스턴스에 접속하여 다음을 실행합니다.

gitlab-runner register

gitlab Runner 등록 절차 및 등록 취소 방법에 대한 자세한 내용 은 공식 문서를 확인하세요.

5. Gitlab Runner 구성#

이제 마지막으로 runner를 구성해야합니다.

vi /etc/gitlab-runner/config.toml

GitLab Runner 구성에 대한 자세한 내용은 공식 문서를 확인하거나 인포그랩에 문의해 주세요.

스팟 인스턴스의 주의 사항#

스팟 인스턴스는 사용되지 않는 리소스를 사용하고 인프라 비용을 최소화하는 좋은 방법이지만 그 의미를 알고 있어야 합니다.

스팟 인스턴스에서 CI 작업을 실행하면 스팟 인스턴스 가격 모델로 인해 실패율이 증가 할 수 있습니다. 지정한 최대 스팟 가격이 현재 스팟 가격을 초과하면 요청된 용량을 얻을 수 없습니다. 스팟 가격은 시간 단위로 수정됩니다. 만약 기존 스팟 인스턴스 중 수정된 최고 가격보다 낮을 경우 2분 이내에 종료되고 스팟 호스트의 모든 작업이 실패합니다.

결과적으로 auto-scale Runner는 새 인스턴스를 계속 요청하는 동안 새 머신을 생성하지 못합니다. 결국 60건의 요청이 생성되고 AWS는 더 이상 수락하지 않습니다. 그런 다음 스팟 가격이 허용되면 통화 금액 한도를 초과하기 때문에 잠시 잠 깁니다.

이 경우가 발생하면 Runner Manager 머신에서 다음 명령을 사용하여 Docker 머신 상태를 확인할 수 있습니다.

docker-machine ls -q --filter state=Error --format "{{.NAME}}"

GitLab Runner가 스팟 가격 변경을 정상적으로 처리하게 하는 것과 관련된 몇 가지 문제가 있으며 docker-machine Docker Machine을 지속해서 제거하려는 시도에 대한 보고가 있습니다. GitLab은 업스트림 프로젝트에서 두 경우 모두에 대한 패치를 제공했습니다. 자세한 내용은 문제 # 2771 및 # 2772를 참조하십시오 .

마치며#

GitLab Runner의 auto-scale 기능을 사용하면 시간과 비용을 절약할 수 있습니다. AWS가 제공하는 Spot 인스턴스를 사용하면 훨씬 더 큰 비용을 절감할 수 있습니다. 또한 스팟 인스턴스의 예산이 충분하다면, 문제 또한 발생하지 않을 것입니다.

Reference#

https://about.gitlab.com/blog/2017/11/23/autoscale-ci-runners/ https://docs.gitlab.com/runner/configuration/runner_autoscale_aws/