Proxmox VE에서 gitlab과 gitlab-runner 구축

홈랩(HomeLab)을 구축하면서 목표로 했던 것 중 하나가 Terraform IaC 코드를 자체 구축한 Gitlab 서버의 리포지토리에 구축하고 필요 시 Gitlab-Runner를 사용해서 빠르게 재구축 하는 것이었다.

GitLab-Runner Registration 시 SSL인증서 검증 에러

사실 테라폼을 사용해서 GitLab을 설치하는 건 그다지 어렵지 않았다. 홈 네트워크 내부에 또 다른 차원의 내부망을 만들다 보니 외부 DNS를 사용하는 것이 불가능한 상태에서 GitLab이 설치된 서버 구성까지는 어렵지 않았지만 Proxmox VE 호스트 1대에 GitLab Runner를 설치한 뒤 GiaLab 서버에 Registration 하는 과정에서 SSL 인증서 검증 단계에서 신뢰할 수 없는 인증서라는 에러가 계속 발목을 잡았다.

root@prxmx:/# gitlab-runner register --url https://gitlab.blogger.io/ --registration-token GR1348941wuVjVszRsjkzuvjf-bLG --tls-ca-file /tmp/gitlab.blogger.io.crt Runtime platform arch=amd64 os=linux pid=21476 revision=cc7f9277 version=18.7.1 Running in system-mode.
<중간생략>
ERROR: Registering runner... failed correlation_id=f072682b93ac41ab8103c693167f04b1 runner=wuVjVszRs status=execute JSON request: execute request: couldn't execute POST against https://gitlab.blogger.io/api/v4/runners: Post "https://gitlab.blogger.io/api/v4/runners": tls: failed to verify certificate: x509: certificate is not valid for any names, but wanted to match gitlab.blogger.io PANIC: Failed to register the runner.
root@prxmx:/etc#

IP주소로 시도했을 때도 마찬가지였고 도메인 주소로 변경하고 인증서를 새로 만든 뒤에도 마찬가지 에러가 발생했다.

결국 두 서버의 /etc/hosts에 도메인 주소를 수동으로 추가하고 Gitlab 서버에서 생성한 인증서를 신뢰할 수 있는 인증서 목록에 추가한 다음 GitLab의 기본설정 파일에서 IP 주소로 설정된 것을 도메인 주소로 변경해주는 작업을 모두 마치고 나서야 Runner 등록(Registration)에 성공할 수 있었다. 이 과정을 경험하며 확인할 사항들을 정리해 보았다.

GitLab-Runner 설치 및 등록 시 고려사항

만약 GitLab과 Proxmox 클러스터 네트워크에서 DNS Resolving을 사용할 수 없는 상황이라면 Proxmox 호스트와 Gitlab 서버의 /etc/hosts 파일에 다음의 라인을 추가해줘야 한다. 도메인 주소와 IP는 구축 환경에 맞춰 변경해주면 된다.

192.168.219.250  gitlab.blogger.io

그리고 인증서 오류를 확실하게 예방하기 위해 SAN(Subject Alternative Name)이 포함된 새 인증서를 생성한다. 인증서는 GitLab 서버에서 생성해야 한다.

1. Alternative Name을 사용하기 위한 설정파일 생성
$ cat <<EOF > v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = gitlab.blogger.io
IP.1 = 192.168.219.250
EOF

2. SAN(Subject Alternative Name)이 포함된 새 인증서 생성
$ sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
  -keyout /etc/gitlab/ssl/gitlab.blogger.io.key \
  -out /etc/gitlab/ssl/gitlab.blogger.io.crt \
  -subj "/C=KR/ST=Seoul/L=Seoul/O=MyLab/OU=IT/CN=gitlab.blogger.io" \
  -extfile v3.ext

3. 인증서 확인. IP와 도메인주소가 정상적으로 표시되는지 확인 
openssl x509 -in /etc/gitlab/ssl/gitlab.blogger.io.crt -text -noout | grep -A 1 "Subject Alternative Name"

4. 권한 설정
$ sudo chmod 600 /etc/gitlab/ssl/gitlab.blogger.io.key

그리고 Gitlab 서버에서 생성한 인증서를 GitLab-Runner를 설치할 Proxmox VE 호스트로 복사한다. 이 명령을 Proxmox VE 호스트에서 실행한 것이고 taeho 계정은 GitLab 서버의 계정이다.

# scp taeho@192.168.219.250:/etc/gitlab/ssl/gitlab.blogger.io.crt /tmp/gitlab.blogger.io.crt

이제 GitLab 서버에서 가져온 인증서를 Proxmox VE 호스트에서 신뢰할 수 있는 시스템 인증서 목록으로 등록해야 한다.

1. 신뢰할 수 있는 인증서 저장소로 인증서 파일을 이동
$ sudo mv /tmp/gitlab.blogger.io.crt /usr/local/share/ca-certificates/gitlab.blogger.io.crt

2. 신뢰할 수 있는 인증서 목록 업데이트. 성공 시 1 added, 0 removed; done 메시지가 나와야 한다.
$ sudo update-ca-certificates

마지막으로 GitLab서버에서 GitLab의 설정파일에서 인증서 정보가 정상적으로 등록되어 있는지 확인한다. IP 주소면 안된다.

1. GitLab 설정 확인
taeho@gitlab-server:/etc/gitlab$ cat gitlab.rb
external_url 'https://gitlab.blogger.io'
letsencrypt['enable'] = false
nginx['ssl_certificate'] = '/etc/gitlab/ssl/gitlab.blogger.io.crt'
nginx['ssl_certificate_key'] = '/etc/gitlab/ssl/gitlab.blogger.io.key'
nginx['redirect_http_to_https'] = true
taeho@gitlab-server:/etc/gitlab$ 

2. GitLab 서버 Reconfiguration (꽤 오래 걸린다. 고로 GitLab은 무겁다.)
$ sudo gitlab-ctl reconfigure

3. GitLab 서버 재실행
$ sudo gitlab-ctl restart 

물론 저 경로에 인증서 파일이 정상적으로 존재하는지도 확인해야 한다.

GitLab 서버는 꽤나 무겁다. gitlab-ctl restart 명령 실행 후 1~2분 기다린 뒤 다음과 같이 Proxmox VE 호스트에 설치된 GitLab-Runner의 등록(Registration)을 다시 해본다.

# gitlab-runner register \
  --url https://gitlab.blogger.io/ \
  --registration-token GR1348941wuVjVszRsjkzuvjf-bLG

GitLab Runner Registration Token

참고로 레지스트레이션 토큰의 위치는 다음 화면과 같다. 프로젝트 오너 권한을 가진 계정으로 로그인하여 프로젝트의 Runners 메뉴에 가면 다음 화면과 같이 점 세개 버튼이 있는데 그 버튼을 누르면 Registration Token을 확인할 수 있다.

정상적으로 등록된다면 다음과 같이 등록된 Runner를 확인할 수 있다.

꽤나 힘든 여정이었다.

#GitLab #GitLabRunner #깃랩러너

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다