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/