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) 인스턴스를 생성하였습니다.
- AmazonEC2FullAccess 및 AmazonS3FullAccess가 부여된 GitLab 사용자 권한 생성
- Gitlab Runner 관리자 인스턴스로 사용할 t2.micro 우분투 인스턴스를 만듭니다. 설정은 기본 옵션으로 하겠습니다.
2. 인스턴스에 Docker 설치
먼저 ssh를 통해 인스턴스에 접속합니다.
- apt-get 업데이트 및 필요 패키지 설치
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
- 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"
- apt 패키지 업데이트 및 Docker 설치
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
- 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 설치
-
GitLab 공식 저장소 추가
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
-
GitLab Runner 설치
sudo apt-get install gitlab-runner
4. Gitlab Runner 등록
Gitlab Runner는 그룹 레벨과 프로젝트 레벨로 나눠서 등록할 수 있습니다. 그룹 레벨은 그룹의 모든 프로젝트에서 사용할 수 있고, 프로젝트 레벨은 단일 저장소의 프로젝트 안에서만 사용할 수 있습니다.
프로젝트 또는 그룹에서 **Settings >> Runners
**로 이동하여 Runner 섹션에서 표시된 토큰을 복사합니다.
그리고 인스턴스에 접속하여 다음을 실행합니다.
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/