다중 외부 데이터베이스를 사용하여 GitLab 차트 구성하기
Tier: Free, Premium, Ultimate
Offering: Self-managed
Status: Beta
기본적으로 GitLab은 ‘main’ 데이터베이스라고 하는 단일 애플리케이션 데이터베이스를 사용합니다.
GitLab을 확장하기 위해 GitLab을 여러 애플리케이션 데이터베이스로 구성할 수 있습니다.
다중 외부 데이터베이스를 사용하여 새로운 설치 GitLab 차트 구성하기
경고:
알려진 문제로 인해 이 기능은 현재 프로덕션 환경에 사용하기에 적합하지 않을 수 있습니다.
기본적으로 GitLab은 ‘main’ 데이터베이스와 ‘ci’라고 하는 여러 외부 애플리케이션 데이터베이스를 사용할 수 있도록 구성할 수 있습니다. 다음 다이어그램은 파드가 여러 데이터베이스와 통신하는 방법을 보여줍니다:
사전 준비 작업:
- 외부 데이터베이스 문서에 나열된 모든 사전 요구 사항.
-
같은 PostgreSQL 서버에서 실행될 수 있는 추가적인 빈
gitlabhq_production_ci
데이터베이스.the
kubectl
및helm
CLI 도구를 사용하여 쿠버네티스 클러스터에 액세스합니다. 자세한 정보는 GitLab 차트 사전 요구 사항을 참조하십시오.
다중 외부 데이터베이스를 설정하려면:
-
gitlab
데이터베이스 사용자의 PostgreSQL 암호를 보유하는 쿠버네티스 시크릿을 만듭니다. 이 암호는 두 개의 서로 다른 물리적 서버에 여러 데이터베이스를 지원하기 위해 서로 다른 암호를 사용할 수 있도록 다를 수 있습니다.이 쿠버네티스 시크릿의 이름을
gitlab-postgresql-password
로 선택합니다:kubectl create secret generic gitlab-postgresql-password \ --from-literal=main-gitlab-password=<main-database-password> \ --from-literal=ci-gitlab-password=<ci-database-password>
-
사용 중인 YAML 파일에 다음을 추가하여 GitLab 차트를 배포하는 데 사용하고
host
값을 사용자의 값으로 대체합니다:global: psql: main: host: main.database.host # 외부 main 데이터베이스의 호스트를 설정합니다 database: gitlabhq_production password: secret: gitlab-postgresql-password key: main-gitlab-password ci: host: ci.database.host # 외부 ci 데이터베이스의 호스트를 설정합니다. main 데이터베이스와 같을 수 있습니다 database: gitlabhq_production_ci # CI 스키마를 포함하는 데이터베이스의 차이로 인해 `database_tasks: true` 발생 password: secret: gitlab-postgresql-password key: ci-gitlab-password postgresql: install: false
여기서:
-
postgresql.install
: 내장 데이터베이스를 비활성화하고 외부 데이터베이스를 대신 사용하도록 설정합니다. -
global.psql.main.host
: 외부main
데이터베이스의 호스트 이름을 설정합니다. 도메인 또는 IP 주소로 설정할 수 있습니다. -
global.psql.main.password.secret
: PostgreSQL 사용자를 보유하는 쿠버네티스 시크릿의 이름입니다. 예시에서는gitlab-postgresql-password
입니다. -
global.psql.main.password.key
: 시크릿 내에서 암호를 포함하는 키입니다. 예시에서는main-gitlab-password
입니다. -
global.psql.ci.host
: 외부ci
데이터베이스의 호스트 이름을 설정합니다. 도메인 또는 IP 주소로 설정할 수 있습니다.main
및ci
데이터베이스가 동일한 데이터베이스 서버에 있는 경우global.psql.main.host
의 값과 동일할 수 있습니다. -
global.psql.ci.password.secret
: PostgreSQL 사용자를 보유하는 쿠버네티스 시크릿의 이름입니다. 예시에서는gitlab-postgresql-password
입니다. -
global.psql.ci.password.key
: 시크릿 내에서 암호를 포함하는 키입니다. 예시에서는ci-gitlab-password
입니다.
-
-
최종적으로
gitlab-values.yaml
을 사용하여 GitLab 차트를 배포합니다.:helm repo add gitlab https://charts.gitlab.io/ helm repo update helm upgrade --install gitlab gitlab/gitlab --timeout=900s -f gitlab-values.yaml
기존 설치를 여러 데이터베이스로 마이그레이션하기
기존 설치를 여러 데이터베이스로 마이그레이션할 수 있습니다.
준비
기존 설치를 여러 데이터베이스로 마이그레이션하기 전에:
- 데이터베이스의 백업을 생성합니다.
-
툴박스 파드를 찾습니다:
kubectl get pods -lrelease=RELEASE_NAME,app=toolbox
-
데이터베이스 콘솔에 액세스하고 데이터베이스 암호를 제공합니다:
kubectl exec <toolbox pod name> -it -c toolbox -- gitlab-rails dbconsole
이 명령을 데이터베이스 서버에 직접 액세스 할 수있는 호스트의 적합한
psql
명령으로 대체할 수 있습니다. - 충분한 디스크 공간이 있는지 확인하고 다운 타임을 계획하고
다중 데이터베이스 문서에서 SQL 명령으로
gitlabhq_production_ci
데이터베이스를 생성합니다. 이미 데이터베이스 콘솔에 액세스했으므로sudo gitlab-psql
명령을 생략할 수 있습니다. -
데이터베이스 콘솔을 나갑니다:
\q
-
툴박스 파드에서 나갑니다:
exit
GitLab 중지
GitLab이 여러 데이터베이스로 전환하는 동안 데이터베이스에 쓰지 않도록 하려면 현재 GitLab 데이터베이스에 쓰는 모든 서비스를 중지해야 합니다.
-
각 데이터베이스에 액세스하는 배포의 기존 복제본을 저장합니다:
rm -f /tmp/deployments.txt deployments=$(kubectl get deployment --selector 'app in (webservice, sidekiq, kas, gitlab-exporter)' --no-headers -o custom-columns=":metadata.name") for deployment in ${deployments} do replicas=$(kubectl get deployment $deployment -o=jsonpath='{.status.replicas}') echo "$deployment/$replicas" >> /tmp/deployments.txt done
-
데이터베이스 액세스 배포를 축소합니다:
kubectl scale deployment --replicas 0 --selector 'app in (webservice, sidekiq, kas, gitlab-exporter)'
데이터베이스 마이그레이션
데이터베이스를 마이그레이션하려면 다음 단계를 따르세요:
-
toolbox 팟에서 Bash 셸에 액세스합니다:
kubectl exec <toolbox_pod_name> -it -c toolbox -- bash
-
toolbox 팟에서 마이그레이션 명령을 실행합니다:
gitlab-rake gitlab:db:decomposition:migrate
명령이 완료되면 다음 메시지가 표시되어야 합니다:
Database migration finished!
. -
toolbox 팟에서 나옵니다:
exit
GitLab을 두 개의 데이터베이스로 변경
GitLab을 main
과 ci
두 개의 데이터베이스를 사용하도록 변경합니다:
helm upgrade gitlab gitlab/gitlab \
--set global.psql.database=null \
--set global.psql.main.database=gitlabhq_production \
--set global.psql.ci.database=gitlabhq_production_ci \
--set gitlab.migrations.enabled=false \
--set global.extraEnv.GITLAB_ALLOW_SEPARATE_CI_DATABASE=1 \
--reuse-values
마이그레이션이 완료되었는지 확인
-
새로운 toolbox 팟을 찾습니다:
kubectl get pods -lrelease=RELEASE_NAME,app=toolbox
-
toolbox 팟에서 Bash 셸에 액세스합니다:
kubectl exec <toolbox_pod_name> -it -c toolbox -- bash
-
cat /srv/gitlab/config/database.yml
를 실행하여 GitLab 구성에main
과ci
두 데이터베이스가 포함되어 있는지, 그리고 두 데이터베이스가 각각gitlabhq_production
및gitlabhq_production_ci
를 가리키고 있는지 확인합니다.
마이그레이션 및 정리 후
GitLab을 다시 시작하기 전에 레거시 테이블을 쓰기 위해 잠그고 정리해야 합니다.
toolbox 팟 내부에서 다음을 실행합니다:
gitlab-rake gitlab:db:lock_writes
gitlab-rake gitlab:db:truncate_legacy_tables:main
gitlab-rake gitlab:db:truncate_legacy_tables:ci
GitLab 시작
GitLab을 시작하려면 다음을 실행합니다:
while read line; do
deployment=$(echo $line|cut -d'/' -f 1)
replicas=$(echo $line|cut -d'/' -f 2)
kubectl patch deployment "${deployment}" -p "{\"spec\": {\"replicas\": ${replicas}}}"
done < /tmp/deployments.txt