MSA로의 전환프로젝트에서 쿠버네티스 환경에 자동으로 배포하고 모니터링할수 있는 시스템이 필요했다.
새로 합류한 나의 회사에서는 낙후된 버전의 GitLab이 CI 역할을 담당하고 있었고 Jenkins로 CD 역할을 담당하고 있었다..(무슨 조합일까..?)
그동안 Vendor에 의존적인 시스템을 많이 사용하다보니 벤더에서 제공하는 기술문서&커뮤니티에 의존했던 경향이 있었다.
하지만 클라우드 및 오픈소스를 다루게 되니 너무나도 방대한 자료와 공개적인 커뮤니티가 잘 되어있어 참고할 자료가 많아서 이래서 빠르게 발전하고 대세가 되었구나 생각했다..
서론은 여기까지 하고 좋은 Reference를 참고해 내가 진행했던 삽질 과정을 기록해보겠다.(에버노트는 이제그만)

CI/CD 부분의 배포 순서는 아래와 같다.
1. 개발자는 GitLab의 각 프로젝트에 Push/Commit을 진행한다.
2. GitLab에서는 Commit을 감지하여 gitlab-ci.yml에 정의된 파이프라인을 작동한다.
3. 파이프라인에서는 각 환경(Branch)에 맞게 동작한다.
4. 파이프라인의 Build 과정에서 Docker Image를 빌드하고 AWS ECR(Private Registry)에 Push 한다. 이 과정에서 CI Job의 SHA Tag를 Image에 Tagging 한다.
5. Kustomize를 이용해 변경된 Image Tag를 감지하여 Manifest 파일을 변경한다.
6. ArgoCD에서 변경된 Manifest 파일을 감지하여 Auto Sync를 감지한다.
7. 각 환경(Branch)는 Dev, Stage, Prod 3개로 나누며 Dev, Stage 환경은 Rolling Deploy를 Prod 환경은 Canary Deploy를 진행한다. (Argo Rollout CRD 사용)
GitLab 서버를 제외하고 모든 서비스를 K8S 위에 구축하였다.
별도의 EC2 머신에 GitLab CE 버전을 설치해준다.
Self-managed 형식의 Omnibus 설치를 진행하였다.
설치 링크 https://about.gitlab.com/install/
본인은 Ubuntu 20.04 LTS 환경에서 설치하였다.
apt-get update를 진행하고 설치에 필요한 의존성 패키지를 설치해준다.
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates tzdata perl
SMTP 서버를 설치하여 파이프라인을 모니터링하려면 postfix도 설치해준다.
sudo apt-get install -y postfix
GitLab package repository를 추가해준다. 여기서 주의할 점은 공식 홈페이지에는 Enterprise Edition으로 가이드가 나와있으니 ce로 수정해주어야 한다.
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
설치 과정에서 external_url을 설정해줄 수 있지만 초기 설치 후 수정하는 방법으로 설치하였다. (마찬가지로 gitlab-ce로 수정)
sudo apt-get install gitlab-ce
설치가 완료되면 gitlab.rb 파일을 수정해주어야 한다.
vi /etc/gitlab/gitlab.rb
external_url '내가 사용할 도메인'

Route 53에서 레코드를 등록하였고 ALB를 생성하여 ACM에서 생성한 인증서를 SSL Offload 시켜 HTTPS 통신을 구성하였다.
아래 구성은 Daily Backup을 AWS S3 버킷에 저장하는 설정부분이다.
해당 부분을 수정하고 crontab에 backup 명령어를 실행하게 설정해야 한다.
gitlab_rails['backup_upload_connection'] = {
'provider' => 'AWS',
'region' => 'ap-northeast-2',
'aws_access_key_id' => 'YOUR_ACCESS_KEY_ID',
'aws_secret_access_key' => 'YOUR_SECRET_ACCESS_KEY',
# # If IAM profile use is enabled, remove aws_access_key_id and aws_secret_access_key
# 'use_iam_profile' => false
}
gitlab_rails['backup_upload_remote_directory'] = 'YOUR_S3_BUCKET_NAME'
0 11 * * * /opt/gitlab/bin/gitlab-backup create
external_url을 HTTPS로 변경하게 되면 아래 nginx의 Proxy 설정을 해주어야 한다.
https 트래픽은 EC2 외부의 ALB, ACM에서 처리하기 때문에 Internal 에서 찾지 못하기 때문이다.
nginx['listen_port'] = 80
nginx['listen_https'] = false
nginx['proxy_set_headers'] = {
"X-Forwarded-Proto" => "https",
"X-Forwarded-Ssl" => "on",
}
letsencrypt['enable'] = false
설정을 다 해주고 gitlab reconfigure를 진행해준다.
sudo gitlab-ctl reconfigure
gitlab의 root 초기 패스워드는 아래 파일에서 확인할 수 있다(24시간 뒤에 삭제됨.)
cat /etc/gitlab/initial_root_password
이제 모든 설치가 완료되었으며 설정한 external_url 접속하면 아래와 같은 화면을 볼 수 있다.

다음은 CI/CD에 필요한 GitLab Config를 다루도록 하겠다.