참조 아키텍처: 100 RPS 또는 5,000 사용자까지

Tier: Premium, Ultimate Offering: Self-managed

이 페이지에서는 GitLab 참조 아키텍처를 설명하며, 실제 데이터를 기반으로 평균 100 RPS의 피크로드와 최대 5,000 명의 사용자(수동 및 자동)를 대상으로합니다.

전체 참조 아키텍처 목록은 사용 가능한 참조 아키텍처을 참조하십시오.

참고: 이 아키텍처를 배포하기 전에 먼저 메인 문서를 읽는 것이 좋습니다. 특히 시작하기 전에어떤 아키텍처를 사용할지 결정하는 섹션을 참조하십시오.

서비스 노드 구성 GCP AWS Azure
외부 로드 밸런서3 1 4 vCPU, 3.6 GB 메모리 n1-highcpu-4 c5n.xlarge F4s v2
Consul1 3 2 vCPU, 1.8 GB 메모리 n1-highcpu-2 c5.large F2s v2
PostgreSQL1 3 4 vCPU, 15 GB 메모리 n1-standard-4 m5.xlarge D4s v3
PgBouncer1 3 2 vCPU, 1.8 GB 메모리 n1-highcpu-2 c5.large F2s v2
내부 로드 밸런서3 1 4 vCPU, 3.6 GB 메모리 n1-highcpu-4 c5n.xlarge F4s v2
Redis/Sentinel2 3 2 vCPU, 7.5 GB 메모리 n1-standard-2 m5.large D2s v3
Gitaly5 3 8 vCPU, 30 GB 메모리6 n1-standard-8 m5.2xlarge D8s v3
Praefect5 3 2 vCPU, 1.8 GB 메모리 n1-highcpu-2 c5.large F2s v2
Praefect PostgreSQL1 1+ 2 vCPU, 1.8 GB 메모리 n1-highcpu-2 c5.large F2s v2
Sidekiq7 2 4 vCPU, 15 GB 메모리 n1-standard-4 m5.xlarge D2s v3
GitLab Rails7 3 16 vCPU, 14.4 GB 메모리 n1-highcpu-16 c5.4xlarge F16s v2
모니터링 노드 1 2 vCPU, 1.8 GB 메모리 n1-highcpu-2 c5.large F2s v2
객체 저장소4 - - - - -

각주: 1. 신뢰할 수 있는 서드파티 외부 PaaS PostgreSQL 솔루션에서 선택적으로 실행할 수 있습니다. 자세한 내용은 본인의 PostgreSQL 인스턴스 제공를 참조하십시오. 2. 신뢰할 수 있는 서드파티 외부 PaaS Redis 솔루션에서 선택적으로 실행할 수 있습니다. 자세한 내용은 본인의 Redis 인스턴스 제공를 참조하십시오. 3. 고가용성 기능을 제공할 수 있는 신뢰할 수 있는 서드파티 로드 밸런서 또는 서비스(LB PaaS)에서 실행하는 것이 권장됩니다. 또한 크기 조정은 선택한 로드 밸런서 및 네트워크 대역폭과 같은 추가 요소에 따라 달라집니다. 자세한 내용은 로드 밸런서를 참조하십시오. 4. 신뢰할 수 있는 클라우드 제공업체 또는 자체 관리 솔루션에서 실행해야 합니다. 자세한 내용은 객체 저장소 구성를 참조하십시오. 5. Gitaly 클러스터는 장애 허용성의 장점을 제공하지만 설정 및 관리에 추가 복잡성이 따릅니다. Gitaly 클러스터를 배포하기 전에 기존의 기술적 제한 및 고려사항을 검토하십시오. 샤드 Gitaly를 원하는 경우, “Gitaly”에 대한 동일한 사양을 사용하십시오. 6. Gitaly의 사양은 건강 상태가 좋은 상태의 사용 패턴 및 저장소 크기의 높은 백분위에 기초합니다. 그러나 대형 단일 저장소 (여러 기가바이트보다 큰)나 추가 워크로드가 있는 경우 Git 및 Gitaly 성능에 중대한 영향을 미칠 수 있으며 추가 조정이 필요할 수 있습니다. 7. 구성 요소에 상태적 데이터를 저장하지 않음에 따라 Auto Scaling 그룹 (ASG)에 배치할 수 있습니다. 그러나 클라우드 네이티브 하이브리드 설정은 일반적으로 특정 구성 요소 (예: 마이그레이션Mailroom)를 하나의 노드에서만 실행할 수 있으므로 Kubernetes에서 더 잘 처리됩니다.

참고: 인스턴스 구성을 포함하는 모든 PaaS 솔루션에는 신뢰할 수 있는 클라우드 아키텍처 관행과 일치하기 위해 세 가지 서로 다른 가용 영역의 세 노드 이상을 구현하는 것이 좋습니다.

요구 사항

시작하기 전에 참조 아키텍처 요구 사항을 확인하세요.

테스팅 방법론

5k 아키텍처는 대부분의 작업 흐름을 커버하기 위해 설계되었으며 정기적으로 스모크 및 성능 테스트가 Test Platform 팀에 의해 수행되었습니다. 다음 엔드포인트 처리량 목표에 대해 테스트되었습니다:

  • API: 100 RPS
  • 웹: 10 RPS
  • Git (풀): 10 RPS
  • Git (푸시): 2 RPS

위의 목표는 사용자 수에 해당하는 총 환경 부하의 실제 고객 데이터를 기반으로 선택되었으며, CI 및 기타 작업 부하를 포함합니다.

위 엔드포인트 목표에 대해 정기적으로 더 높은 처리량을 보유하고 있는지를 제안하는 메트릭이 있는 경우, 대규모 단일 리포지토리 또는 주목할만한 추가 작업 부하가 성능 환경에 뚜렷한 영향을 미칠 수 있으며, 추가 조정이 필요할 수 있습니다. 이 경우, 링크된 문서를 참조하고 고객 성공 담당자지원 팀에 문의하는 것이 강력히 권장됩니다.

테스트는 GitLab Performance Tool (GPT)와 해당 데이터셋을 사용하여 정기적으로 수행됩니다. 이 테스트의 결과는 GPT 위키에서 공개되어 있습니다. 테스트 전략에 대한 자세한 내용은 이 문서의 이 섹션을 참조하세요.

테스트에 사용된 로드 밸런서는 Linux 패키지 환경의 경우 HAProxy이며, 클라우드 네이티브 하이브리드의 경우 등가 Cloud 공급자 서비스에는 NGINX Ingress가 사용되었습니다. 이러한 선택은 특정 요구 사항 또는 권장을 나타내지 않으며, 대부분의 신뢰할 수 있는 로드 밸런서가 작동할 것으로 기대됩니다.

구성 요소 설정

GitLab 및 해당 구성 요소를 100 RPS 또는 5,000 사용자까지 수용할 수 있도록 설정하려면:

  1. 외부 로드 밸런서 구성
    • GitLab 애플리케이션 서비스 노드의 부하 분산을 처리하기 위해 구성합니다.
  2. 내부 로드 밸런서 구성
    • GitLab 애플리케이션 내부 연결의 부하 분산을 처리하기 위해 구성합니다.
  3. Consul 구성
    • 서비스 검색 및 상태 확인을 위해 구성합니다.
  4. PostgreSQL 구성
    • GitLab을 위한 데이터베이스입니다.
  5. PgBouncer 구성
    • 데이터베이스 연결 풀링 및 관리를 위해 구성합니다.
  6. Redis 구성
    • 세션 데이터, 임시 캐시 정보 및 배경 작업 대기열을 저장합니다.
  7. Gitaly 클러스터 구성
    • Git 저장소에 액세스를 제공합니다.
  8. Sidekiq 구성
    • 백그라운드 작업 처리를 위해 구성합니다.
  9. 메인 GitLab Rails 애플리케이션 구성
    • Puma, Workhorse, GitLab Shell을 실행하고 UI, API, Git(SSH/HTTP)를 모두 제공합니다.
  10. Prometheus 구성
    • GitLab 환경을 모니터링합니다.
  11. 객체 저장소 구성
    • 공유 데이터 객체용입니다.
  12. 고급 검색 구성 (선택 사항)
    • 전체 GitLab 인스턴스에서 더 빠르고 고급 코드 검색을 위해 구성합니다.

서버는 동일한 10.6.0.0/24 사설 네트워크 범위에서 시작하며, 서로에게 자유롭게 다음 주소로 연결할 수 있습니다.

다음 목록은 각 서버와 해당 IP의 설명을 포함합니다:

  • 10.6.0.10: 외부 로드 밸런서
  • 10.6.0.11: Consul/Sentinel 1
  • 10.6.0.12: Consul/Sentinel 2
  • 10.6.0.13: Consul/Sentinel 3
  • 10.6.0.21: PostgreSQL 프라이머리
  • 10.6.0.22: PostgreSQL 세컨더리 1
  • 10.6.0.23: PostgreSQL 세컨더리 2
  • 10.6.0.31: PgBouncer 1
  • 10.6.0.32: PgBouncer 2
  • 10.6.0.33: PgBouncer 3
  • 10.6.0.20: 내부 로드 밸런서
  • 10.6.0.61: Redis 프라이머리
  • 10.6.0.62: Redis 레플리카 1
  • 10.6.0.63: Redis 레플리카 2
  • 10.6.0.51: Gitaly 1
  • 10.6.0.52: Gitaly 2
  • 10.6.0.93: Gitaly 3
  • 10.6.0.131: Praefect 1
  • 10.6.0.132: Praefect 2
  • 10.6.0.133: Praefect 3
  • 10.6.0.141: Praefect PostgreSQL 1 (비 HA)
  • 10.6.0.71: Sidekiq 1
  • 10.6.0.72: Sidekiq 2
  • 10.6.0.41: GitLab 애플리케이션 1
  • 10.6.0.42: GitLab 애플리케이션 2
  • 10.6.0.43: GitLab 애플리케이션 3
  • 10.6.0.81: Prometheus

외부 로드 밸런서 구성

멀티 노드 GitLab 구성에서 애플리케이션 서버로의 트래픽을 라우팅하기 위해 외부 로드 밸런서가 필요합니다.

사용할 로드 밸런서 또는 정확한 구성에 대한 자세한 내용은 GitLab 문서의 범위를 벗어나지만 로드 밸런서를 참조하여 일반적인 요구 사항에 대한 자세한 내용을 확인하세요. 이 섹션은 선택한 로드 밸런서의 구체적인 구성에 중점을 둘 것입니다.

준비 상태 확인

외부 로드 밸런서가 작동 중인 서비스로만 경로를 지정하도록 하여 내장 모니터링 엔드포인트가 있는지 확인하세요. 준비 상태 확인은 추가 구성을 필요로 하며, 그렇지 않으면 외부 로드 밸런서가 연결할 수 없을 것입니다.

포트

아래 표에 기본적으로 사용되는 포트가 나와 있습니다.

LB 포트 백엔드 포트 프로토콜
80 80 HTTP (1)
443 443 TCP 또는 HTTPS (1) (2)
22 22 TCP
  • (1): 웹 터미널을 지원하려면 로드 밸런서가 WebSocket 연결을 올바르게 처리해야 합니다. HTTP 또는 HTTPS 프록시를 사용하는 경우 로드 밸런서는 ConnectionUpgrade hop-by-hop 헤더를 통과시키도록 구성되어 있어야 합니다. 자세한 내용은 웹 터미널 통합 가이드를 참조하십시오.
  • (2): 포트 443에 HTTPS 프로토콜을 사용하는 경우 로드 밸런서에 SSL 인증서를 추가해야 합니다. 로드 밸런서에서 SSL을 종료하려면 TCP 프로토콜을 사용하세요.

GitLab Pages를 사용하는 경우 사용자 정의 도메인을 지원하려면 추가 포트 구성이 필요합니다. GitLab Pages는 별도의 가상 IP 주소가 필요합니다. /etc/gitlab/gitlab.rbpages_external_url을 새 가상 IP 주소에 지정하도록 DNS를 구성하세요. 자세한 내용은 GitLab Pages 문서를 참조하십시오.

LB 포트 백엔드 포트 프로토콜
80 다양함 (1) HTTP
443 다양함 (1) TCP (2)
  • (1): GitLab Pages의 백엔드 포트는 gitlab_pages['external_http']gitlab_pages['external_https'] 설정에 따라 다릅니다. 자세한 내용은 GitLab Pages 문서를 참조하십시오.
  • (2): GitLab Pages의 포트 443은 항상 TCP 프로토콜을 사용해야 합니다. 사용자는 로드 밸런서에서 SSL을 종료한 경우 사용자 정의 SSL을 구성할 수 있습니다.

대체 SSH 포트

일부 조직은 SSH 포트 22를 열지 않는 정책을 가지고 있습니다. 이러한 경우 SSH를 포트 443에서 사용할 수 있도록 대체 SSH 호스트 이름을 구성하는 것이 도움이 될 수 있습니다. 다른 GitLab HTTP 구성과 비교해서 대체 SSH 호스트 이름에는 새 가상 IP 주소가 필요합니다.

altssh.gitlab.example.com과 같은 대체 SSH 호스트 이름에 대한 DNS를 구성하세요.

LB 포트 백엔드 포트 프로토콜
443 22 TCP

SSL

다음 질문은 환경에서 SSL을 어떻게 처리할 것인가입니다. 여러 가지 옵션이 있습니다:

응용 프로그램 노드가 SSL을 종료

로드 밸런서를 구성하여 포트 443의 연결을 TCP 대신 HTTP(S) 프로토콜로 전달하도록 구성하세요. 이렇게 하면 연결이 응용 프로그램 노드의 NGINX 서비스로 그대로 전달됩니다. NGINX에 SSL 인증서가 있고 포트 443에서 수신 대기합니다.

SSL 인증서를 관리하고 NGINX를 구성하는 자세한 내용은 HTTPS 문서를 참조하십시오.

로드 밸런서가 백엔드 SSL 없이 SSL을 종료

로드 밸런서를 TCP 대신 HTTP(S) 프로토콜을 사용하도록 구성하세요. 로드 밸런서는 SSL 인증서를 관리하고 SSL을 종료하게 됩니다.

로드 밸런서와 GitLab 간 통신이 안전하지 않으므로 몇 가지 추가 구성이 필요합니다. 자세한 내용은 프록시 SSL 문서를 참조하십시오.

로드 밸런서가 백엔드 SSL을 사용하여 SSL을 종료

로드 밸런서를 사용하여 ‘HTTP(S)’ 프로토콜을 사용하도록 구성하세요. 로드 밸런서는 최종 사용자가 볼 SSL 인증서를 관리합니다.

이 시나리오에서 로드 밸런서와 NGINX 간의 트래픽도 안전합니다. 연결이 완전히 안전하기 때문에 편집된 SSL에 대한 구성은 필요하지 않습니다. 그러나 GitLab에 SSL 인증서를 구성해야 합니다. SSL 인증서를 관리하고 NGINX를 구성하는 자세한 내용은 HTTPS 문서를 참조하십시오.

내부 로드 밸런서 구성

다중 노드 GitLab 구성에서 특정 내부 구성요소에 대한 트래픽을 라우팅하기 위해 내부 로드 밸런서가 필요합니다. 일반 요구 사항에 대한 자세한 정보는 로드 밸런서 문서를 참조하십시오. 이 섹션에서는 선택한 로드 밸런서의 특정 구성에 중점을 두고 있습니다.

다음 IP를 예로 들었습니다:

  • 10.6.0.40: 내부 로드 밸런서

HAProxy로 수행하는 방법은 다음과 같습니다:

global
    log /dev/log local0
    log localhost local1 notice
    log stdout format raw local0

defaults
    log global
    default-server inter 10s fall 3 rise 2
    balance leastconn

frontend internal-pgbouncer-tcp-in
    bind *:6432
    mode tcp
    option tcplog

    default_backend pgbouncer

frontend internal-praefect-tcp-in
    bind *:2305
    mode tcp
    option tcplog
    option clitcpka

    default_backend praefect

backend pgbouncer
    mode tcp
    option tcp-check

    server pgbouncer1 10.6.0.31:6432 check
    server pgbouncer2 10.6.0.32:6432 check
    server pgbouncer3 10.6.0.33:6432 check

backend praefect
    mode tcp
    option tcp-check
    option srvtcpka

    server praefect1 10.6.0.131:2305 check
    server praefect2 10.6.0.132:2305 check
    server praefect3 10.6.0.133:2305 check

추가 지침은 선호하는 로드 밸런서 문서를 참조하세요.

Consul 구성

다음으로, Consul 서버를 설정합니다.

참고: Consul은 홀수로 된 3개 이상의 노드에 배포되어야 합니다. 이는 노드가 과반수 투표를 할 수 있도록 보장하기 위함입니다.

다음 IP가 예시로 사용됩니다:

  • 10.6.0.11: Consul 1
  • 10.6.0.12: Consul 2
  • 10.6.0.13: Consul 3

Consul을 구성하려면:

  1. Consul을 호스팅할 서버에 SSH로 로그인합니다.
  2. 선택한 리눅스용 패키지를 다운로드하고 설치합니다. 페이지의 설치 단계 1 및 2를 따로 따르고, 현재 설치된 것과 동일한 버전 및 타입(커뮤니티 또는 엔터프라이즈 에디션)의 올바른 리눅스 패키지를 선택하세요.
  3. /etc/gitlab/gitlab.rb 파일을 편집하고 다음 내용을 추가합니다:

    roles(['consul_role'])
    
    ## Prometheus를 위한 서비스 탐색 활성화
    consul['monitoring_service_discovery'] =  true
    
    ## Consul 서버 노드의 IP
    ## FQDN을 사용하고 IP와 혼합하여 사용할 수도 있습니다
    consul['configuration'] = {
       server: true,
       retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
    }
    
    # 익스포터가 청취할 네트워크 주소 설정
    node_exporter['listen_address'] = '0.0.0.0:9100'
    
    # 업그레이드 시 자동으로 데이터베이스 마이그레이션을 방지
    gitlab_rails['auto_migrate'] = false
    
  4. 첫 번째 리눅스 패키지 노드에서 /etc/gitlab/gitlab-secrets.json 파일을 복사하여 해당 서버의 동일한 이름의 파일을 추가하거나 교체합니다. 이것이 구성하는 첫 번째 리눅스 패키지 노드인 경우, 이 단계를 건너뛸 수 있습니다.

  5. 변경 사항이 적용되려면 GitLab을 다시 구성하세요.

  6. 다른 Consul 노드에 대해서도 위 단계를 진행하고 올바른 IP가 설정되었는지 확인하세요.

3번째 Consul 서버의 프로비저닝이 완료되면 Consul 리더가 _선출_됩니다. Consul 로그 sudo gitlab-ctl tail consul를 보면 ...[INFO] consul: New leader elected: ...가 표시됩니다.

현재 Consul 멤버(서버, 클라이언트)를 나열할 수 있습니다:

sudo /opt/gitlab/embedded/bin/consul members

GitLab 서비스가 실행되는지 확인할 수 있습니다:

sudo gitlab-ctl status

출력은 다음과 유사해야 합니다:

run: consul: (pid 30074) 76834s; run: log: (pid 29740) 76844s
run: logrotate: (pid 30925) 3041s; run: log: (pid 29649) 76861s
run: node-exporter: (pid 30093) 76833s; run: log: (pid 29663) 76855s

PostgreSQL 구성

이 섹션에서는 GitLab과 함께 사용되는 고가용성 PostgreSQL 클러스터를 구성하는 방법에 대해 안내합니다.

자체 PostgreSQL 인스턴스 제공

PostgreSQL을 위한 제3자 외부 서비스를 선택적으로 사용할 수 있습니다.

이를 위해 신뢰할 수 있는 제공업체나 솔루션을 사용해야 합니다. Google Cloud SQLAmazon RDS가 작동되는 것으로 알려져 있습니다. 그러나 Amazon Aurora는 14.4.0부터 기본적으로 활성화된 로드 밸런싱과 호환되지 않습니다.

자세한 내용은 추천 클라우드 제공업체 및 서비스를 참조하십시오.

제3자 외부 서비스를 사용하는 경우:

  1. HA 리눅스 패키지 PostgreSQL 설정에는 PostgreSQL, PgBouncer 및 Consul이 모두 필요하지 않게 됩니다.
  2. 데이터베이스 요구 사항 문서에 따라 PostgreSQL을 설정합니다.
  3. 원하는 비밀번호로 gitlab 사용자를 설정합니다. gitlab 사용자는 gitlabhq_production 데이터베이스를 생성할 권한이 필요합니다.
  4. GitLab 애플리케이션 서버를 적절한 세부 정보로 구성합니다. 이 단계는 GitLab Rails 애플리케이션 구성에서 다루어집니다.
  5. HA를 달성하기 위해 필요한 노드 수가 리눅스 패키지와는 다를 수 있으며, 이에 따라 일치시킬 필요가 없습니다.
  6. 그러나 향상된 성능을 위해 Read Replicas를 통한 데이터베이스 로드 밸런싱이 원하는 경우, 참조 아키텍처의 노드 수를 따르는 것이 권장됩니다.

Linux 패키지를 사용한 스탠드얼론 PostgreSQL

복제 및 장애 조치가 가능한 PostgreSQL 클러스터에 대한 권장 리눅스 패키지 구성은 다음과 같습니다:

  • 최소 3개의 PostgreSQL 노드
  • 최소 3개의 Consul 서버 노드
  • 기본 데이터베이스 읽기 및 쓰기 요청을 추적 및 처리하는 최소 3개의 PgBouncer 노드
  • 데이터베이스 로드 밸런싱 활성화

    각 PostgreSQL 노드에 별도로 구성된 로컬 PgBouncer 서비스. 이는 기본을 추적하는 본 PgBouncer 클러스터와 별도로 구성됩니다.

다음 IP가 예시로 사용됩니다:

  • 10.6.0.21: PostgreSQL 주
  • 10.6.0.22: PostgreSQL 보조 1
  • 10.6.0.23: PostgreSQL 보조 2

먼저, 각 노드에 GitLab 패키지를 설치해야 합니다. 단계를 따라 진행하여 1단계에서 필요한 종속성을 설치하고, 2단계에서 GitLab 패키지 저장소를 추가합니다. 2단계에서 GitLab을 설치할 때는 EXTERNAL_URL 값을 제공하지 않습니다.

포스트그리SQL 노드

  1. 포스트그리SQL 노드 중 하나에 SSH로 로그인합니다.
  2. 포스트그리SQL 사용자명/암호 쌍의 암호 해시를 생성합니다. 이는 기본적으로 gitlab 사용자명을 사용한다고 가정합니다(권장됨). 이 명령은 암호와 확인을 요청합니다. 이 명령이 출력하는 값을 다음 단계의 <postgresql_password_hash> 값으로 사용하세요:

    sudo gitlab-ctl pg-password-md5 gitlab
    
  3. PgBouncer 사용자명/암호 쌍의 암호 해시를 생성합니다. 기본적으로 pgbouncer 사용자명을 사용한다고 가정합니다(권장됨). 이 명령은 암호와 확인을 요청합니다. 이 명령이 출력하는 값을 다음 단계의 <pgbouncer_password_hash> 값으로 사용하세요:

    sudo gitlab-ctl pg-password-md5 pgbouncer
    
  4. 포스트그리SQL 복제 사용자명/암호 쌍의 암호 해시를 생성합니다. 기본적으로 gitlab_replicator 사용자명을 사용한다고 가정합니다(권장됨). 이 명령은 암호와 확인을 요청합니다. 이 명령이 출력하는 값을 다음 단계의 <postgresql_replication_password_hash> 값으로 사용하세요:

    sudo gitlab-ctl pg-password-md5 gitlab_replicator
    
  5. Consul 데이터베이스 사용자명/암호 쌍의 암호 해시를 생성합니다. 기본적으로 gitlab-consul 사용자명을 사용한다고 가정합니다(권장됨). 이 명령은 암호와 확인을 요청합니다. 이 명령이 출력하는 값을 다음 단계의 <consul_password_hash> 값으로 사용하세요:

    sudo gitlab-ctl pg-password-md5 gitlab-consul
    
  6. 각 데이터베이스 노드에서, /etc/gitlab/gitlab.rb 파일을 편집하여 # START user configuration 섹션에서 주석 처리된 값들을 대체하세요:

    # Patroni와 PgBouncer 그리고 Consul만을 사용하도록 모든 컴포넌트를 비활성화합니다.
    roles(['patroni_role', 'pgbouncer_role'])
    
    # PostgreSQL 구성
    postgresql['listen_address'] = '0.0.0.0'
    
    # `max_replication_slots`를 데이터베이스 노드 수의 2배로 설정합니다.
    # Patroni는 복제를 시작할 때 노드당 하나의 추가 슬롯을 사용합니다.
    patroni['postgresql']['max_replication_slots'] = 6
    
    # `max_wal_senders`를 클러스터의 복제 슬롯 수보다 하나 더 설정합니다.
    # 이는 복제가 모든 사용 가능한 데이터베이스 연결을 사용하는 것을 방지하기 위해 사용됩니다.
    patroni['postgresql']['max_wal_senders'] = 7
    
    # 업그레이드 시 자동으로 데이터베이스 마이그레이션을 실행하지 않도록 설정합니다.
    gitlab_rails['auto_migrate'] = false
    
    # Consul 에이전트 구성
    consul['services'] = %w(postgresql)
    ## 프로메테우스를 위한 서비스 검색 활성화
    consul['monitoring_service_discovery'] =  true
    
    # START user configuration
    # 필수 정보 섹션에 설명된 대로 실제 값을 설정하세요
    #
    # PGBOUNCER_PASSWORD_HASH를 생성된 md5 값으로 대체합니다
    postgresql['pgbouncer_user_password'] = '<pgbouncer_password_hash>'
    # POSTGRESQL_REPLICATION_PASSWORD_HASH를 생성된 md5 값으로 대체합니다
    postgresql['sql_replication_password'] = '<postgresql_replication_password_hash>'
    # POSTGRESQL_PASSWORD_HASH를 생성된 md5 값으로 대체합니다
    postgresql['sql_user_password'] = '<postgresql_password_hash>'
    
    # Patroni API를 위해 기본 인증을 설정합니다 (모든 노드에서 동일한 사용자명/암호를 사용하세요).
    patroni['username'] = '<patroni_api_username>'
    patroni['password'] = '<patroni_api_password>'
    
    # Network Address로 10.6.0.0/24를 대체합니다
    postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
    
    # 데이터베이스 로드 밸런싱을 위한 로컬 PgBouncer 서비스
    pgbouncer['databases'] = {
       gitlabhq_production: {
          host: "127.0.0.1",
          user: "pgbouncer",
          password: '<pgbouncer_password_hash>'
       }
    }
    
    # 모니터링을 위해 익스포터가 수신 대기할 네트워크 주소 설정
    node_exporter['listen_address'] = '0.0.0.0:9100'
    postgres_exporter['listen_address'] = '0.0.0.0:9187'
    
    ## Consul 서버 노드의 IP
    ## FQDN을 사용할 수 있으며 IP와 혼합하여 사용할 수 있습니다.
    consul['configuration'] = {
       retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
    }
    #
    # END user configuration
    

포스트그리SQL은 장애 조치를 관리하는 Patroni를 사용하여, 기본적으로 pg_rewind를 사용하여 충돌을 처리합니다. 거의 모든 장애 조치 처리 방법과 마찬가지로, 데이터 손실 가능성이 작습니다. 자세한 내용은 다양한 Patroni 복제 방법을 참조하세요.

  1. 첫 번째 Linux 패키지 노드에서 /etc/gitlab/gitlab-secrets.json 파일을 복사하여 이 서버의 동일한 이름의 파일을 추가하거나 교체합니다. 이것이 구성 중인 첫 번째 Linux 패키지 노드인 경우 이 단계를 건너뛸 수 있습니다.

  2. 변경 사항이 적용되도록 GitLab을 다시 구성하세요.

필요에 따라 고급 구성 옵션을 추가할 수 있습니다.

포스트그리SQL 구성 후 설정

주 사이트의 Patroni 노드 중 하나에 SSH로 로그인합니다:

  1. 리더와 클러스터 상태를 확인합니다:

    gitlab-ctl patroni members
    

    출력은 다음과 유사해야 합니다:

    | Cluster       | Member                            |  Host     | Role   | State   | TL  | Lag in MB | Pending restart |
    |---------------|-----------------------------------|-----------|--------|---------|-----|-----------|-----------------|
    | postgresql-ha | <포스트그리SQL 기본 호스트명>        | 10.6.0.21 | Leader | running | 175 |           | *               |
    | postgresql-ha | <포스트그리SQL 보조 1 호스트명>     | 10.6.0.22 |        | running | 175 | 0         | *               |
    | postgresql-ha | <포스트그리SQL 보조 2 호스트명>     | 10.6.0.23 |        | running | 175 | 0         | *               |
    

만약 어떤 노드의 ‘State’ 열이 “running”이 아니라면, 계속 진행하기 전에 PostgreSQL 복제 및 장애 조치 문제 해결을 확인하세요.

PgBouncer 구성

포스트그리SQL 서버가 모두 설정되었으므로, 기본 데이터베이스에 대한 읽기/쓰기를 추적하고 처리하기 위해 PgBouncer를 구성해 봅시다.

참고: PgBouncer는 단일 스레드이며 CPU 코어의 증가로부터 유의미한 이점을 거의 얻지 않습니다. 자세한 정보는 확장 설명서를 참조하세요.

다음 IP 주소들은 예시로 사용됩니다:

  • 10.6.0.31: PgBouncer 1
  • 10.6.0.32: PgBouncer 2
  • 10.6.0.33: PgBouncer 3
  1. 각 PgBouncer 노드에서, /etc/gitlab/gitlab.rb를 편집하고, 이전에 설정한 암호 해시로 <consul_password_hash><pgbouncer_password_hash>를 대체하세요:

    # Pgbouncer 및 Consul 에이전트를 제외한 모든 구성 요소 비활성화
    roles(['pgbouncer_role'])
    
    # PgBouncer 구성
    pgbouncer['admin_users'] = %w(pgbouncer gitlab-consul)
    pgbouncer['users'] = {
       'gitlab-consul': {
          password: '<consul_password_hash>'
       },
       'pgbouncer': {
          password: '<pgbouncer_password_hash>'
       }
    }
    
    # Consul 에이전트 구성
    consul['watchers'] = %w(postgresql)
    consul['configuration'] = {
    retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13)
    }
    
    # Prometheus를 위한 서비스 검색 활성화
    consul['monitoring_service_discovery'] = true
    
    # 수출기가 청취할 네트워크 주소 설정
    node_exporter['listen_address'] = '0.0.0.0:9100'
    pgbouncer_exporter['listen_address'] = '0.0.0.0:9188'
    
  2. 첫 번째 Linux 패키지 노드에서 /etc/gitlab/gitlab-secrets.json 파일을 복사하고, 이 서버에 동일한 이름의 파일을 추가하거나 대체하세요. 만약 이게 처음 구성하는 Linux 패키지 노드라면, 이 단계는 건너뛸 수 있습니다.

  3. 변경 사항이 적용되려면 GitLab을 다시 구성하세요.

  4. Consul이 PgBouncer를 다시로드할 수 있게 .pgpass 파일을 생성하세요. 묻힐 때, 두 번째로 PgBouncer 암호를 입력하세요:

    gitlab-ctl write-pgpass --host 127.0.0.1 --database pgbouncer --user pgbouncer --hostuser gitlab-consul
    
  5. 각 노드가 현재 마스터에 연결되어 있는지 확인하세요:

    gitlab-ctl pgb-console #PGBOUNCER_PASSWORD를 입력하라는 메시지가 표시됩니다.
    

    암호를 입력한 후 오류 psql: ERROR: Auth failed가 표시되면, 이전에 올바른 형식으로 MD5 암호 해시를 생성했는지 확인하세요. 올바른 형식은 암호와 사용자 이름을 연결하는 것입니다: PASSWORDUSERNAME. 예를 들어, Sup3rS3cr3tpgbouncerpgbouncer 사용자를 위한 MD5 암호 해시를 생성하는 데 필요한 텍스트입니다.

  6. 콘솔 프롬프트를 사용할 수 있게 되면, 다음 쿼리를 실행하세요:

    show databases ; show clients ;
    

    출력은 다음과 유사해야 합니다:

            name         |  host       | port |      database       | force_user | pool_size | reserve_pool | pool_mode | max_connections | current_connections
    ---------------------+-------------+------+---------------------+------------+-----------+--------------+-----------+-----------------+---------------------
     gitlabhq_production | MASTER_HOST | 5432 | gitlabhq_production |            |        20 |            0 |           |               0 |                   0
     pgbouncer           |             | 6432 | pgbouncer           | pgbouncer  |         2 |            0 | statement |               0 |                   0
    (2 rows)
    
     type |   user    |      database       |  state  |   addr         | port  | local_addr | local_port |    connect_time     |    request_time     |    ptr    | link | remote_pid | tls
    ------+-----------+---------------------+---------+----------------+-------+------------+------------+---------------------+---------------------+-----------+------+------------+-----
     C    | pgbouncer | pgbouncer           | active  | 127.0.0.1      | 56846 | 127.0.0.1  |       6432 | 2017-08-21 18:09:59 | 2017-08-21 18:10:48 | 0x22b3880 |      |          0 |
    (2 rows)
    
  7. GitLab 서비스가 실행 중인지 확인하세요:

    sudo gitlab-ctl status
    

    출력은 다음과 유사해야 합니다:

    run: consul: (pid 31530) 77150s; run: log: (pid 31106) 77182s
    run: logrotate: (pid 32613) 3357s; run: log: (pid 30107) 77500s
    run: node-exporter: (pid 31550) 77149s; run: log: (pid 30138) 77493s
    run: pgbouncer: (pid 32033) 75593s; run: log: (pid 31117) 77175s
    run: pgbouncer-exporter: (pid 31558) 77148s; run: log: (pid 31498) 77156s
    

Redis 구성

확장 가능한 환경에서 Redis를 사용하는 데는 기본 x 복제본 토폴로지와 Redis Sentinel 서비스를 사용하여 감시하고 자동으로 장애 조치 프로시저를 시작할 수 있습니다.

참고: Redis 클러스터는 각각 홀수 개수의 3개 이상의 노드에 배포되어야 합니다. 이는 Redis Sentinel이 쿼럼의 일부로서 투표를 할 수 있도록 하기 위한 것입니다. 이는 클라우드 공급업체 서비스와 같이 외부적으로 Redis를 구성할 때는 적용되지 않습니다.

참고: Redis는 주로 단일 스레드로 동작하며 CPU 코어의 증가로부터 유의미한 이점을 거의 얻지 않습니다. 자세한 정보는 확장 설명서를 참조하세요.

Sentinel과 함께 사용할 경우 Redis 사용에 대한 인증이 필요합니다. 자세한 내용은 Redis 보안 문서를 참조하세요. Redis 서비스를 보호하기 위해 Redis 암호와 엄격한 방화벽 규칙의 조합을 사용하는 것을 권장합니다. Redis를 GitLab과 구성하기 전에 전적으로 토폴로지와 구조를 완전히 이해하기 위해 Redis Sentinel 문서를 읽는 것을 권장합니다.

Redis 설정에 대한 요구 사항은 다음과 같습니다:

  1. 모든 Redis 노드는 서로 통신하고 Redis(6379) 및 Sentinel(26379) 포트를 통해 들어오는 연결을 수락해야 합니다 (기본값을 변경하지 않는 한).
  2. GitLab 응용 프로그램을 호스팅하는 서버는 Redis 노드에 액세스할 수 있어야 합니다.
  3. 외부 네트워크(인터넷)의 액세스로부터 노드를 보호하기 위해 방화벽과 같은 옵션들을 사용하세요.

이 섹션에서는 GitLab에서 사용하기 위해 두 개의 외부 Redis 클러스터를 구성하는 방법에 대해 안내합니다. 다음 IP 주소를 예시로 사용합니다:

  • 10.6.0.61: Redis 기본
  • 10.6.0.62: Redis 복제본 1
  • 10.6.0.63: Redis 복제본 2

자체 Redis 인스턴스 제공

다음 안내에 따라 서드 파티 외부 서비스로 Redis 인스턴스를 선택적으로 사용할 수 있습니다.

  • 신뢰할 수 있는 제공 업체나 솔루션을 사용해야 합니다. Google MemorystoreAWS ElastiCache가 작동하는 것으로 알려져 있습니다.
  • Redis 클러스터 모드는 특별히 지원되지 않지만, Redis 단독 모드와 HA는 지원됩니다.
  • 설정에 따라 Redis 삭제 모드를 설정해야 합니다.

자세한 내용은 권장 클라우드 제공업체 및 서비스를 참조하십시오.

Redis 클러스터 구성

이 섹션에서 새로운 Redis 인스턴스를 설치하고 설정합니다.

기본 및 복제 Redis 노드는 모두 redis['password']에서 정의한 동일한 암호가 필요합니다. 장애 조치 중에 언제든지 Sentinel은 노드를 다시 구성하고 해당 노드의 상태를 주(primary) 또는 복제(replica)로 변경할 수 있습니다.

기본 Redis 노드 구성

  1. 기본 Redis 서버로 SSH 연결합니다.
  2. 선택한 Linux 패키지를 다운로드하고 설치합니다. 페이지에서 설치 단계 1 및 2만 따르고, 현재 설치된 버전 및 유형(커뮤니티 또는 엔터프라이즈 에디션)과 동일한 Linux 패키지를 선택하세요.
  3. /etc/gitlab/gitlab.rb를 편집하고 다음 내용을 추가합니다:

    # 서버 역할을 'redis_master_role'으로 지정하고, Sentinel 및 수프 서비스를 사용하세요.
    roles ['redis_sentinel_role', 'redis_master_role', 'consul_role']
    
    # Redis Sentinel 서비스의 IP 바인드 주소 및 결정 과정 번호를 설정합니다.
    sentinel['bind'] = '0.0.0.0'
    sentinel['quorum'] = 2
    
    # 다른 기기가 연결할 수 있는 로컬 IP를 가리키는 IP 주소.
    # 모든 인터페이스에서 수신하는 '0.0.0.0'으로 바인딩할 수도 있습니다.
    # 외부 접근 가능한 IP에 바인딩할 경우, 무단 액세스를 방지하기 위해 추가 방화벽 규칙을 추가하세요.
    redis['bind'] = '10.6.0.61'
    
    # Redis가 TCP 요청을 수신할 수 있도록 포트를 정의합니다. 이를 통해 다른 기기가 연결할 수 있습니다.
    redis['port'] = 6379
    
    ## Sentinel을 위한 주요 Redis 서버의 포트, 기본값에서 변경하려면 주석을 해제하세요. 기본값은 `6379`입니다.
    #redis['master_port'] = 6379
    
    # Redis 및 복제본에 대한 암호 인증 설정(모든 노드에서 동일한 암호 사용).
    redis['password'] = 'REDIS_PRIMARY_PASSWORD'
    redis['master_password'] = 'REDIS_PRIMARY_PASSWORD'
    
    ## 모든 Redis 노드에서 동일해야 함
    redis['master_name'] = 'gitlab-redis'
    
    ## 이 기본 Redis 노드의 IP.
    redis['master_ip'] = '10.6.0.61'
    
    ## Prometheus를 위한 서비스 검색 활성화
    consul['monitoring_service_discovery'] =  true
    
    ## Consul 서버 노드의 IP
    ## FQDN을 사용하고 IP와 혼합할 수도 있습니다
    consul['configuration'] = {
       retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
    }
    
    # 수출자가 수신 대기할 네트워크 주소 설정
    node_exporter['listen_address'] = '0.0.0.0:9100'
    redis_exporter['listen_address'] = '0.0.0.0:9121'
    
    # 업그레이드 시 자동으로 데이터베이스 마이그레이션을 방지
    gitlab_rails['auto_migrate'] = false
    
  4. 첫 번째 Linux 패키지 노드에서 /etc/gitlab/gitlab-secrets.json 파일을 복사하여 이 서버의 동일한 파일에 추가하거나 바꿉니다. 이것이 처음 구성하는 Linux 패키지 노드라면 이 단계를 건너뛸 수 있습니다.

  5. 변경 사항이 적용되려면 GitLab을 다시 구성하세요.

복제 Redis 노드 구성

  1. 복제 Redis 서버로 SSH 연결합니다.
  2. 선택한 Linux 패키지를 다운로드하고 설치합니다. 페이지에서 설치 단계 1 및 2만 따르고, 현재 설치된 버전 및 유형(커뮤니티 또는 엔터프라이즈 에디션)과 동일한 Linux 패키지를 선택하세요.
  3. /etc/gitlab/gitlab.rb를 편집하고 다음 내용을 추가합니다:

    # 서버 역할을 'redis_sentinel_role' 및 'redis_replica_role'로 지정합니다.
    roles ['redis_sentinel_role', 'redis_replica_role', 'consul_role']
    
    # Redis Sentinel 서비스의 IP 바인드 주소 및 결정 과정 번호를 설정합니다.
    sentinel['bind'] = '0.0.0.0'
    sentinel['quorum'] = 2
    
    # 다른 기기가 연결할 수 있는 로컬 IP를 가리키는 IP 주소.
    # 모든 인터페이스에서 수신하는 '0.0.0.0'으로 바인딩할 수도 있습니다.
    # 외부 접근 가능한 IP에 바인딩할 경우, 무단 액세스를 방지하기 위해 추가 방화벽 규칙을 추가하세요.
    redis['bind'] = '10.6.0.62'
    
    # Redis가 TCP 요청을 수신할 수 있도록 포트를 정의합니다. 이를 통해 다른 기기가 연결할 수 있습니다.
    redis['port'] = 6379
    
    ## Sentinel을 위한 주요 Redis 서버의 포트, 기본값에서 변경하려면 주석을 해제하세요. 기본값은 `6379`입니다.
    #redis['master_port'] = 6379
    
    # 주요 노드를 위해 설정한 Redis 인증 암호와 동일한 암호입니다.
    redis['password'] = 'REDIS_PRIMARY_PASSWORD'
    redis['master_password'] = 'REDIS_PRIMARY_PASSWORD'
    
    ## 모든 Redis 노드에서 동일해야 함
    redis['master_name'] = 'gitlab-redis'
    
    # 주요 Redis 노드의 IP입니다.
    redis['master_ip'] = '10.6.0.61'
    
    ## Prometheus를 위한 서비스 검색 활성화
    consul['monitoring_service_discovery'] =  true
    
    ## Consul 서버 노드의 IP
    ## FQDN을 사용하고 IP와 혼합할 수도 있습니다
    consul['configuration'] = {
       retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
    }
    
    # 수출자가 수신 대기할 네트워크 주소 설정
    node_exporter['listen_address'] = '0.0.0.0:9100'
    redis_exporter['listen_address'] = '0.0.0.0:9121'
    
    # 업그레이드 시 자동으로 데이터베이스 마이그레이션을 방지
    gitlab_rails['auto_migrate'] = false
    
  4. 첫 번째 Linux 패키지 노드에서 /etc/gitlab/gitlab-secrets.json 파일을 복사하여 이 서버의 동일한 파일에 추가하거나 바꿉니다. 이것이 처음 구성하는 Linux 패키지 노드라면 이 단계를 건너뛸 수 있습니다.

  5. 변경 사항이 적용되려면 GitLab을 다시 구성하세요.
  6. 모든 다른 복제 노드에 대해 단계를 다시 진행하고, IP를 올바르게 설정하는지 확인하세요.

필요한 경우 고급 구성 옵션을 추가할 수 있습니다.

Gitaly 클러스터 구성

Gitaly 클러스터는 Git 저장소를 저장하기 위한 GitLab에서 제공하고 권장하는 내결함성 솔루션입니다. 이 구성에서 각 Git 저장소는 클러스터의 모든 Gitaly 노드에 저장되며, 하나는 주 노드로 지정되며, 주 노드가 다운되면 자동으로 장애 조치가 발생합니다.

경고: Gitaly 사양은 사용량 및 저장소 크기의 높은 백분위수를 기반으로 합니다. 그러나 큰 모노 저장소 (여러 기가바이트보다 큰)나 추가 작업 부하가 있는 경우 환경의 성능에 중대한 영향을 미칠 수 있으며, 추가적인 조정이 필요할 수 있습니다. 이 경우 해당하는 경우 링크된 설명서를 참고하시고 더 많은 지침을 위해 고객 성공 담당자지원 팀에 문의하는 것을 강력히 권장합니다.

Gitaly 클러스터는 내결함성의 이점을 제공하지만 구성 및 관리에 추가 복잡성이 동반됩니다. Gitaly 클러스터를 배포하기 전에 기술적 제한 사항 및 고려 사항을 검토하세요.

가이드:

권장되는 클러스터 구성에는 다음 구성 요소가 포함됩니다:

  • 3개의 Gitaly 노드: Git 저장소의 복제된 저장
  • 3개의 Praefect 노드: Gitaly 클러스터의 라우터 및 트랜잭션 관리자
  • 1개의 Praefect PostgreSQL 노드: Praefect용 데이터베이스 서버. Praefect 데이터베이스 연결을 고가용성으로 유지하려면 타사 솔루션이 필요합니다.
  • 1개의 로드 밸런서: Praefect에는 로드 밸런서가 필요합니다. 내부 로드 밸런서를 사용합니다.

이 섹션에서는 권장되는 표준 설정 방법에 대해 자세히 설명합니다. 더 고급 설정에 대해서는 독립 Gitaly 클러스터 설명서를 참조하세요.

Praefect PostgreSQL 구성

Gitaly 클러스터의 라우터 및 트랜잭션 관리자인 Praefect에는 Gitaly 클러스터 상태를 저장하기 위한 자체 데이터베이스 서버가 필요합니다.

고가용성 구성을 원하는 경우 Praefect에는 타사 PostgreSQL 데이터베이스가 필요합니다. 내장 솔루션은 작업 중입니다.

Praefect HA가 아닌 PostgreSQL 독립된 Linux 패키지 사용

다음 IP 주소를 예시로 사용합니다:

  • 10.6.0.141: Praefect PostgreSQL

먼저 Praefect PostgreSQL 노드에 Linux GitLab 패키지를 설치하세요. 다음 단계에서는 1단계에서 필요한 종속성을 설치하고, 2단계에서는 GitLab 패키지 저장소를 추가합니다. 두 번째 단계에서 GitLab을 설치할 때 EXTERNAL_URL 값을 제공하지 마세요.

  1. Praefect PostgreSQL 노드에 SSH로 연결합니다.
  2. Praefect PostgreSQL 사용자에게 사용할 강력한 암호를 생성하세요. 이 암호를 <praefect_postgresql_password>로 메모하세요.
  3. Praefect PostgreSQL 사용자/암호 쌍에 대한 암호 해시를 생성합니다. 이 명령은 기본 사용자 praefect(권장)가 사용됐다고 가정합니다. 명령은 암호 <praefect_postgresql_password> 및 확인을 요청합니다. 이 명령에서 출력된 값을 다음 단계의 <praefect_postgresql_password_hash> 값으로 사용하세요:

    sudo gitlab-ctl pg-password-md5 praefect
    
  4. /etc/gitlab/gitlab.rb 파일을 편집하여 # START user configuration 섹션에 기재된 값을 대체하세요:

    # PostgreSQL 및 Consul을 제외한 모든 구성 요소를 비활성화
    roles(['postgres_role', 'consul_role'])
    
    # PostgreSQL 구성
    postgresql['listen_address'] = '0.0.0.0'
    
    # 업그레이드 시 데이터베이스 마이그레이션 자동 실행 방지
    gitlab_rails['auto_migrate'] = false
    
    # Consul 에이전트 구성
    ## Prometheus에 대한 서비스 검색 활성화
    consul['monitoring_service_discovery'] =  true
    
    # START user configuration
    # 필수 정보 섹션에 설명된 대로 실제 값을 설정하세요
    #
    # PRAEFECT_POSTGRESQL_PASSWORD_HASH를 생성된 md5 값으로 대체하세요
    postgresql['sql_user_password'] = "<praefect_postgresql_password_hash>"
    
    # XXX.XXX.XXX.XXX/YY를 네트워크 주소로 대체하세요
    postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
    
    # 모니터링을 위해 내보내기가 수신 대기할 네트워크 주소 설정
    node_exporter['listen_address'] = '0.0.0.0:9100'
    postgres_exporter['listen_address'] = '0.0.0.0:9187'
    
    ## Consul 서버 노드의 IP
    ## FQDN을 사용하거나 IP와 혼합하여 사용할 수 있습니다
    consul['configuration'] = {
       retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
    }
    #
    # END user configuration
    
  5. 이전에 구성한 첫 번째 Linux 패키지 노드의 /etc/gitlab/gitlab-secrets.json 파일을 복사하여 이 서버의 동일한 이름의 파일에 추가하거나 대체하세요. 이것이 구성하는 첫 번째 Linux 패키지 노드인 경우 이 단계를 건너뛰시면 됩니다.

  6. 변경 사항이 적용되도록 GitLab 재구성을 실행하세요.

  7. 후속 구성을 따르세요.

Praefect HA PostgreSQL 타사 솔루션

Praefect의 데이터베이스를 완전한 고가용성을 목표로 한다면 타사 PostgreSQL 솔루션이 권장됩니다. (여기)에서 언급된 대로 사용 가능합니다.

PostgreSQL HA를 위한 많은 타사 솔루션이 있습니다. Praefect와 함께 작동하려면 선택한 솔루션이 다음 사항을 준수해야 합니다:

  • 장애 조치(Failover) 시 변경되지 않는 모든 연결을 위한 정적 IP.
  • LISTEN SQL 기능을 지원해야 함.

참고: 타사 설정을 통해 Praefect의 데이터베이스를 기본 GitLab 데이터베이스와 동일한 서버에 편리하게 위치시키는 것이 가능합니다. 단, Geo를 사용하는 경우 별도의 데이터베이스 인스턴스가 복제를 올바르게 처리하기 위해 필요합니다. 이 설정에서는 주 데이터베이스 설정 사양을 변경할 필요가 없어야하며 영향은 최소화되어야 합니다.

이를 위해 신뢰할 수 있는 제공업체나 솔루션을 사용해야합니다. Google Cloud SQLAmazon RDS가 작동되는 것으로 알려져 있습니다. 그러나 Amazon Aurora는 기본적으로 로드 밸런싱이 활성화되어 있어 14.4.0부터 호환되지 않습니다.

자세한 내용은 권장 클라우드 제공업체 및 서비스를 참조하십시오.

데이터베이스를 설정한 후 후 구성을 따르세요.

Praefect PostgreSQL 후 구성

Praefect PostgreSQL 서버를 설정한 후에는 Praefect가 사용할 사용자 및 데이터베이스를 구성해야 합니다.

사용자는 praefect, 데이터베이스는 praefect_production으로 설정하는 것이 좋습니다. 앞서 구성한 비밀번호는 사용자가 암호로 사용됩니다(<praefect_postgresql_password>).

Linux 패키지 PostgreSQL 설치에서는 다음과 같이 작동합니다:

  1. Praefect PostgreSQL 노드로 SSH 합니다.
  2. 관리 액세스로 PostgreSQL 서버에 연결합니다. 여기서 gitlab-psql 사용자를 사용해야 하며, Linux 패키지에서 기본적으로 추가되었기 때문에 template1 데이터베이스가 사용됩니다.

    /opt/gitlab/embedded/bin/psql -U gitlab-psql -d template1 -h POSTGRESQL_SERVER_ADDRESS
    
  3. 새 사용자 praefect를 생성하고, <praefect_postgresql_password>로 대체합니다.

    CREATE ROLE praefect WITH LOGIN CREATEDB PASSWORD '<praefect_postgresql_password>';
    
  4. 이번에는 praefect 사용자로 PostgreSQL 서버에 다시 연결합니다.

    /opt/gitlab/embedded/bin/psql -U praefect -d template1 -h POSTGRESQL_SERVER_ADDRESS
    
  5. praefect_production이라는 새 데이터베이스를 생성합니다.

    CREATE DATABASE praefect_production WITH ENCODING=UTF8;
    

Praefect 구성

Praefect는 Gitaly Cluster의 라우터 및 트랜잭션 관리자이며 모든 Gitaly 연결은 이를 통해 이루어집니다. 이 섹션에서는 Praefect를 구성하는 방법을 자세히 설명합니다.

참고: Praefect는 홀수 개의 3개 또는 그 이상의 노드에 배포되어야 합니다. 이는 노드가 쿼럼의 일부로서 투표를 할 수 있도록하여야하기 때문입니다.

Praefect는 클러스터 전체의 통신을 보호하기 위해 여러 비밀 토큰을 필요로 합니다:

  • <praefect_external_token>: Gitaly 클러스터에 호스팅된 저장소에 사용되며, 이 토큰을 보유한 Gitaly 클라이언트만 액세스할 수 있습니다.
  • <praefect_internal_token>: Gitaly 클러스터 내부의 복제 트래픽에 사용됩니다. 이 토큰은 praefect_external_token과 구분되며, Gitaly 클라이언트는 Praefect 클러스터의 내부 노드에 직접 액세스할 수 없어야 합니다. 이는 데이터 손실로 이어질 수 있기 때문입니다.
  • <praefect_postgresql_password>: 이전 섹션에서 정의한 Praefect PostgreSQL 암호가 이 설정의 일부로 필요합니다.

Gitaly 클러스터 노드는 가상 스토리지를 통해 Praefect에서 구성됩니다. 각 스토리지는 클러스터를 구성하는 각 Gitaly 노드에 대한 정보를 포함하고 있습니다. 각 스토리지에는 이름이 지정되며, 이 이름은 구성의 여러 영역에서 사용됩니다. 이 가이드에서는 스토리지의 이름이 default로 설정되어 있습니다.

Praefect의 더 자세한 정보는 Praefect documentation을 참조하십시오.

다음 IP 주소가 예시로 사용됩니다:

  • 10.6.0.131: Praefect 1
  • 10.6.0.132: Praefect 2
  • 10.6.0.133: Praefect 3

Praefect 노드를 구성하려면 각 노드에서 다음을 수행하세요:

  1. Praefect 서버에 SSH로 연결합니다.
  2. 원하는 Linux 패키지를 다운로드 및 설치합니다. 페이지의 설치 단계 1과 2만 따르도록합니다.
  3. /etc/gitlab/gitlab.rb 파일을 편집하여 Praefect를 구성합니다:

    참고: GitLab에서 요구하는대로 virtual_storages에서 default 항목을 제거할 수 없습니다.

    # Praefect 서버에서 불필요한 서비스 실행 회피
    gitaly['enable'] = false
    postgresql['enable'] = false
    redis['enable'] = false
    nginx['enable'] = false
    puma['enable'] = false
    sidekiq['enable'] = false
    gitlab_workhorse['enable'] = false
    prometheus['enable'] = false
    alertmanager['enable'] = false
    gitlab_exporter['enable'] = false
    gitlab_kas['enable'] = false
    
    # Praefect 구성
    praefect['enable'] = true
    
    # 업그레이드 시 자동으로 데이터베이스 마이그레이션을 실행되지 않도록 함
    praefect['auto_migrate'] = false
    gitlab_rails['auto_migrate'] = false
    
    # Consul 에이전트 구성
    consul['enable'] = true
    ## Prometheus를 위한 서비스 검색 활성화
    consul['monitoring_service_discovery'] = true
    
    # START 사용자 구성
    # 필수 정보 섹션에 설명된대로 실제 값으로 설정해주십시오
    #
    
    praefect['configuration'] = {
       # ...
       listen_addr: '0.0.0.0:2305',
       auth: {
          # ...
          # Praefect 외부 토큰
          # 이것은 Praefect 클러스터 외부(예: GitLab Shell과 같은)의 클라이언트가 Praefect 클러스터와 통신하는 데 필요합니다.
          token: '<praefect_external_token>',
       },
       # Praefect 데이터베이스 설정
       database: {
          # ...
          host: '10.6.0.141',
          port: 5432,
          dbname: 'praefect_production',
          user: 'praefect',
          password: '<praefect_postgresql_password>',
       },
       # Praefect Virtual Storage 구성
       # 저장소 해시의 이름은 GitLab 서버의 git_data_dirs('praefect') 및 Gitaly 노드의 gitaly['configuration'][:storage]('gitaly-1')에 일치해야합니다
       virtual_storage: [
          {
             # ...
             name: 'default',
             node: [
                {
                   storage: 'gitaly-1',
                   address: 'tcp://10.6.0.91:8075',
                   token: '<praefect_internal_token>'
                },
                {
                   storage: 'gitaly-2',
                   address: 'tcp://10.6.0.92:8075',
                   token: '<praefect_internal_token>'
                },
                {
                   storage: 'gitaly-3',
                   address: 'tcp://10.6.0.93:8075',
                   token: '<praefect_internal_token>'
                },
             ],
          },
       ],
       # Praefect의 모니터링을 위해 수신 대기할 네트워크 주소를 설정합니다
       prometheus_listen_addr: '0.0.0.0:9652',
    }
    
    # 노드 익스포터가 모니터링을 위해 수신 대기할 네트워크 주소를 설정합니다
    node_exporter['listen_address'] = '0.0.0.0:9100'
    
    ## Consul 서버 노드의 IP
    ## FQDN을 사용하거나 IP와 혼합하여 사용할 수 있습니다
    consul['configuration'] = {
       retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
    }
    #
    # END 사용자 구성
    
  4. 첫번째 Linux 패키지 노드에서 /etc/gitlab/gitlab-secrets.json 파일을 복사하여 이 서버의 동일한 이름의 파일을 추가하거나 교체합니다. 이것이 구성하는 첫 Linux 패키지 노드인 경우, 이 단계를 건너뛸 수 있습니다.

  5. Praefect는 주 데이터베이스 응용 프로그램과 마찬가지로 데이터베이스 마이그레이션을 실행해야합니다. 이를 위해 Praefect 노드 중 한 노드만 마이그레이션을 실행해야합니다(배포 노드라고도 함). 이 노드는 다음과 같이 구성되어야합니다:

    1. /etc/gitlab/gitlab.rb 파일에서 praefect['auto_migrate'] 설정 값을 false에서 true로 변경합니다.

    2. 업그레이드가 자동으로 실행되지 않도록 설정하려면 다음을 실행합니다:

    sudo touch /etc/gitlab/skip-auto-reconfigure
    
    1. 변경 사항이 적용되고 Prafect 데이터베이스 마이그레이션을 실행하려면 GitLab 재구성을 실행합니다.
  6. 다른 Praefect 노드에서 변경 사항이 적용되도록 GitLab 재구성을 실행합니다.

Gitaly 구성

클러스터를 구성하는 Gitaly 서버 노드는 데이터 및 부하에 따라 필수 요구 사항이 달라집니다.

경고: Gitaly 사양은 사용 패턴 및 저장소 크기의 높은 백분위수를 기본으로 합니다. 그러나 대형 모노 저장소(여러 기가바이트보다 큰)나 추가 작업량이 있는 경우 **환경의 성능에 중대한 영향을 미칠 수 있으며 이에 따라 추가적인 조정이 필요할 수 있습니다. 이 경우, 링크된 문서를 참조하고 더 많은 지침을 얻기 위해 권장되는 대로 고객 성공 관리자지원팀에 문의하시기를 강력히 권장합니다.

Gitaly의 중요한 입력 및 출력 요구 사항으로 인해 모든 Gitaly 노드가 SSD(고성능 저장장치)를 사용하는 것을 강력히 권장합니다. 이 SSD는 읽기 작업에 대해 초당 최소 8,000번의 입출력 작업(IOPS)을, 쓰기 작업에 대해 2,000번의 IOPS를 가져야 합니다. 환경을 클라우드 제공업체에서 실행 중이라면, IOPS를 올바르게 구성하는 방법에 대해서는 해당 제공업체의 문서를 참조하십시오.

Gitaly 서버는 기본적으로 네트워크 트래픽이 암호화되지 않기 때문에 공용 인터넷에 노출되어서는 안됩니다. 방화벽의 사용을 강력히 권장하며 다른 옵션으로는 TLS 사용이 있습니다.

Gitaly를 구성할 때 다음 사항을 고려해야 합니다:

  • gitaly['configuration'][:storage]는 특정 Gitaly 노드의 저장 경로를 반영하도록 구성되어야 합니다.
  • auth_tokenpraefect_internal_token과 동일해야 합니다.

다음은 예시로 사용되는 IP 주소입니다.

  • 10.6.0.91: Gitaly 1
  • 10.6.0.92: Gitaly 2
  • 10.6.0.93: Gitaly 3

각 노드에서:

  1. 선호하는 Linux 패키지를 다운로드하고 설치하십시오. 해당 페이지에서 설치 단계 1 및 2만 따르고, EXTERNAL_URL 값을 제공하지 말아야 합니다.
  2. Gitaly 서버 노드의 /etc/gitlab/gitlab.rb 파일을 편집하여 저장 경로를 구성하고, 네트워크 수신기를 활성화하고 토큰을 구성하십시오:

    # Gitaly 서버에서 불필요한 서비스 실행 방지
    postgresql['enable'] = false
    redis['enable'] = false
    nginx['enable'] = false
    puma['enable'] = false
    sidekiq['enable'] = false
    gitlab_workhorse['enable'] = false
    prometheus['enable'] = false
    alertmanager['enable'] = false
    gitlab_exporter['enable'] = false
    gitlab_kas['enable'] = false
    
    # 업그레이드 시 자동으로 데이터베이스 마이그레이션 방지
    gitlab_rails['auto_migrate'] = false
    
    # gitlab-shell API 콜백 URL 구성. 이것이 없으면 `git push`가 실패합니다. "front door" GitLab URL이거나 내부 로드 밸런서가 될 수 있습니다.
    gitlab_rails['internal_api_url'] = 'https://gitlab.example.com'
    
    # Gitaly
    gitaly['enable'] = true
    
    # Consul 에이전트 구성
    consul['enable'] = true
    ## Prometheus를 위한 서비스 검색 활성화
    consul['monitoring_service_discovery'] = true
    
    # 사용자 구성 시작
    # 필수 정보 섹션에서 설명하는 대로 실제 값을 설정하십시오
    #
    ## Consul 서버 노드의 IP
    ## FQDN을 사용하거나 IP와 혼용할 수 있습니다
    consul['configuration'] = {
       retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
    }
    
    # 모니터링을 위해 노드 익스포터가 청취하는 네트워크 주소 설정
    node_exporter['listen_address'] = '0.0.0.0:9100'
    
    gitaly['configuration'] = {
       # Gitaly가 모든 네트워크 인터페이스에서 연결을 받도록 설정. 이 주소/포트에 대한 액세스를 제한하려면 방화벽을 사용해야합니다.
       # TLS 연결만 지원하려면 아래의 주석 처리된 줄을 제거하십시오
       listen_addr: '0.0.0.0:8075',
       # Gitaly가 모니터링을 위해 청취하는 네트워크 주소 설정
       prometheus_listen_addr: '0.0.0.0:9236',
       auth: {
          # Gitaly 인증 토큰
          # praefect_internal_token과 동일해야합니다
          token: '<praefect_internal_token>',
       },
       pack_objects_cache: {
          # Gitaly Pack-objects 캐시
          # 성능 향상을 위해 활성화하는 것이 좋지만 디스크 I/O를 두드러지게 높일 수 있습니다
          # 자세한 정보는 https://docs.gitlab.com/ee/administration/gitaly/configure_gitaly.html#pack-objects-cache를 참조하십시오.
          enabled: true,
       },
    }
    
    #
    # 사용자 구성 끝
    
  3. 각 해당 서버의 /etc/gitlab/gitlab.rb에 다음 내용을 추가하십시오:
    • Gitaly 노드 1:

      gitaly['configuration'] = {
         # ...
         storage: [
            {
               name: 'gitaly-1',
               path: '/var/opt/gitlab/git-data',
            },
         ],
      }
      
    • Gitaly 노드 2:

      gitaly['configuration'] = {
         # ...
         storage: [
            {
               name: 'gitaly-2',
               path: '/var/opt/gitlab/git-data',
            },
         ],
      }
      
    • Gitaly 노드 3:

      gitaly['configuration'] = {
         # ...
         storage: [
            {
               name: 'gitaly-3',
               path: '/var/opt/gitlab/git-data',
            },
         ],
      }
      
  4. 첫 번째 Linux 패키지 노드에서 /etc/gitlab/gitlab-secrets.json 파일을 복사하고, 해당 서버에 동일한 이름의 파일을 추가하거나 교체하십시오. 이것이 구성 중인 첫 번째 Linux 패키지 노드인 경우에는 이 단계를 건너뛸 수 있습니다.

  5. 파일을 저장한 후 GitLab을 재구성하십시오.

Gitaly 클러스터 TLS 지원

Praefect는 TLS 암호화를 지원합니다. 안전한 연결을 수신 대기하는 Praefect 인스턴스와 통신하려면 다음을 수행해야 합니다.:

  • GitLab 구성에서 해당 저장소 항목의 gitaly_addresstls:// URL scheme을 사용합니다.
  • 자동으로 제공되지 않으므로 고유의 인증서를 가져와야 합니다. 각 Praefect 서버에 해당하는 인증서를 설치해야 합니다.

또한 인증서 또는 인증서 기관을 Gitaly 서버와 통신하는 모든 Praefect 클라이언트에 설치해야 합니다. 이에 대한 절차는 GitLab 사용자 정의 인증서 구성에서 설명된 대로 실행해야 합니다. (아래에 반복됨)

다음 사항을 주의하세요:

  • 인증서는 Praefect 서버에 액세스하는 주소를 명시해야 합니다. 호스트명 또는 IP 주소를 인증서에 대체 주제 이름으로 추가해야 합니다.
  • Praefect 서버를 암호화되지 않은 수신 대기 주소 (listen_addr)와 암호화된 수신 대기 주소(tls_listen_addr)로 구성할 수 있습니다. 이를 통해 필요한 경우 암호화되지 않은 트래픽에서 암호화된 트래픽으로의 점진적 전환을 수행할 수 있습니다. 암호화되지 않은 리스너를 비활성화하려면 praefect['configuration'][:listen_addr] = nil로 설정합니다.
  • 내부 로드 밸런서도 인증서에 액세스해야 하며 TLS 패스스루를 허용하도록 구성되어야 합니다. 이에 대한 구성 방법은 로드 밸런서 문서를 참조하세요.

TLS로 Praefect를 구성하려면 다음을 수행하세요:

  1. Praefect 서버에 대한 인증서를 생성합니다.

  2. Praefect 서버에서 /etc/gitlab/ssl 디렉터리를 만들고 키와 인증서를 복사합니다.:

    sudo mkdir -p /etc/gitlab/ssl
    sudo chmod 755 /etc/gitlab/ssl
    sudo cp key.pem cert.pem /etc/gitlab/ssl/
    sudo chmod 644 key.pem cert.pem
    
  3. /etc/gitlab/gitlab.rb를 편집하고 다음을 추가합니다.:

    praefect['configuration'] = {
       # ...
       tls_listen_addr: '0.0.0.0:3305',
       tls: {
          # ...
          certificate_path: '/etc/gitlab/ssl/cert.pem',
          key_path: '/etc/gitlab/ssl/key.pem',
       },
    }
    
  4. 파일을 저장하고 다시 구성합니다.

  5. Praefect 클라이언트(각 Gitaly 서버 포함)에서 인증서 또는 해당 인증서 기관을 /etc/gitlab/trusted-certs에 복사합니다.:

    sudo cp cert.pem /etc/gitlab/trusted-certs/
    
  6. Praefect 클라이언트(단, Gitaly 서버 제외)에서 /etc/gitlab/gitlab.rbgit_data_dirs를 다음과 같이 편집합니다.:

    git_data_dirs({
      "default" => {
        "gitaly_address" => 'tls://LOAD_BALANCER_SERVER_ADDRESS:3305',
        "gitaly_token" => 'PRAEFECT_EXTERNAL_TOKEN'
      }
    })
    
  7. 파일을 저장하고 GitLab을 다시 구성합니다.

Sidekiq 구성

Sidekiq는 Redis, PostgreSQLGitaly 인스턴스에 연결이 필요합니다. 또한 권장된 대로 Object Storage에 연결해야 합니다.

참고: 데이터 객체에 대해 NFS 대신 개체 저장소를 사용하는 것이 권장되므로 다음 예제에는 객체 저장소 구성이 포함됩니다.

참고: 환경의 Sidekiq 작업 처리가 대기열이 길어 느릴 경우 필요에 따라 노드를 추가할 수 있습니다. 또한 여러 Sidekiq 프로세스를 실행하도록 Sidekiq 노드를 조정할 수 있습니다.

참고: Container Registry, SAML 또는 LDAP와 같은 추가 GitLab 기능을 구성하는 경우 Rails 구성 외에도 Sidekiq 구성을 업데이트해야 합니다. 자세한 내용은 외부 Sidekiq 문서를 참조하세요.

  • 10.6.0.71: Sidekiq 1
  • 10.6.0.72: Sidekiq 2

Sidekiq 노드를 구성하려면 다음을 각 노드에서 수행하세요:

  1. Sidekiq 서버에 SSH로 로그인합니다.
  2. PostgreSQL, Gitaly 및 Redis 포트에 액세스할 수 있는지 확인합니다.:

    telnet <GitLab 호스트> 5432 # PostgreSQL
    telnet <GitLab 호스트> 8075 # Gitaly
    telnet <GitLab 호스트> 6379 # Redis
    
  3. 선택한 Linux 패키지의 다운로드 및 설치페이지를 따릅니다. 페이지에 나와 있는 설치 단계 1과 2만 따르도록 주의하세요.
  4. /etc/gitlab/gitlab.rb을 생성하거나 수정하고 다음 구성을 사용하세요.:

    # https://docs.gitlab.com/omnibus/roles/#sidekiq-roles
    roles(["sidekiq_role"])
    
    # 외부 URL
    ## 외부 로드 밸런서의 URL과 일치해야 합니다.
    external_url 'https://gitlab.example.com'
    
    # Redis
    ## 모든 센티넬 노드에서 동일해야 합니다.
    redis['master_name'] = 'gitlab-redis'
    
    ## 기본 마스터 노드에 대해 설정한 Redis 인증을 사용하세요.
    redis['master_password'] = '<redis_primary_password>'
    
    ## `host` 및 `port`를 사용하는 센티넬 리스트
    gitlab_rails['redis_sentinels'] = [
       {'host' => '10.6.0.11', 'port' => 26379},
       {'host' => '10.6.0.12', 'port' => 26379},
       {'host' => '10.6.0.13', 'port' => 26379},
    ]
    
    # Gitaly 클러스터
    ## git_data_dirs를 Praefect 가상 저장소에 구성합니다.
    ## Praefect의 내부 로드 밸런서 주소입니다.
    ## 토큰은 praefect_external_token
    git_data_dirs({
      "default" => {
        "gitaly_address" => "tcp://10.6.0.40:2305", # 내부 로드 밸런서 IP
        "gitaly_token" => '<praefect_external_token>'
      }
    })
    
    # PostgreSQL
    gitlab_rails['db_host'] = '10.6.0.40' # 내부 로드 밸런서 IP
    gitlab_rails['db_port'] = 6432
    gitlab_rails['db_password'] = '<postgresql_user_password>'
    gitlab_rails['db_load_balancing'] = { 'hosts' => ['10.6.0.21', '10.6.0.22', '10.6.0.23'] } # PostgreSQL IP
    
    ## 업그레이드 시 자동으로 데이터베이스 마이그레이션을 방지합니다.
    gitlab_rails['auto_migrate'] = false
    
    # Sidekiq
    sidekiq['listen_address'] = "0.0.0.0"
    
    ## 사용 가능한 CPU 수와 동일한 수의 Sidekiq 큐 프로세스 수를 설정합니다.
    sidekiq['queue_groups'] = ['*'] * 4
    
    # 모니터링
    consul['enable'] = true
    consul['monitoring_service_discovery'] =  true
    
    consul['configuration'] = {
       retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13)
    }
    
    ## 감시자가 청취할 네트워크 주소를 설정합니다.
    node_exporter['listen_address'] = '0.0.0.0:9100'
    
    ## 모니터링 노드의 IP 주소를 모니터링 화이트리스트에 추가합니다.
    gitlab_rails['monitoring_whitelist'] = ['10.6.0.81/32', '127.0.0.0/8']
    gitlab_rails['prometheus_address'] = '10.6.0.81:9090'
    
    # 객체 저장소
    ## 이것은 GCP에서 객체 저장소를 구성하는 예시입니다.
    ## 필요한 경우 선택한 객체 저장소 제공자로 이 구성을 바꿉니다.
    gitlab_rails['object_store']['enabled'] = true
    gitlab_rails['object_store']['connection'] = {
      'provider' => 'Google',
      'google_project' => '<gcp-project-name>',
      'google_json_key_location' => '<path-to-gcp-service-account-key>'
    }
    gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
    gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
    gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
    gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
    gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
    gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
    gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
    
    gitlab_rails['backup_upload_connection'] = {
      'provider' => 'Google',
      'google_project' => '<gcp-project-name>',
      'google_json_key_location' => '<path-to-gcp-service-account-key>'
    }
    gitlab_rails['backup_upload_remote_directory'] = "<gcp-backups-state-bucket-name>"
    
    gitlab_rails['ci_secure_files_object_store_enabled'] = true
    gitlab_rails['ci_secure_files_object_store_remote_directory'] = "gcp-ci_secure_files-bucket-name"
    
    gitlab_rails['ci_secure_files_object_store_connection'] = {
       'provider' => 'Google',
       'google_project' => '<gcp-project-name>',
       'google_json_key_location' => '<path-to-gcp-service-account-key>'
    }
    
  5. 명령줄에서 첫 번째 Linux 패키지 노드의 /etc/gitlab/gitlab-secrets.json 파일을 이 서버에서 같은 이름의 파일로 복사하고 추가하거나 교체하세요. 만약 이 서버가 구성한 첫 번째 Linux 패키지 노드이면 이 단계를 건너뛰시기 바랍니다.

  6. 데이터베이스 마이그레이션이 업그레이드 시 자동으로 실행되지 않고 reconfigure 중에만 실행되도록 하려면 다음 명령을 실행하세요.:

    sudo touch /etc/gitlab/skip-auto-reconfigure
    

    자세한 내용은 GitLab Rails 후 구성 섹션을 참조하세요.

  7. 변경 사항이 적용되려면 GitLab을 다시 구성하세요.

  8. GitLab 서비스가 실행 중인지 확인합니다.:

    sudo gitlab-ctl status
    

    출력은 다음과 유사해야 합니다.:

    run: consul: (pid 30114) 77353s; run: log: (pid 29756) 77367s
    run: logrotate: (pid 9898) 3561s; run: log: (pid 29653) 77380s
    run: node-exporter: (pid 30134) 77353s; run: log: (pid 29706) 77372s
    run: sidekiq: (pid 30142) 77351s; run: log: (pid 29638) 77386s
    

GitLab Rails 구성

이 섹션에서는 GitLab 응용 프로그램 (Rails) 구성 요소를 구성하는 방법에 대해 설명합니다.

Rails는 Redis, PostgreSQL, 그리고 Gitaly 인스턴스에 연결이 필요합니다. 또한 권장되는 대로 Object Storage에 연결이 필요합니다.

참고: 데이터 객체에 대한 NFS 대신 Object Storage를 사용하는 것이 권장되므로, 다음 예제는 Object Storage 구성을 포함합니다.

각 노드에서 다음을 수행하세요:

  1. 선택한 Linux 패키지를 다운로드하고 설치합니다. 페이지에서 설치 단계 1 및 2 만 따르도록 하십시오.
  2. /etc/gitlab/gitlab.rb를 만들거나 편집하고 다음 구성을 사용합니다. 노드 간에 링크의 일관성을 유지하기 위해 응용 프로그램 서버의 external_url은 사용자가 GitLab에 액세스하는 데 사용하는 외부 URL을 가리켜야 합니다. 이것은 GitLab 응용 프로그램 서버로 트래픽을 라우팅하는 외부 로드 밸런서의 URL일 수 있습니다.

    external_url 'https://gitlab.example.com'
    
    # git_data_dirs는 Praefect 가상 스토리지에 구성됩니다.
    # 주소는 Praefect를 위한 내부 로드 밸런서입니다.
    # 토큰은 praefect_external_token입니다.
    git_data_dirs({
      "default" => {
        "gitaly_address" => "tcp://10.6.0.40:2305", # 내부 로드 밸런서 IP
        "gitaly_token" => '<praefect_external_token>'
      }
    })
    
    ## GitLab 응용 프로그램 서버에 없을 구성 요소 비활성화
    roles(['application_role'])
    gitaly['enable'] = false
    sidekiq['enable'] = false
    
    ## PostgreSQL 연결 세부 정보
    # 응용 프로그램 노드에서 PostgreSQL 비활성화
    postgresql['enable'] = false
    gitlab_rails['db_host'] = '10.6.0.20' # 내부 로드 밸런서 IP
    gitlab_rails['db_port'] = 6432
    gitlab_rails['db_password'] = '<postgresql_user_password>'
    gitlab_rails['db_load_balancing'] = { 'hosts' => ['10.6.0.21', '10.6.0.22', '10.6.0.23'] } # PostgreSQL IPs
    
    # 업그레이드 시 자동으로 데이터베이스 마이그레이션을 실행하지 않도록 함
    gitlab_rails['auto_migrate'] = false
    ... (이하 생략)
    
  3. 만약 Gitaly가 TLS 지원되는 경우, git_data_dirs 항목이 tcp 대신 tls로 구성되었는지 확인하세요:

    git_data_dirs({
      "default" => {
        "gitaly_address" => "tls://10.6.0.40:2305", # 내부 로드 밸런서 IP
        "gitaly_token" => '<praefect_external_token>'
      }
    })
    
    1. /etc/gitlab/trusted-certs로 인증서를 복사합니다.

      sudo cp cert.pem /etc/gitlab/trusted-certs/
      
  4. 첫 번째 Linux 패키지 노드에서 /etc/gitlab/gitlab-secrets.json 파일을 복사하여 이 서버의 동일한 이름 파일을 추가하거나 교체합니다. 이것이 구성하는 첫 번째 Linux 패키지 노드이면 이 단계는 건너뛸 수 있습니다.
  5. 첫 번째 Linux 패키지 노드에서 SSH 호스트 키(/etc/ssh/ssh_host_*_key* 형식의 모든 이름)를 복사하여 이 서버의 동일한 이름 파일을 추가하거나 교체합니다. 이렇게 함으로써 로드 밸런스된 Rails 노드에서 사용자가 호스트 일치 오류를 겪지 않도록 합니다. 이것이 구성하는 첫 번째 Linux 패키지 노드이면 이 단계는 건너뛸 수 있습니다.
  6. Reconfigure에서 변경 사항을 적용하려면 GitLab을 재구성합니다.
  7. 점진적 로그 기능을 활성화합니다.
  8. sudo gitlab-rake gitlab:gitaly:check를 실행하여 노드가 Gitaly에 연결할 수 있는지 확인합니다.
  9. 요청을 보기 위해 로그를 추적합니다.

    sudo gitlab-ctl tail gitaly
    
  10. GitLab 서비스가 실행 중인지 확인합니다.

    sudo gitlab-ctl status
    

    출력은 다음과 유사해야 합니다.

    run: consul: (pid 4890) 8647s; run: log: (pid 29962) 79128s
    run: gitlab-exporter: (pid 4902) 8647s; run: log: (pid 29913) 79134s
    run: gitlab-workhorse: (pid 4904) 8646s; run: log: (pid 29713) 79155s
    run: logrotate: (pid 12425) 1446s; run: log: (pid 29798) 79146s
    run: nginx: (pid 4925) 8646s; run: log: (pid 29726) 79152s
    run: node-exporter: (pid 4931) 8645s; run: log: (pid 29855) 79140s
    run: puma: (pid 4936) 8645s; run: log: (pid 29656) 79161s
    

이전 예제에서와 같이 external_urlhttps를 지정하면 GitLab은 SSL 인증서가 /etc/gitlab/ssl/에 있는 것으로 예상합니다. 인증서가 없으면 NGINX가 시작하지 못합니다. 자세한 정보는 HTTPS 문서를 참조하세요.

GitLab Rails 포스트 구성

  1. 모든 마이그레이션이 실행되었는지 확인하십시오:

    gitlab-rake gitlab:db:configure
    

    이 작업에는 레일스 노드를 직접 주요 데이터베이스에 연결하도록 구성해야 합니다. 이후에 마이그레이션이 완료되면 노드를 다시 PgBouncer를 통하도록 구성해야 합니다.

  2. 데이터베이스에서 인가된 SSH 키를 빠르게 찾도록 구성.

프로메테우스 구성

Linux 패키지는 프로메테우스를 실행하는 독립형 모니터링 노드를 구성하는 데 사용할 수 있습니다:

  1. 모니터링 노드에 SSH로 로그인합니다.
  2. 원하는 Linux 패키지를 다운로드 및 설치하십시오. 페이지의 설치 단계 1과 2만 따르도록 주의하십시오.
  3. /etc/gitlab/gitlab.rb 파일을 편집하고 다음 내용을 추가하십시오:

    roles(['monitoring_role', 'consul_role'])
    
    external_url 'http://gitlab.example.com'
    
    # 프로메테우스
    prometheus['listen_address'] = '0.0.0.0:9090'
    prometheus['monitor_kubernetes'] = false
    
    # 프로메테우스를 위한 서비스 검색 활성화
    consul['monitoring_service_discovery'] =  true
    consul['configuration'] = {
       retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13)
    }
    
    # 발견되지 않는 서비스를 위해 프로메테우스를 구성
    prometheus['scrape_configs'] = [
       {
          'job_name': 'pgbouncer',
          'static_configs' => [
             'targets' => [
             "10.6.0.31:9188",
             "10.6.0.32:9188",
             "10.6.0.33:9188",
             ],
          ],
       },
       {
          'job_name': 'praefect',
          'static_configs' => [
             'targets' => [
             "10.6.0.131:9652",
             "10.6.0.132:9652",
             "10.6.0.133:9652",
             ],
          ],
       },
    ]
    
    nginx['enable'] = false
    
  4. 파일을 저장하고 GitLab을 다시 구성하십시오.
  5. GitLab 서비스가 실행되고 있는지 확인하십시오:

    sudo gitlab-ctl status
    

    출력은 다음과 유사해야 합니다:

    run: consul: (pid 31637) 17337s; run: log: (pid 29748) 78432s
    run: logrotate: (pid 31809) 2936s; run: log: (pid 29581) 78462s
    run: nginx: (pid 31665) 17335s; run: log: (pid 29556) 78468s
    run: prometheus: (pid 31672) 17335s; run: log: (pid 29633) 78456s
    

객체 스토리지 구성

GitLab은 다양한 유형의 데이터를 저장하기 위해 객체 스토리지 서비스를 사용하는 것을 지원합니다. 보통 객체 스토리지는 대규모 설정에서 NFS보다 성능, 신뢰성 및 확장성 면에서 우수한 선택이기 때문에 객체 스토리지는 데이터 개체 및 일반적으로 더 효율적입니다. 자세한 정보는 권장 클라우드 공급업체 및 서비스를 참조하십시오.

GitLab에서 객체 스토리지 구성을 지정하는 두 가지 방법이 있습니다:

통합 형식은 모든 유형의 데이터에 대한 별도 버킷을 사용하는 것이 가장 권장되는 접근 방식입니다. 이를 통해 GitLab이 저장하는 다양한 유형의 데이터 간 충돌이 없도록 보장합니다. 미래에 단일 버킷 사용을 활성화하는 계획이 있습니다.

점진적 로깅 활성화

기본 설정으로 GitLab Runner는 작업 로그를 청크로 반환하며, 통합 객체 스토리지를 사용할 때에도 Linux 패키지는 기본적으로 이 디렉터리를 /var/opt/gitlab/gitlab-ci/builds에 임시로 캐시합니다. 기본 설정에 따라 이 디렉터리는 GitLab Rails 및 Sidekiq 노드에서 NFS를 통해 공유되어야 합니다.

작업 로그를 NFS를 통해 공유하는 것은 지원되지만, NFS 노드가 배포되지 않았을 때 점진적 로깅을 활성화(필요한 경우)하여 NFS를 사용할 필요 없이 하는 것이 좋습니다. 점진적 로깅은 작업 로그의 임시 캐싱에 디스크 공간 대신 Redis를 사용합니다.

고급 검색 구성

Elasticsearch를 활용하여 고급 검색을 활성화하여 GitLab 인스턴스 전체에서 더 빠르고 더 고급의 코드 검색을 수행할 수 있습니다.

Elasticsearch 클러스터 디자인 및 요구 사항은 특정 데이터에 따라 다릅니다. 인스턴스와 함께 Elasticsearch 클러스터를 설정하는 권장 사항에 대한 자세한 내용은 최적의 클러스터 구성 선택하기를 읽어보십시오.

Helm 차트를 사용한 클라우드 네이티브 하이브리드 참조 아키텍처(대안)

GitLab Helm 차트를 사용하여 쿠버네티스에서 클라우드 네이티브 GitLab의 선택된 구성 요소를 실행할 수 있습니다. 이 설정에서는 쿠버네티스 클러스터인 Webservice에서 GitLab Rails와 동등한 기능을 실행할 수 있습니다. 또한 Sidekiq 노드를 Sidekiq이라는 쿠버네티스 클러스터에서 실행할 수 있습니다. 추가로, 다음과 같은 지원 서비스도 지원됩니다: NGINX, Toolbox, Migrations, Prometheus.

하이브리드 설치는 클라우드 네이티브 및 전통적인 컴퓨팅 배포의 이점을 활용합니다. 여기서 무상 구성 요소는 클라우드 네이티브 워크로드 관리 이점을 얻을 수 있지만, 상태를 유지하는(상태적인) 구성 요소는 리눅스 패키지 설치를 사용하여 컴퓨팅 가상 머신에 배포되어 지속성이 향상됩니다.

설치 지침 및 쿠버네티스와 백엔드 구성 요소 간에 동기화할 GitLab 비밀 정보에 대한 안내를 포함한 Helm 차트 고급 구성 문서를 참조하세요.

참고: 이는 고급 설정입니다. 쿠버네티스에서 서비스를 실행하는 것은 복잡하다는 것이 잘 알려져 있습니다. 이 설정은 오직 쿠버네티스에 대한 강력한 지식과 경험이 있는 경우에만 권장됩니다. 이 섹션의 나머지 부분은 이를 가정하고 작성되었습니다.

경고: Gitaly Cluster를 쿠버네티스에서 실행하는 것은 지원되지 않습니다. 자세한 내용은 epic 6127를 참조하세요.

클러스터 위상 구성

다음 표와 다이어그램은 일반적인 환경과 동일한 형식을 사용하여 하이브리드 환경을 설명합니다.

먼저 쿠버네티스에서 실행되는 구성 요소입니다. 이들은 여러 노드 그룹에 걸쳐 실행되지만, 전체 구성을 원하는 대로 변경할 수 있지만 최소 CPU 및 메모리 요구 사항을 준수해야 합니다.

구성 요소 노드 그룹 대상 노드 풀 총계 GCP 예시 AWS 예시
Webservice 36 vCPU
45 GB 메모리 (요청)
63 GB 메모리 (제한)
3 x n1-standard-16 3 x c5.4xlarge
Sidekiq 7.2 vCPU
16 GB 메모리 (요청)
32 GB 메모리 (제한)
3 x n1-standard-4 3 x m5.xlarge
지원 서비스 4 vCPU
15 GB 메모리
2 x n1-standard-2 2 x m5.large
  • 이 설정에 대해, 권장되며 정기적으로 테스트를 진행합니다. Google Kubernetes Engine (GKE)Amazon Elastic Kubernetes Service (EKS)를 권장하며, 다른 쿠버네티스 서비스도 가능하지만 결과는 달라질 수 있습니다.
  • GCP 및 AWS 예시에서 대상 노드 풀 총계에 도달하는 방법은 참고용으로 제공됩니다. 이러한 크기는 성능 테스트에 사용되지만, 예시를 따르는 것은 필수가 아닙니다. 원하는 대로 다양한 노드 풀 디자인을 사용할 수 있지만, 목표가 충족되고 모든 파드가 배포될 수 있는 한입니다.
  • WebserviceSidekiq 대상 노드 풀 총계는 GitLab 구성 요소에 대해서만 제공됩니다. 선택된 쿠버네티스 제공업체의 시스템 프로세스에 필요한 추가 자원이 필요합니다. 제공된 예시는 이를 고려에 넣었습니다.
  • Supporting 대상 노드 풀 총계는 GitLab 배포를 지원하며 요구 사항에 따라 추가 배포를 원하는 경우에 대비해 여러 자원을 포함합니다. 다른 노드 풀과 마찬가지로, 선택된 쿠버네티스 제공업체의 시스템 프로세스도 자원이 요구됩니다. 제공된 예시는 이를 고려에 넣었습니다.
  • 프로덕션 배포에서는 특정 노드에 파드를 할당하는 것은 필수적이지 않지만, 견고한 클라우드 아키텍처 관행에 따라 다양한 가용 영역에 걸쳐 여러 노드를 보유하는 것이 권장됩니다.
  • 클러스터 오토스케일링(Cluster Autoscaler 등)을 활성화하여 효율성을 높이는 것이 권장됩니다. 그러나 보통 Webservice와 Sidekiq 파드의 최소 대상을 75%로 설정하여 지속적인 성능을 보장하는 것이 권장됩니다.

다음은 리눅스 패키지(또는 해당하는 경우 외부 PaaS 서비스)를 사용하여 정적 컴퓨팅 VM에서 실행되는 백엔드 구성 요소입니다:

서비스 노드 구성 GCP AWS
Consul1 3 2 vCPU, 1.8 GB 메모리 n1-highcpu-2 c5.large
PostgreSQL1 3 4 vCPU, 15 GB 메모리 n1-standard-4 m5.xlarge
PgBouncer1 3 2 vCPU, 1.8 GB 메모리 n1-highcpu-2 c5.large
내부 로드 밸런서3 1 4 vCPU, 3.6 GB 메모리 n1-highcpu-4 c5n.xlarge
Redis/Sentinel2 3 2 vCPU, 7.5 GB 메모리 n1-standard-2 m5.large
Gitaly5 3 8 vCPU, 30 GB 메모리6 n1-standard-8 m5.2xlarge
Praefect5 3 2 vCPU, 1.8 GB 메모리 n1-highcpu-2 c5.large
Praefect PostgreSQL1 1+ 2 vCPU, 1.8 GB 메모리 n1-highcpu-2 c5.large
객체 저장소4 - - - -

각주:

  1. 신뢰할 수 있는 타사 외부 PaaS PostgreSQL 솔루션에서 선택적으로 실행할 수 있습니다. 자세한 정보는 제공되는 PostgreSQL 인스턴스를 참조하세요.
  2. 신뢰할 수 있는 타사 외부 PaaS Redis 솔루션에서 선택적으로 실행할 수 있습니다. 자세한 정보는 제공되는 Redis 인스턴스를 참조하세요.
  3. 신뢰할 수 있는 타사 로드 밸런서 또는 서비스(LB PaaS)에서 실행하는 것이 권장됩니다. 또한, 크기는 선택한 로드 밸런서 및 네트워크 대역폭 등의 추가 요인에 따라 달라집니다. 자세한 정보는 로드 밸런서를 참조하세요.
  4. 신뢰할 수 있는 클라우드 제공자 또는 자체 관리 솔루션에서 실행하는 것이 권장됩니다. 자세한 정보는 객체 저장소 구성를 참조하세요.
  5. Gitaly Cluster는 장애 허용의 이점을 제공하지만, 설정 및 관리의 추가 복잡성을 수반합니다. Gitaly Cluster를 배포하기 전에 기술적 제한 및 고려 사항을 검토하세요. 샤딩된 Gitaly를 원하는 경우, Gitaly에 대해 위에서 나열된 동일 사양을 사용하세요.
  6. Gitaly 사양은 사용 패턴 및 저장소 크기의 높은 백분위에 기반하여 설정되었습니다. 그러나 만약 대규모 모노 레포(수 기가바이트 이상)나 추가 워크로드가 있는 경우, 이것은 Git 및 Gitaly 성능에 의미있는 영향을 미칠 수 있고, 추가 조정이 필요할 것입니다.

참고: 인스턴스를 구성하는 PaaS 솔루션의 경우, 견고한 클라우드 아키텍처 관행에 따라 세 가용 영역에서 최소 3개 노드를 구현하는 것이 권장됩니다.

Kubernetes 컴포넌트 대상

다음 섹션은 Kubernetes에 배포된 GitLab 컴포넌트에 사용되는 대상을 상세히 설명합니다.

Webservice

각 Webservice 파드(Puma 및 Workhorse)는 다음 구성으로 실행하는 것이 좋습니다:

  • 4개의 Puma Workers
  • 4 vCPU
  • 5 GB 메모리 (요청)
  • 7 GB 메모리 (제한)

100 RPS 또는 5,000 사용자의 경우, 총 Puma worker 수를 약 36으로 권장하므로 최소한 9개의 Webservice 파드를 실행하는 것이 좋습니다.

Webservice 리소스 사용에 대한 자세한 정보는 Webservice 리소스를 참조하세요.

NGINX

Webservice 노드 전체에 NGINX 컨트롤러 파드를 DaemonSet으로 배포하는 것이 좋습니다. 이렇게 하면 컨트롤러가 제공하는 Webservice 파드와 함께 동적으로 확장되고 일반적으로 대형 머신 유형에서 제공되는 더 높은 네트워크 대역폭을 활용할 수 있습니다.

이것은 엄격한 요구 사항은 아닙니다. NGINX 컨트롤러 파드는 웹 트래픽을 처리할 충분한 리소스가 있는 한 원하는 대로 배포할 수 있습니다.

Sidekiq

각 Sidekiq 파드는 다음 구성으로 실행하는 것이 좋습니다:

  • 1개의 Sidekiq Worker
  • 900m vCPU
  • 2 GB 메모리 (요청)
  • 4 GB 메모리 (제한)

표준 배포와 마찬가지로, 여기에서는 초기 목표로 8개의 Sidekiq workers가 사용되었습니다. 특정 워크플로우에 따라 추가적인 workers가 필요할 수 있습니다.

Sidekiq 리소스 사용에 대한 자세한 정보는 Sidekiq 리소스를 참조하세요.

Support

Supporting 노드 풀은 Webservice 및 Sidekiq 풀에 필요하지 않은 모든 지원 배포를 수용하기 위해 설계되었습니다.

이에는 클라우드 제공 업체의 구현 및 GitLab Shell과 같은 GitLab 배포와 관련된 다양한 배포물이 포함됩니다.

컨테이너 레지스트리, 페이지 또는 모니터링과 같은 추가적인 배포를 원하는 경우 가능한 경우 이러한 배포물을 이 풀에 배포하는 것이 좋습니다. 그렇지 않으면, Support 풀은 여러 추가적인 배포물을 수용하도록 구체적으로 설계되었기 때문에 웹 서비스나 Sidekiq 풀에 배포하지 않도록 권장됩니다. 그러나 사용 사례에 해당하는 풀에 배포물이 필요하지 않은 경우, 노드 풀을 적절하게 증가시킬 수 있습니다. 반대로, 사용 사례에서 풀이 과다하게 제공된 경우, 그에 따라 줄일 수 있습니다.

구성 파일 예시

위의 100 RPS 또는 5,000 참조 아키텍처 구성에 대한 GitLab Helm 차트 예시는 Charts 프로젝트에서 찾을 수 있습니다.

차례로 거칠 단계

이 안내를 따르면 이제 핵심 기능이 구성된 새로운 GitLab 환경을 갖게 될 것입니다.

요구 사항에 따라 GitLab의 추가적인 선택 기능을 구성할 수 있습니다. 자세한 정보는 GitLab 설치 후 단계를 참조하세요.

참고: 환경 및 요구 사항에 따라 원하는 추가 기능을 설정하려면 추가 하드웨어 요구 사항이나 조정이 필요할 수 있습니다. 자세한 내용은 각각의 페이지를 참조하세요.