GitLab 차트를 여러 외부 데이터베이스로 구성하기

Tier: Free, Premium, Ultimate Offering: Self-managed Status: Beta

기본적으로 GitLab은 main 데이터베이스라고 하는 단일 애플리케이션 데이터베이스를 사용합니다.

GitLab을 확장하기 위해 GitLab을 여러 애플리케이션 데이터베이스를 사용하도록 구성할 수 있습니다.

여러 외부 데이터베이스로 새로운 설치 GitLab 차트 구성

경고:
알려진 문제로 인해 이 기능은 프로덕션 용도로 준비되지 않았을 수 있습니다.

기본적으로 GitLab은 main 데이터베이스라고 하는 단일 애플리케이션 데이터베이스를 사용합니다.

GitLab을 확장하기 위해 GitLab을 여러 외부 애플리케이션 데이터베이스, 즉 mainci를 사용하도록 구성할 수 있습니다. 다음 다이어그램은 포드가 여러 데이터베이스와 통신하는 방법을 보여줍니다:

graph LR subgraph 외부 데이터베이스 B[(메인 데이터베이스)] C[(CI 데이터베이스)] end subgraph Kubernetes 클러스터 A[GitLab 포드 1] --> B A --> C D[GitLab 포드 2] --> B D --> C end

사전 요구 사항:

  • 외부 데이터베이스 문서에 나열된 모든 사전 요구 사항.
  • 추가적인 빈 gitlabhq_production_ci 데이터베이스가 필요하며, 이는 gitlabhq_production 데이터베이스와 동일한 PostgreSQL 서버에서 실행될 수 있습니다.
  • kubectlhelm CLI 도구를 사용하여 Kubernetes 클러스터에 접근합니다. 더 많은 정보는 GitLab 차트 사전 요구 사항을 참조하세요.

여러 외부 데이터베이스를 설정하려면:

  1. 데이터베이스 사용자 gitlab의 PostgreSQL 비밀번호를 보유하는 Kubernetes 비밀을 생성합니다. 이 비밀번호는 여러 데이터베이스가 서로 다른 비밀번호로 두 개의 서로 다른 물리적 서버에 있을 수 있도록 다를 수 있습니다.

    이 Kubernetes 비밀의 이름을 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>
    
  2. 다음을 사용하여 GitLab 차트를 배포하는 데 사용하는 기존 YAML 파일에 추가하고, host 값을 귀하의 것으로 교체합니다:

    global:
      psql:
        main:
          host: main.database.host # 외부 메인 데이터베이스의 호스트를 이곳에 설정합니다.
          database: gitlabhq_production
          password:
            secret: gitlab-postgresql-password
            key: main-gitlab-password
        ci:
          host: ci.database.host # 외부 ci 데이터베이스의 호스트를 이곳에 설정합니다. 메인 데이터베이스의 호스트와 동일할 수 있습니다.
          database: gitlabhq_production_ci # CI 스키마가 포함된 데이터베이스의 차이로 인해 `database_tasks: true`로 설정됩니다.
          password:
            secret: gitlab-postgresql-password
            key: ci-gitlab-password
    postgresql:
      install: false
    

    여기서:

    • postgresql.install: 내장 데이터베이스를 비활성화하고 외부 데이터베이스를 대신 사용하도록 false로 설정합니다.
    • global.psql.main.host: 외부 main 데이터베이스의 호스트 이름으로 설정하며, 도메인이나 IP 주소일 수 있습니다.
    • global.psql.main.password.secret: PostgreSQL 사용자 비밀번호를 보유하기 위해 사용된 Kubernetes 비밀의 이름입니다.
      우리의 예에서는 gitlab-postgresql-password입니다.
    • global.psql.main.password.key: 비밀 내에서 비밀번호를 포함하는 키입니다.
      우리의 예에서는 main-gitlab-password입니다.
    • global.psql.ci.host: 외부 ci 데이터베이스의 호스트 이름으로 설정합니다. 도메인 또는 IP 주소일 수 있습니다.
      두 데이터베이스 mainci가 동일한 데이터베이스 서버에 있는 경우 global.psql.main.host와 동일한 값을 사용할 수 있습니다.
    • global.psql.ci.password.secret: PostgreSQL 사용자 비밀번호를 보유하기 위해 사용된 Kubernetes 비밀의 이름입니다.
      우리의 예에서는 gitlab-postgresql-password입니다.
    • global.psql.ci.password.key: 비밀 내에서 비밀번호를 포함하는 키입니다.
      우리의 예에서는 ci-gitlab-password입니다.
  3. 마지막으로, 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
    

기존 설치를 여러 데이터베이스로 마이그레이션

기존 설치를 여러 데이터베이스로 마이그레이션할 수 있습니다.

준비

기존 설치를 여러 데이터베이스로 마이그레이션하기 전에:

  1. 데이터베이스의 백업을 진행합니다.

  2. 툴박스 포드를 찾습니다:

    kubectl get pods -lrelease=RELEASE_NAME,app=toolbox
    
  3. 데이터베이스 콘솔에 접근하고 데이터베이스 비밀번호를 입력합니다:

    kubectl exec <toolbox pod name> -it -c toolbox -- gitlab-rails dbconsole
    

    이 명령어는 데이터베이스 서버에 직접 접근할 수 있는 호스트에서 적절한 psql 명령어로 대체할 수 있습니다.

  4. 충분한 디스크 공간이 있는지 확인하고 다운타임을 계획하며, SQL 명령어를 사용하여 새로운 gitlabhq_production_ci 데이터베이스를 생성합니다. 여러 데이터베이스 문서에 설명된 SQL 명령어를 따르세요. 이미 데이터베이스 콘솔에 접근했으므로 sudo gitlab-psql 명령어는 생략할 수 있습니다.

  5. 데이터베이스 콘솔에서 나옵니다:

    \q
    
  6. 툴박스 포드에서 나옵니다:

    exit
    

GitLab 종료

여러 데이터베이스로 전환하는 동안 GitLab이 데이터베이스에 기록하는 것을 방지하기 위해 현재 GitLab 데이터베이스에 기록하는 모든 서비스를 종료해야 합니다.

  1. 각 데이터베이스에 접근하는 배포의 기존 복제를 저장합니다:

    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
    
  2. 데이터베이스 접근 배포의 규모를 줄입니다:

    kubectl scale deployment --replicas 0 --selector 'app in (webservice, sidekiq, kas, gitlab-exporter)'
    

데이터베이스 마이그레이션

데이터베이스를 마이그레이션하려면:

  1. 툴박스 포드에서 Bash 셸에 접근합니다:

    kubectl exec <toolbox_pod_name> -it  -c toolbox -- bash
    
  2. 툴박스 포드에서 마이그레이션 명령을 실행합니다:

    gitlab-rake gitlab:db:decomposition:migrate
    

    이 명령은 다음 메시지를 출력해야 합니다: Database migration finished!.

  3. 툴박스 포드에서 나옵니다:

    exit
    

GitLab을 두 개의 데이터베이스로 전환

GitLab을 mainci 두 개의 데이터베이스로 전환합니다:

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

마이그레이션이 완료되었는지 확인

  1. 새로운 툴박스 포드를 찾습니다:

    kubectl get pods -lrelease=RELEASE_NAME,app=toolbox
    
  2. 툴박스 포드에서 bash 셸에 접근합니다:

    kubectl exec <toolbox_pod_name> -it  -c toolbox -- bash
    
  3. cat /srv/gitlab/config/database.yml을 실행하여 GitLab 설정에 mainci가 모두 포함되어 있고 두 데이터베이스가 각각 gitlabhq_productiongitlabhq_production_ci를 가리키고 있는지 확인합니다.

마이그레이션 후 정리

GitLab을 다시 시작하기 전에, 레거시 테이블의 쓰기를 잠그고 정리해야 합니다.

툴박스 파드 내부에서 다음을 실행하세요:

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