Gitlab Backup & Restore on Kubernetes

송형근·2024년 4월 7일
1

K8S작업모음

목록 보기
2/2
post-thumbnail

작업 배경

DevOps 환경 구축 프로젝트에 참여해서 작업을 하는 도중 Gitlab Backup과 Restore 업무를 맡게 되었다.
프로젝트 내 Gitlab 버전인 15.3 버전 기준으로 gitlab docs를 확인해서 Backup과 Restore 방안을 마련하던 중 할 때마다 찾아서 하기는 귀찮을 것 같아 아예 쉘 스크립트로 작성해두게 되었다.

환경 정보


  • Kubernetes 1.25.0
  • Gitlab 15.3.2 CE

참고 사항


  • 해당 작업을 할 당시에는 공식 문서에 백업은 깃랩 Repo들의 용량이 100GB 아래인 경우에만 백업&복구를 실시하라는 말이 적혀있었다.
  • 그래서 사실 용량이 조금 많다 싶으면 해당 방법말고 다른 방안을 생각해보는 것이 좋을 것 같다.

Script


Gitlab Backup


# !bin/bash

export DATE=`date +%Y%m%d_%H%M%S`

mkdir $(echo $DATE)
cd $(echo $DATE)

# backup 명 yyyyMMdd_hhmmss_gitlab_backup.tar
kubectl exec -it -n gitlab-system $(kubectl get po -n gitlab-system | grep gitlab | awk '{print $1}') -- gitlab-backup create BACKUP=$DATE


# 백업 파일 복사하기
kubectl cp gitlab-system/$(kubectl get po -n gitlab-system | grep gitlab | awk '{print $1}'):var/opt/gitlab/backups/$(echo $DATE)_gitlab_backup.tar ./$(echo $DATE)_gitlab_backup.tar

kubectl exec -it -n gitlab-system $(kubectl get po -n gitlab-system | grep gitlab | awk '{print $1}') -- "rm" "/var/opt/gitlab/backups/$(echo $DATE)_gitlab_backup.tar"

# 시크릿 및 설정 파일 복사
kubectl exec -it -n gitlab-system $(kubectl get po -n gitlab-system | grep gitlab | awk '{print $1}') -- tar cvf secret.tar /etc/gitlab
kubectl cp gitlab-system/$(kubectl get po -n gitlab-system | grep gitlab | awk '{print $1}'):secret.tar ./secret.tar

# Omnibus 세팅값 복사
kubectl exec -it -n gitlab-system $(kubectl get po -n gitlab-system | grep gitlab | awk '{print $1}') -- tar cvf omnibus.tar /tmp/shared
kubectl cp gitlab-system/$(kubectl get po -n gitlab-system | grep gitlab | awk '{print $1}'):omnibus.tar ./omnibus.tar
  • 최신 버전에서는 backup utility를 실행하면 자동으로 날짜까지 붙어서 저장되지만, 15.3 버전 기준으로는 날짜가 붙지 않아서 DATE=`date +%Y%m%d_%H%M%S`를 통해 BackUp tar에 날짜를 추가해줬다.
  • 그리고 백업 파일들을 모아둘 directory도 날짜로 만들었다.
  • 백업만으로는 모든 설정 값이 백업되지는 않아서 시크릿 및 설정 파일과 Omnibus 세팅값 모두 kubectl cp를 통해 Host에 Backup 했다.

Gitlab Restore


  • Restore는 sh ${Restore script} ${DATE} 로 실시한다.
# !bin/bash

BACKUP=$1

if ( echo $BACKUP -ne "" ); then
	cd $BACKUP
	# Omnibus 세팅값 복사
	tar xvf omnibus.tar
	kubectl cp ./tmp gitlab-system/$(kubectl get po -n gitlab-system | grep gitlab | awk '{print $1}'):tmp
	
	# 시크릿 / 설정값 복사
	tar xvf secret.tar
	kubectl cp ./etc/gitlab gitlab-system/$(kubectl get po -n gitlab-system | grep gitlab | awk '{print $1}'):etc/gitlab
	
	# 백업 파일 pod 내 저장
	kubectl cp $(echo $BACKUP)_gitlab_backup.tar  gitlab-system/$(kubectl get po -n gitlab-system | grep gitlab | awk '{print $1}'):var/opt/gitlab/backups/$(echo $BACKUP)_gitlab_backup.tar
	
	# Omnibus 세팅값 설정
	kubectl exec -it -n gitlab-system $(kubectl get po -n gitlab-system | grep gitlab | awk '{print $1}') -- gitlab-ctl reconfigure
	
	# 복구
	kubectl exec -it -n gitlab-system $(kubectl get po -n gitlab-system | grep gitlab | awk '{print $1}') -- gitlab-backup restore BACKUP=$BACKUP

fi
  • 스크립트의 BACKUP=$1 부분에서 앞선 스크립트 실행 부분에서 ${DATE} 를 입력한 값이 $1에서 바뀌어서 스크립트가 실행이 된다.
  • Gitlab Restore에는 굉~장히 오랜 시간이 소요된다. 하지만 문제가 있는 것은 아니니까 침착하게 기다려야 한다.
    - 나는 행걸린 줄 알고 중지했다가 개인 테스트서버의 깃랩이 망가져 새로 설치하고 다시 진행했다


문의와 지적은 환영입니다.

profile
기록을 남겨보자

0개의 댓글