참조 아키텍처: 최대 10,000명의 사용자

Tier: Premium, Ultimate Offering: Self-Managed

이 페이지에서는 최대 10,000명의 사용자를 위해 설계된 GitLab 참조 아키텍처에 대해 설명합니다. 높은 여유 공간을 갖추고 있습니다.

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

참고: 이 아키텍처를 배포하기 전에 먼저 본 문서 및 특히 시작하기 전에사용할 아키텍처 결정 섹션을 읽는 것이 좋습니다.

서비스 노드 구성 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 8 vCPU, 30 GB 메모리 n1-standard-8 m5.2xlarge D8s 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/Sentinel - 캐시2 3 4 vCPU, 15 GB 메모리 n1-standard-4 m5.xlarge D4s v3
Redis/Sentinel - 지속2 3 4 vCPU, 15 GB 메모리 n1-standard-4 m5.xlarge D4s v3
Gitaly5 3 16 vCPU, 60 GB 메모리6 n1-standard-16 m5.4xlarge D16s 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 4 4 vCPU, 15 GB 메모리 n1-standard-4 m5.xlarge D4s v3
GitLab Rails7 3 32 vCPU, 28.8 GB 메모리 n1-highcpu-32 c5.9xlarge F32s v2
모니터링 노드 1 4 vCPU, 3.6 GB 메모리 n1-highcpu-4 c5.xlarge F4s v2
객체 저장소 4 - - - - -

각주:

  1. 존경받는 제3자 외부 PaaS PostgreSQL 솔루션에서 선택적으로 실행할 수 있습니다. 자세한 내용은 자체 PostgreSQL 인스턴스 제공권장 클라우드 공급자 및 서비스를 참조하십시오.
  2. 존경받는 제3자 외부 PaaS Redis 솔루션에서 선택적으로 실행할 수 있습니다. 자세한 내용은 자체 Redis 인스턴스 제공권장 클라우드 공급자 및 서비스를 참조하십시오.
    • Redis는 주로 단일 스레드로 작동하며 CPU 코어 증가로 인한 혜택이 크지 않습니다. 이러한 규모의 아키텍처의 경우 최적의 성능을 달성하기 위해 별도의 캐시 및 지속 인스턴스를 따로 구성하는 것이 강력히 권장됩니다.
  3. 존경받는 제3자 로드 밸런서 또는 HA 기능을 제공할 수 있는 서비스 (LB PaaS)와 함께 실행하는 것이 좋습니다. 또한 사이징은 선택한 로드 밸런서 및 네트워크 대역폭과 같은 추가 요소에 따라 달라집니다. 자세한 내용은 로드 밸런서를 참조하십시오.
  4. 신뢰할 수 있는 클라우드 공급자 또는 자체 관리 솔루션에서 실행해야 합니다. 자세한 내용은 객체 저장소 구성를 참조하십시오.
  5. Gitaly 클러스터는 고장 허용성의 장점을 제공하지만 설정 및 관리에 추가 복잡성이 동반됩니다. Gitaly 클러스터를 배포하기 전에 기존 기술적 한계와 고려 사항을 검토하십시오. 샤딩된 Gitaly를 원하는 경우 Gitaly에 동일한 사양을 사용하십시오.
  6. Gitaly 사양은 사용량 패턴 및 리포지토리 크기의 높은 백분위에 기반합니다. 그러나 대규모 모노 리포지토리 (여러 기가바이트보다 큰) 또는 추가 워크로드가 있는 경우 Git 및 Gitaly 성능에 상당한 영향을 미칠 수 있으며 추가 조정이 필요할 수 있습니다.
  7. ASG(Auto Scaling Groups)에 배치할 수 있으며 해당 구성요소는 상태 데이터를 저장하지 않습니다. 그러나 GitLab Rails의 경우 마이그레이션Mailroom과 같은 특정 프로세스는 단일 노드에서만 실행해야 합니다.

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

요구 사항

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

테스트 방법론

10k 아키텍처는 대다수의 워크플로를 커버하도록 설계되었고 정기적으로 흡연 및 성능 테스트가 Quality Engineering 팀에 의해 스모크 및 성능 테스트 대상 엔드포인트 처리량에 대해 수행됩니다.

  • API: 200 RPS
  • 웹: 20 RPS
  • Git (Pull): 20 RPS
  • Git (Push): 4 RPS

위의 대상은 CI 및 추가적인 상당한 여력이 추가된 사용자 수에 해당하는 총 환경 부하에 따라 실제 사용자 데이터를 기반으로 선택되었습니다.

위 엔드포인트 대상에 대해 정기적으로 더 높은 처리량을 보유하고 있다는 지표가 있다면, 대형 단일 저장소 또는 주목할만한 추가 워크로드가 성능 환경에 주목할 만한 영향을 미칠 수 있으며, 추가적인 조정이 필요할 수 있습니다. 이에 해당하는 경우, 링크된 문서를 참조하는 것과 더불어 추가 지침을 위해 고객 성공 매니저 또는 지원팀에 문의하는 것을 강력히 권장합니다.

테스트는 정기적으로 GitLab 성능 도구 (GPT) 및 해당 데이터셋을 활용하여 수행되며 누구나 사용할 수 있습니다. 이 테스트의 결과는 공개적으로 GPT 위키에서 확인 가능합니다. 테스트 전략에 대한 자세한 내용은 문서의 이 섹션을 참조하세요.

테스트에 사용된 로드 밸런서는 Linux 패키지 환경의 경우 HAProxy를, 또는 Cloud Native Hybrids의 경우 동등한 Cloud 제공자 서비스를 NGINX Ingress로 사용했습니다. 이러한 선택은 특정 요구 사항 또는 권고 사항을 대표하지 않음을 유의하십시오. 대부분의 평판 좋은 로드 밸런서가 작동할 것으로 예상됩니다.

구성 구성 요소

GitLab 및 해당 구성 요소를 최대 10,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(HTTP/SSH)를 제공합니다.
  10. Prometheus 구성
    • GitLab 환경을 모니터링합니다.
  11. 객체 저장소 구성
    • 공유 데이터 객체에 사용됩니다.
  12. 고급 검색 구성 (선택 사항)
    • 전체 GitLab 인스턴스에서 더 빠르고 고급 코드 검색을 위해 사용됩니다.

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

다음 목록은 각 서버와 해당 할당된 IP에 대한 설명을 포함합니다:

  • 10.6.0.10: 외부 로드 밸런서
  • 10.6.0.11: Consul 1
  • 10.6.0.12: Consul 2
  • 10.6.0.13: Consul 3
  • 10.6.0.21: PostgreSQL 기본
  • 10.6.0.22: PostgreSQL 2차 1
  • 10.6.0.23: PostgreSQL 2차 2
  • 10.6.0.31: PgBouncer 1
  • 10.6.0.32: PgBouncer 2
  • 10.6.0.33: PgBouncer 3
  • 10.6.0.40: 내부 로드 밸런서
  • 10.6.0.51: Redis - 캐시 기본
  • 10.6.0.52: Redis - 캐시 복제 1
  • 10.6.0.53: Redis - 캐시 복제 2
  • 10.6.0.61: Redis - 지속적인 기본
  • 10.6.0.62: Redis - 지속적인 복제 1
  • 10.6.0.63: Redis - 지속적인 복제 2
  • 10.6.0.91: Gitaly 1
  • 10.6.0.92: 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.101: Sidekiq 1
  • 10.6.0.102: Sidekiq 2
  • 10.6.0.103: Sidekiq 3
  • 10.6.0.104: Sidekiq 4
  • 10.6.0.111: GitLab 애플리케이션 1
  • 10.6.0.112: GitLab 애플리케이션 2
  • 10.6.0.113: GitLab 애플리케이션 3
  • 10.6.0.151: 프로메테우스

외부 로드 밸런서 구성

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

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

준비 확인

외부 로드 밸런서가 작동 중인 서비스로만 라우팅되도록 모니터링 엔드포인트가 포함된 준비 확인이 필요합니다. 준비 확인은 확인되는 노드에 추가 구성이 필요하며, 그렇지 않으면 외부 로드 밸런서가 연결할 수 없습니다.

포트

사용될 기본 포트는 아래 표에 표시됩니다.

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

사용자 지정 도메인 지원이 있는 GitLab Pages를 사용하는 경우 일부 추가 포트 구성이 필요합니다. GitLab Pages에는 별도의 가상 IP 주소가 필요합니다. DNS를 구성하여 /etc/gitlab/gitlab.rbpages_external_url을 새 가상 IP 주소로 지정하세요. 자세한 내용은 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를 열지 않는 정책을 가지고 있습니다. 이 경우 포트 443에서 SSH를 사용할 수 있는 대체 SSH 호스트 이름을 구성하는 것이 도움이 될 수 있습니다. 다른 GitLab HTTP 구성과 비교하여 대체 SSH 호스트 이름을 위해 새 가상 IP 주소가 필요합니다.

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

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

SSL

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

애플리케이션 노드가 SSL을 종료

로드 밸런서를 구성하여 포트 443에서 연결을 HTTP(S) 프로토콜이 아닌 TCP로 전달하세요. 이것은 연결을 애플리케이션 노드의 NGINX 서비스로 그대로 전달할 것입니다. NGINX에는 SSL 인증서가 있으며 포트 443에서 수신 대기합니다.

SSL 인증서의 관리 및 NGINX 구성에 대한 자세한 내용은 HTTPS 문서를 참조하세요.

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

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

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

로드 밸런서가 백엔드 SSL로 SSL을 종료합니다

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

또한 이 시나리오에서 로드 밸런서와 NGINX 간에 트래픽도 안전합니다. 모든 연결이 안전하므로 프록시된 SSL에 대한 구성을 추가할 필요가 없습니다. 그러나 GitLab에 SSL 인증서를 구성해야 합니다. SSL 인증서 관리 및 NGINX 구성에 대한 자세한 내용은 HTTPS 문서를 참조하세요.

내부 로드 밸런서 구성

다중 노드 GitLab 구성에서 내부 로드 밸런서를 설정하여 구성된 경우, PgBouncerPraefect (Gitaly Cluster)와 같은 선택된 내부 구성 요소의 트래픽을 라우팅해야 합니다.

사용할 로드 밸런서의 구체적인 구성 또는 사용할 로드 밸런서에 관한 자세한 내용은 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. 선택한 Linux 패키지를 다운로드하고 설치합니다. 페이지에서 installation steps 1 and 2 만 따르고 현재 설치된 것과 동일한 버전 및 유형(커뮤니티 또는 엔터프라이즈 에디션)의 올바른 Linux 패키지를 선택하세요.
  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. 첫 번째 Linux 패키지 노드에서 /etc/gitlab/gitlab-secrets.json 파일을 복사하고 이 서버의 동일한 이름의 파일에 추가하거나 교체합니다. 이것이 구성하는 첫 번째 Linux 패키지 노드라면 이 단계를 건너뛰셔도 됩니다.

  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을 위한 서드파티 외부 서비스를 선택적으로 사용할 수 있습니다.

이를 위해 신뢰할 수 있는 제공업체나 솔루션을 사용해야 합니다. Google Cloud SQLAmazon RDS가 작동하는 것으로 알려져 있습니다. 그러나 Amazon Aurora는 14.4.0부터 기본적으로 활성화된 로드 밸런싱과 호환되지 않습니다. 자세한 내용은 권장되는 클라우드 제공업체 및 서비스를 참조하세요.

서드파티 외부 서비스를 사용하는 경우:

  1. HA Linux 패키지 PostgreSQL 설정은 PostgreSQL, PgBouncer 및 Consul을 포함합니다. 이러한 구성요소는 서드파티 외부 서비스를 사용할 때 더 이상 필요하지 않을 것입니다.
  2. 데이터베이스 요구 사항 문서에 따라 PostgreSQL을 설정하세요.
  3. 선택한 암호로 gitlab 사용자를 설정하세요. gitlab 사용자는 gitlabhq_production 데이터베이스를 생성할 수 있는 권한이 필요합니다.
  4. GitLab 애플리케이션 서버를 적절한 세부 정보로 구성하세요. 이 단계에 대한 내용은 GitLab Rails 애플리케이션 구성에서 다루고 있습니다.
  5. HA를 달성하기 위해 필요한 노드 수는 Linux 패키지와 비교했을 때 서비스에 따라 다를 수 있으며, 그에 맞게 일치시킬 필요가 없습니다.
  6. 그러나 추가적인 향상된 성능을 위해 데이터베이스 로드 밸런싱을 통한 읽기 레플리카를 원하는 경우, 참고 아키텍처의 노드 수를 따르는 것이 권장됩니다.

Linux 패키지를 사용한 독립형 PostgreSQL

복제 및 장애 조치를 위한 PostgreSQL 클러스터의 권장 Linux 패키지 구성은 다음과 같습니다:

  • 최소 세 개의 PostgreSQL 노드
  • 최소 세 개의 Consul 서버 노드
  • 주 데이터베이스의 읽기와 쓰기를 추적하고 처리하는 최소 세 개의 PgBouncer 노드
  • 데이터베이스 로드 밸런싱 활성화

    모든 PostgreSQL 노드에 로컬 PgBouncer 서비스가 구성되어 있어야 합니다. 주의할 점은 이것이 주요로 추적하는 본 PgBouncer 클러스터와는 별도로 동작한다는 것입니다.

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

  • 10.6.0.21: PostgreSQL primary
  • 10.6.0.22: PostgreSQL secondary 1
  • 10.6.0.23: PostgreSQL secondary 2

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

PostgreSQL 노드

  1. PostgreSQL 노드 중 하나에 SSH를 사용하여 로그인하세요.
  2. PostgreSQL 사용자/암호 쌍에 대한 암호 해시를 생성하세요. 이 단계에서는 기본 사용자인 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. PostgreSQL 복제 사용자/암호 쌍에 대한 암호 해시를 생성하세요. 이 단계에서는 기본 사용자인 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`을 데이터베이스 노드 수의 두 배로 설정
    # Patroni는 복제를 시작할 때 각 노드 당 하나의 추가 슬롯을 사용합니다.
    patroni['postgresql']['max_replication_slots'] = 6
    
    # `max_wal_senders`를 클러스터의 복제 슬롯 수에 1을 더하여 설정
    # 이는 복제가 이용 가능한 데이터베이스 연결을 모두 사용하는 것을 방지하기 위해 사용됩니다.
    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>'
    
    # 네트워크 주소로 대체
    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
    ## IP와 FQDN 모두 사용할 수 있으며, 혼합하여 사용할 수도 있습니다
    consul['configuration'] = {
       retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
    }
    #
    # END user configuration
    

    PostgreSQL은 기본적으로 pg_rewind를 사용하여 pg_rewind로 충돌을 처리하도록 합니다. 대부분의 장애 조치 처리 방법과 마찬가지로, 데이터 손실 가능성이 있습니다. 자세한 내용은 다양한 Patroni 복제 방법을 참조하세요.

  7. 구성한 첫 Linux 패키지 노드에서 /etc/gitlab/gitlab-secrets.json 파일을 복사하고 이 서버의 동일한 이름의 파일을 추가하거나 교체하세요. 이것이 구성할 첫 번째 Linux 패키지 노드인 경우에는 이 단계를 건너뛰어도 됩니다.

  8. 변경 사항이 적용되도록 GitLab을 다시 구성하십시오.

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

PostgreSQL 포스트 구성

Primary site의 Patroni 노드 중 하나에 SSH로 로그인합니다.

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

    gitlab-ctl patroni members
    

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

    | Cluster       | Member                            |  Host     | Role   | State   | TL  | Lag in MB | Pending restart |
    |---------------|-----------------------------------|-----------|--------|---------|-----|-----------|-----------------|
    | postgresql-ha | <PostgreSQL primary hostname>     | 10.6.0.21 | Leader | running | 175 |           | *               |
    | postgresql-ha | <PostgreSQL secondary 1 hostname> | 10.6.0.22 |        | running | 175 | 0         | *               |
    | postgresql-ha | <PostgreSQL secondary 2 hostname> | 10.6.0.23 |        | running | 175 | 0         | *               |
    

    노드의 ‘State’ 열이 “running”이 아닌 경우, 계속 진행하기 전에 PostgreSQL 복제 및 장애 조치 문제 해결 섹션을 확인합니다.

PgBouncer 구성

이제 PostgreSQL 서버가 모두 설정되었으므로, 주 데이터베이스로의 읽기/쓰기를 추적하고 처리하기 위해 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
    
    # Exporter가 수신 대기할 네트워크 주소 설정
    node_exporter['listen_address'] = '0.0.0.0:9100'
    
  2. 첫 번째 Linux 패키지 노드에서 /etc/gitlab/gitlab-secrets.json 파일을 복사하고 현재 서버의 동일한 이름의 파일로 추가하거나 교체합니다. 이것이 귀하가 구성하는 첫 번째 Linux 패키지 노드인 경우, 이 단계를 건너뛸 수 있습니다.

  3. 변경 사항이 적용되도록 GitLab을 다시 구성합니다.

    오류 execute[generate databases.ini]가 발생하면, 이는 기존의 알려진 문제 때문입니다. 다음 단계 이후 reconfigure를 실행하면 이 문제가 해결될 것입니다.

  4. Consul이 PgBouncer를 다시 로드할 수 있도록 .pgpass 파일을 생성합니다. 두 번 물어보면 PgBouncer 비밀번호를 입력합니다.

    gitlab-ctl write-pgpass --host 127.0.0.1 --database pgbouncer --user pgbouncer --hostuser gitlab-consul
    
  5. 이전 단계에서 발생한 잠재적인 오류를 해결하기 위해 GitLab을 다시 구성합니다.

  6. 각 노드가 현재 주 노드와 통신하는지 확인합니다.

    gitlab-ctl pgb-console # PGBOUNCER_PASSWORD를 요청합니다
    
  7. 콘솔 프롬프트를 사용할 수 있을 때, 다음 쿼리를 실행합니다.

    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)
    

Redis 구성

확장 가능한 환경에서 RedisPrimary x Replica 토폴로지와 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.51: Redis - 캐시 Primary
  • 10.6.0.52: Redis - 캐시 Replica 1
  • 10.6.0.53: Redis - 캐시 Replica 2
  • 10.6.0.61: Redis - 영속성 Primary
  • 10.6.0.62: Redis - 영속성 Replica 1
  • 10.6.0.63: Redis - 영속성 Replica 2

고유한 Redis 인스턴스 제공

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

  • 이에 적합한 신뢰할 수 있는 제공 업체나 솔루션을 사용해야 합니다. Google MemorystoreAWS ElastiCache가 작동하는 것으로 알려져 있습니다.
  • Redis 클러스터 모드는 특별히 지원되지 않지만 HA(High Availability)와 함께 작동하는 Redis 독립형 모드는 지원됩니다.
  • 설정에 따라 Redis 기아 모드 (eviction mode)를 설정해야 합니다.

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

Redis 캐시 클러스터 구성

이 섹션에서는 새로운 Redis 캐시 인스턴스를 설치하고 설정하는 방법에 대해 안내합니다.

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

주요 Redis 캐시 노드 구성

  1. Primary Redis 서버에 SSH로 로그인합니다.
  2. 선택한 Linux 패키지를 다운로드하고 설치합니다. 페이지에서 설치 단계 1 및 2만 따르고, 현재 설치와 동일한 버전 및 유형(Community 또는 Enterprise 에디션)의 올바른 Linux 패키지를 선택하십시오.
  3. /etc/gitlab/gitlab.rb 파일을 편집하고 아래 내용을 추가합니다:

    # 'redis_master_role' 및 Sentinel 및 Consul 에이전트와 함께 서버 역할을 지정합니다.
    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.51'
    
    # Redis가 TCP 요청을 수신할 수 있도록 포트를 정의합니다.
    redis['port'] = 6379
    
    ## Sentinel용 주요 Redis 서버 포트, 기본값이 아닌 것으로 변경하려면 주석 처리합니다. 기본값: `6379`.
    #redis['master_port'] = 6379
    
    # Redis 및 복제본에 대한 암호 인증 설정(모든 노드에서 동일한 암호 사용).
    redis['password'] = 'FIRST_CLUSTER의 REDIS_PRIMARY_PASSWORD'
    redis['master_password'] = 'FIRST_CLUSTER의 REDIS_PRIMARY_PASSWORD'
    
    ## Redis 노드마다 반드시 동일해야 합니다.
    redis['master_name'] = 'gitlab-redis-cache'
    
    ## 주요 Redis 노드의 IP
    redis['master_ip'] = '10.6.0.51'
    
    # Redis 캐시 인스턴스를 LRU로 설정합니다.
    # 사용 가능한 RAM의 90% (MB 단위)
    redis['maxmemory'] = '13500mb'
    redis['maxmemory_policy'] = "allkeys-lru"
    redis['maxmemory_samples'] = 5
    
    ## 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),
    }
    
    # Prometheus에 대한 수출기가 수신할 네트워크 주소를 설정합니다.
    node_exporter['listen_address'] = '0.0.0.0:9100'
    redis_exporter['listen_address'] = '0.0.0.0:9121'
    redis_exporter['flags'] = {
         'redis.addr' => 'redis://10.6.0.51:6379',
         'redis.password' => '여기에 레디스 암호를 입력하세요',
    }
    
    # 업그레이드 시에 자동으로 데이터베이스 마이그레이션을 방지합니다.
    gitlab_rails['auto_migrate'] = false
    
  4. 첫 번째 Linux 패키지 노드에서 /etc/gitlab/gitlab-secrets.json 파일을 복사하여 이 서버의 동일한 이름의 파일을 추가하거나 바꿉니다. 이것이 구성하는 첫 번째 Linux 패키지 노드라면이 단계를 건너 뛰어도 됩니다.

  5. 변경 사항이 적용되려면 GitLab 재구성을 수행하십시오.

레플리카 Redis Cache 노드 구성하기

  1. 레플리카 Redis 서버에 SSH로 로그인합니다.
  2. 선택한 리눅스 패키지를 다운로드하고 설치합니다. 페이지에서 설치 단계 1과 2만 따르고, 현재 설치된 것과 동일한 버전 및 유형(커뮤니티 또는 엔터프라이즈 에디션)의 올바른 리눅스 패키지를 선택해야 합니다.
  3. 이전 섹션의 주 노드와 동일한 내용을 사용하여 /etc/gitlab/gitlab.rb를 편집하고 redis_master_noderedis_replica_node로 대체합니다:

    # 서버 역할을 'redis_sentinel_role' 및 'redis_replica_role'로 지정
    roles ['redis_sentinel_role', 'redis_replica_role', 'consul_role']
    
    # Redis Sentinel 서비스의 IP 바인딩 주소 및 Quorum 번호를 설정합니다.
    sentinel['bind'] = '0.0.0.0'
    sentinel['quorum'] = 2
    
    # 다른 기계에서 도달할 수 있는 로컬 IP를 가리키는 IP 주소
    # 모든 인터페이스에서 수신 대기하도록 '0.0.0.0'으로 바인딩할 수도 있습니다.
    # 외부 접근 가능한 IP에 바인딩해야 하는 경우, 무단 접근을 방지하기 위해 추가 방화벽 규칙을 추가해야 합니다.
    redis['bind'] = '10.6.0.52'
    
    # 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-cache'
    
    ## 주요 Redis 노드의 IP
    redis['master_ip'] = '10.6.0.51'
    
    # Redis Cache 인스턴스를 LRU로 설정합니다.
    # 사용 가능한 RAM의 90%를 MB 단위로 설정합니다.
    redis['maxmemory'] = '13500mb'
    redis['maxmemory_policy'] = "allkeys-lru"
    redis['maxmemory_samples'] = 5
    
    ## 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'
    redis_exporter['flags'] = {
         'redis.addr' => 'redis://10.6.0.52:6379',
         'redis.password' => '여기에 레디스 비밀번호를 입력하세요',
    }
    
    # 업그레이드 시 자동으로 데이터베이스 마이그레이션을 방지합니다.
    gitlab_rails['auto_migrate'] = false
    
  4. 첫 번째 리눅스 패키지 노드에서 /etc/gitlab/gitlab-secrets.json 파일을 복사하여 이 서버의 동일한 이름의 파일에 추가하거나 대체합니다. 이것이 구성 중인 첫 번째 리눅스 패키지 노드인 경우에는 이 단계를 건너뛸 수 있습니다.

  5. 변경 사항이 적용되도록 GitLab을 다시 구성합니다.
  6. 다른 레플리카 노드에 대해 다시 단계를 수행하고, IP를 올바르게 설정했는지 확인합니다.

필요한 경우 고급 구성 옵션을 지원하며 일부 옵션은 추가할 수 있습니다.

Redis Persistent 클러스터 구성

새로운 Redis Persistent 인스턴스를 설치하고 설정하는 섹션입니다.

주 노드와 레플리카 Redis 노드는 redis['password']에 정의된 동일한 암호가 필요합니다. 장애 조치 중에 언제든지 Sentinel은 노드를 다시 구성하고 해당 상태를 주 노드에서 레플리카로 변경할 수 있습니다(그 반대도 마찬가지입니다).

주요 Redis Persistent 노드 구성

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

    # Sentinel 및 콘설 에이전트를 사용하여 서버 역할을 'redis_master_role'로 지정
    roles ['redis_sentinel_role', 'redis_master_role', 'consul_role']
    
    # Redis Sentinel 서비스의 IP 바인딩 주소 및 Quorum 번호를 설정합니다.
    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-persistent'
    
    ## 이 주요 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. 첫 번째 리눅스 패키지 노드에서 /etc/gitlab/gitlab-secrets.json 파일을 복사하여 이 서버의 동일한 이름의 파일에 추가하거나 대체합니다. 이것이 구성 중인 첫 번째 리눅스 패키지 노드인 경우에는 이 단계를 건너뛸 수 있습니다.

  5. 변경 사항이 적용되도록 GitLab을 다시 구성합니다.

복제된 Redis Persistent 노드 구성

  1. Replica Redis Persistent 서버에 SSH합니다.
  2. 원하는 Linux 패키지를 다운로드하고 설치하세요. 페이지에서 설치 단계 1과 2만을 따르고, 현재 설치된 버전 및 타입(Community 또는 Enterprise 버전)과 동일한 Linux 패키지를 선택해야 합니다.
  3. /etc/gitlab/gitlab.rb 파일을 편집하고 아래 내용을 추가하세요:

    # Specify server roles as 'redis_sentinel_role' and 'redis_replica_role'
    roles ['redis_sentinel_role', 'redis_replica_role', 'consul_role']
    
    # Set IP bind address and Quorum number for Redis Sentinel service
    sentinel['bind'] = '0.0.0.0'
    sentinel['quorum'] = 2
    
    # IP address pointing to a local IP that the other machines can reach to.
    # You can also set bind to '0.0.0.0' which listen in all interfaces.
    # If you really need to bind to an external accessible IP, make
    # sure you add extra firewall rules to prevent unauthorized access.
    redis['bind'] = '10.6.0.62'
    
    # Define a port so Redis can listen for TCP requests which will allow other
    # machines to connect to it.
    redis['port'] = 6379
    
    ## Port of primary Redis server for Sentinel, uncomment to change to non default. Defaults
    ## to `6379`.
    #redis['master_port'] = 6379
    
    # The same password for Redis authentication you set up for the primary node.
    redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
    redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
    
    ## Must be the same in every Redis node
    redis['master_name'] = 'gitlab-redis-persistent'
    
    # The IP of the primary Redis node.
    redis['master_ip'] = '10.6.0.61'
    
    ## Enable service discovery for Prometheus
    consul['monitoring_service_discovery'] =  true
    
    ## The IPs of the Consul server nodes
    ## You can also use FQDNs and intermix them with IPs
    consul['configuration'] = {
       retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
    }
    
    # Set the network addresses that the exporters will listen on
    node_exporter['listen_address'] = '0.0.0.0:9100'
    redis_exporter['listen_address'] = '0.0.0.0:9121'
    
    # Prevent database migrations from running on upgrade automatically
    gitlab_rails['auto_migrate'] = false
    
  4. 첫 번째 Linux 패키지 노드에서 /etc/gitlab/gitlab-secrets.json 파일을 복사하여 이 서버의 동일한 이름의 파일에 추가하거나 교체하세요. 이것이 구성하는 첫 번째 Linux 패키지 노드인 경우 이 단계를 건너뛸 수 있습니다.

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

  6. 다른 복제 노드에 대해 다시 단계를 수행하고, IP를 올바르게 설정했는지 확인하세요.

고급 구성 옵션은 필요한 경우 지원되며 추가할 수 있습니다.

Gitaly 클러스터 구성

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

경고: Gitaly 사양은 사용 패턴 및 리포지토리 크기의 높은 백분위수를 기반으로 합니다. 그러나 대형 단일 저장소(몇 기가바이트 이상) 또는 추가 작업 부하가 있는 경우 환경의 성능에 중대한 영향을 미칠 수 있습니다. 이 경우 연관 문서를 참고하거나 추가 지침을 위해 고객 성공 관리자 또는 지원팀에 문의하는 것이 강력히 권장됩니다.

Gitaly 클러스터는 장애 허용의 이점을 제공하지만 추가적인 설정 및 관리 복잡성을 동반합니다. 배포하기 전에 Gitaly 클러스터를 구성하기 전에 기술적 한계와 고려사항을 검토하세요.

  • 샤딩된 Gitaly를 구현하는 방법에 대한 지침은 별도의 Gitaly 문서를 따르세요. 동일한 Gitaly 사양을 사용하세요.
  • Gitaly 클러스터에서 관리되지 않는 기존 저장소를 이전하는 방법에 대한 정보는 Gitaly 클러스터로 이전을 참고하세요.

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

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

이 섹션에서는 권장 표준 설정 구성 방법을 순서대로 설명합니다. 더 복잡한 설정에 대해서는 스탠드얼론 Gitaly 클러스터 문서를 참조하세요.

Praefect PostgreSQL 구성

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

고가용성(HA) 설정을 원하는 경우, 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
    # 필요한 정보 섹션에 설명된 대로 실제 값으로 설정하세요
    #
    # 생성된 md5 값을 PRAEFECT_POSTGRESQL_PASSWORD_HASH로 대체하세요
    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에서 기본적으로 활성화된 로드 밸런싱과 호환되지 않습니다. 자세한 내용은 권장 클라우드 제공업체 및 서비스를 참조하십시오.

위 내용의 예로는 Google의 Cloud SQL 또는 Amazon RDS가 있습니다.

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

Praefect PostgreSQL 포스트 구성

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

사용자의 이름은 praefect로, 데이터베이스의 이름은 praefect_production으로 표준으로 PostgreSQL에 구성하는 것이 좋습니다. 사용자의 비밀번호는 이전에 구성한 <praefect_postgresql_password>와 동일합니다.

Linux 패키지 PostgreSQL 설정 예시:

  1. Praefect PostgreSQL 노드에 SSH로 로그인합니다.
  2. 관리 권한으로 PostgreSQL 서버에 연결합니다. 여기서 gitlab-psql 사용자를 사용해야 합니다. Linux 패키지에서 기본으로 추가되기 때문입니다. 데이터베이스 template1을 사용하는 이유는 이것이 모든 PostgreSQL 서버에 기본적으로 생성되기 때문입니다.

    /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 클러스터의 라우터 및 트랜잭션 매니저이며, Gitaly로의 모든 연결은 이를 통해 이루어집니다. 이 섹션에서는 Praefect의 구성 방법에 대해 자세히 설명합니다.

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

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

  • <praefect_external_token>: 귀하의 Gitaly 클러스터에 호스팅된 저장소에 사용되며, 이 토큰을 가진 Gitaly 클라이언트만 액세스할 수 있습니다.
  • <praefect_internal_token>: Gitaly 클러스터 내부의 복제 트래픽에 사용됩니다. 이 토큰은 praefect_external_token과는 다릅니다. 외부에서 Praefect 클러스터의 내부 노드에 직접 액세스하면 데이터 손실이 발생할 수 있습니다.
  • <praefect_postgresql_password>: 이전 섹션에서 정의한 Praefect PostgreSQL 암호도 이 설정의 일부로 필요합니다.

Gitaly 클러스터 노드는 가상 스토리지를 통해 Praefect에서 구성됩니다. 각 스토리지에는 클러스터를 이루는 각 Gitaly 노드의 세부 정보가 포함되어 있습니다. 각 스토리지는 이름이 지정되며, 이 이름은 구성의 여러 영역에서 사용됩니다. 이 가이드에서는 스토리지의 이름을 default로 지정합니다. 또한, 이 가이드는 새 설치를 대상으로 하며, 기존 환경을 Gitaly 클러스터를 사용하도록 업그레이드하는 경우 다른 이름을 사용해야 할 수도 있습니다. 자세한 내용은 Praefect 설명서를 참조하세요.

다음 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. Praefect를 구성하려면 /etc/gitlab/gitlab.rb 파일을 편집하세요.

    참고: 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 외부 토큰
         # 이 토큰은 외부 클라이언트 (예: GitLab Shell)가 Praefect 클러스터와 통신하기 위해 필요합니다
         token: '<praefect_external_token>',
       },
       # Praefect 데이터베이스 설정
       database: {
         # ...
         host: '10.6.0.141',
         port: 5432,
         # 캐싱을 위한 'no_proxy' 설정은 항상 직접 연결이어야 합니다
         session_pooled: {
            # ...
            host: '10.6.0.141',
            port: 5432,
            dbname: 'praefect_production',
            user: 'praefect',
            password: '<praefect_postgresql_password>',
         },
       },
       # Praefect 가상 스토리지 구성
       # 저장소 해시의 이름은 GitLab 서버의 git_data_dirs ('praefect') 및 Gitaly 노드 ('gitaly-1')의 gitaly['configuration'][:storage]에서 저장소 이름과 일치해야 합니다
       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를 혼용하여 사용하거나 IP만 사용할 수 있음
    consul['configuration'] = {
       retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
    }
    #
    # 사용자 구성 끝
    
  4. 첫 번째 Linux 패키지 노드에서 /etc/gitlab/gitlab-secrets.json 파일을 복사하여 이 서버의 동일한 이름의 파일을 추가하거나 교체합니다. 이것이 처음 구성하는 Linux 패키지 노드인 경우 이 단계를 건너뛰어도 됩니다.

  5. Praefect는 주 데이터베이스 과정과 마찬가지로 몇 가지 데이터베이스 마이그레이션을 실행해야 합니다. 이 작업은 메인 GitLab 애플리케이션과 동일합니다. 따라서 데이터베이스 마이그레이션을 실행할 Praefect 노드를 하나 선택해야 합니다. 즉, _배포 노드_입니다. 다음의 단계에 따라 이 노드를 먼저 구성해야 합니다:

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

    2. 업그레이드 중에 데이터베이스 마이그레이션이 자동으로 실행되지 않고, 다시 구성 중에만 실행되도록 하려면 다음을 실행합니다:

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

Gitaly 구성

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

경고: Gitaly 사양은 사용 패턴 및 저장소 크기의 높은 백분위수에 기반합니다. 하지만, 만약 대형 단일 저장소 (여러 기가바이트보다 큰)나 추가 워크로드가 있는 경우, 이는 환경의 성능에 상당한 영향을 미칠 수 있으며 추가 조정이 필요할 수 있습니다. 이 경우 해당 링크된 문서를 참고하고 추가 지침을 위해 고객 성공 매니저 또는 지원 팀에 문의하는 것을 강력히 권장합니다.

Gitaly는 상당한 입력 및 출력 요구 사항이 있으므로 모든 Gitaly 노드가 SSD(Solid-State Drive)를 사용하는 것을 강력히 권장합니다. 이러한 SSD는 읽기 작업에 대해 최소 8,000 IOPS(I/O 작업/초), 쓰기 작업에 대해 최소 2,000 IOPS를 가져야 합니다. 환경을 클라우드 제공업체에서 실행하는 경우, 올바른 IOPS 구성에 대한 해당 공급업체 문서를 참조하세요.

Gitaly 서버는 기본적으로 네트워크 트래픽이 암호화되지 않으므로 공개 인터넷에 노출되어서는 안 됩니다. 방화벽의 사용을 강력히 권장하여 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(Fully Qualified Domain Name)을 사용하고 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 파일을 해당 이름의 파일에 추가 또는 교체합니다. MessageLookup 처음 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. 파일을 저장하고 GitLab을 다시 구성합니다.

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

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

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

Sidekiq 구성

Sidekiq는 Redis, PostgreSQL, Gitaly 인스턴스에 연결을 필요로 합니다. 또한 권장됨에 따라 Object Storage에 연결해야 합니다.

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

참고: 환경의 Sidekiq 작업 처리가 지연되면 필요에 따라 확장할 수 있습니다. 자세한 정보는 확장 문서를 참조하세요.

  • 10.6.0.101: Sidekiq 1
  • 10.6.0.102: Sidekiq 2
  • 10.6.0.103: Sidekiq 3
  • 10.6.0.104: Sidekiq 4

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

  1. Sidekiq 서버에 SSH로 로그인합니다.
  2. 선택한 Linux 패키지를 다운로드하고 설치합니다. 해당 페이지의 설치 단계 1과 2만 따르세요.
  3. /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 연결 세부 정보
    ## 캐시 데이터를 호스팅하는 첫 번째 클러스터
    gitlab_rails['redis_cache_instance'] = 'redis://:<REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER>@gitlab-redis-cache'
    
    gitlab_rails['redis_cache_sentinels'] = [
      {host: '10.6.0.51', port: 26379},
      {host: '10.6.0.52', port: 26379},
      {host: '10.6.0.53', port: 26379},
    ]
    
    ## 모든 다른 영구 데이터를 호스팅할 두 번째 클러스터
    redis['master_name'] = 'gitlab-redis-persistent'
    redis['master_password'] = '<REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER>'
    
    gitlab_rails['redis_sentinels'] = [
      {host: '10.6.0.61', port: 26379},
      {host: '10.6.0.62', port: 26379},
      {host: '10.6.0.63', 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 IPs
    
    ## 업그레이드시 자동으로 데이터베이스 마이그레이션을 방지합니다
    gitlab_rails['auto_migrate'] = false
    
    # Sidekiq
    sidekiq['enable'] = true
    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.151/32', '127.0.0.0/8']
    
    # 객체 저장소
    ## 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>'
    }
    
  4. 구성한 Linux 패키지 노드 중 첫 번째 노드의 /etc/gitlab/gitlab-secrets.json 파일을 이 서버의 동일한 이름의 파일에 추가하거나 교체합니다. 이것이 구성하는 첫 번째 Linux 패키지 노드인 경우 이 단계는 건너뛸 수 있습니다.

  5. 재구성시 데이터베이스 마이그레이션을 업그레이드 중 자동으로 실행하지 않도록하려면 다음을 실행하세요.

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

    GitLab을 다시 구성하여 변경 사항이 적용되도록 합니다.

GitLab Rails 구성

이 섹션은 GitLab 애플리케이션 (Rails) 구성 요소를 구성하는 방법에 대해 설명합니다.

Rails는 Redis, PostgreSQLGitaly 인스턴스에 연결을 필요로 합니다. 또한 권장 사항으로 객체 저장소에 연결해야 합니다.

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

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

  • 10.6.0.111: GitLab 애플리케이션 1
  • 10.6.0.112: GitLab 애플리케이션 2
  • 10.6.0.113: GitLab 애플리케이션 3

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

  1. 선택한 Linux 패키지를 다운로드하고 설치합니다. 페이지의 설치 단계 1 및 2에 따라하기만 하십시오.

  2. /etc/gitlab/gitlab.rb 파일을 편집하고 다음 구성을 사용합니다. 노드간 링크의 균일성을 유지하기 위해 애플리케이션 서버의 external_url은 사용자가 GitLab에 액세스하는 데 사용할 외부 URL을 가리켜야 합니다. 이는 트래픽을 GitLab 애플리케이션 서버로 라우팅할 외부 로드 밸런서의 URL이어야 합니다.

    external_url 'https://gitlab.example.com'
    
    # Praefect 가상 저장소를 위해 git_data_dirs를 구성합니다
    # 주소는 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
    nginx['enable'] = true
    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 IP
    
    # 업그레이드 시 자동으로 데이터베이스 마이그레이션을 방지합니다
    gitlab_rails['auto_migrate'] = false
    
    ## Redis 연결 세부 정보
    ## 캐시 데이터를 호스팅할 첫 번째 클러스터
    gitlab_rails['redis_cache_instance'] = 'redis://:<REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER>@gitlab-redis-cache'
    
    gitlab_rails['redis_cache_sentinels'] = [
      {host: '10.6.0.51', port: 26379},
      {host: '10.6.0.52', port: 26379},
      {host: '10.6.0.53', port: 26379},
    ]
    
    ## 모든 다른 영구 데이터를 호스팅하는 두 번째 클러스터
    redis['master_name'] = 'gitlab-redis-persistent'
    redis['master_password'] = '<REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER>'
    
    gitlab_rails['redis_sentinels'] = [
      {host: '10.6.0.61', port: 26379},
      {host: '10.6.0.62', port: 26379},
      {host: '10.6.0.63', port: 26379},
    ]
    
    # 모니터링에 사용되는 수신기가 청취할 네트워크 주소를 설정합니다
    node_exporter['listen_address'] = '0.0.0.0:9100'
    gitlab_workhorse['prometheus_listen_addr'] = '0.0.0.0:9229'
    puma['listen'] = '0.0.0.0'
    
    # 모니터링 노드의 IP 주소를 모니터링 화이트리스트에 추가하고
    # NGINX 메트릭을 스크랩할 수 있도록 허용합니다
    gitlab_rails['monitoring_whitelist'] = ['10.6.0.151/32', '127.0.0.0/8']
    nginx['status']['options']['allow'] = ['10.6.0.151/32', '127.0.0.0/8']
    
    #############################
    ###     객체 저장소    ###
    #############################
    
    # 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>'
    }
    
  3. TLS 지원을 사용하는 Gitaly을 사용하는 경우 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 중에만 실행되도록 하려면 다음을 실행합니다.

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

    지정된 단일 노드만 GitLab Rails 사후 구성 섹션에 자세히 설명된 대로 마이그레이션을 처리해야 합니다.

  7. 변경 사항이 적용되도록 GitLab 재구성합니다.
  8. 증분 로깅 활성화.
  9. 노드가 Gitaly에 연결할 수 있는지 확인합니다.

    sudo gitlab-rake gitlab:gitaly:check
    

    그런 다음 요청을 확인하기 위해 로그를 추적합니다.

    sudo gitlab-ctl tail gitaly
    
  10. 옵션으로, Gitaly 서버에서 Gitaly가 내부 API에 콜백을 수행할 수 있는지 확인합니다.
    • GitLab 15.3 이상의 경우, sudo /opt/gitlab/embedded/bin/gitaly check /var/opt/gitlab/gitaly/config.toml을 실행합니다.
    • GitLab 15.2 이하의 경우, sudo /opt/gitlab/embedded/bin/gitaly-hooks check /var/opt/gitlab/gitaly/config.toml을 실행합니다.

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

GitLab Rails 포스트 구성

  1. 설치 및 업데이트 중에 데이터베이스 마이그레이션을 실행할 응용 프로그램 노드를 지정합니다. GitLab 데이터베이스를 초기화하고 모든 마이그레이션이 실행되었는지 확인하세요:

    sudo gitlab-rake gitlab:db:configure
    

    이는 Rails 노드가 기본 데이터베이스에 직접 연결하도록 구성되어 있어야 하며, PgBouncer를 우회해야 한다는 점을 유의하십시오. 마이그레이션이 완료되면 노드를 다시 PgBouncer를 통과하도록 구성해야 합니다.

  2. 데이터베이스에서 허가된 SSH 키를 빠르게 조회하도록 구성합니다(../operations/fast_ssh_key_lookup.md).

Prometheus 구성

Linux 패키지를 사용하여 Prometheus를 실행하는 독립 모니터링 노드를 구성할 수 있습니다.

다음 IP는 예시로 사용될 것입니다:

  • 10.6.0.151: Prometheus

모니터링 노드를 구성하려면:

  1. 모니터링 노드에 SSH로 연결합니다.
  2. 선택한 Linux 패키지를 다운로드하고 설치합니다. 페이지에서 오직 설치 단계 1과 2를 따르도록 합니다.

  3. /etc/gitlab/gitlab.rb 파일을 편집하고 아래 내용을 추가합니다:

    roles(['monitoring_role', 'consul_role'])
    
    external_url 'http://gitlab.example.com'
    
    # Prometheus
    prometheus['listen_address'] = '0.0.0.0:9090'
    prometheus['monitor_kubernetes'] = false
    
    # Prometheus를 위한 서비스 검색 활성화
    consul['monitoring_service_discovery'] =  true
    consul['configuration'] = {
       retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13)
    }
    
    # Prometheus가 검색하지 않는 서비스를 스크레이핑하도록 구성
    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을 다시 구성하세요.

객체 저장소 구성

GitLab은 다양한 유형의 데이터를 보관하기 위해 객체 저장소 서비스를 사용하도록 지원합니다. 데이터 객체에 대해 NFS 대신 추천되며, 일반적으로 성능이 우수하고 신뢰성 있으며 확장 가능하기 때문에 큰 규모의 설정에서 더 좋습니다. 자세한 내용은 권장 클라우드 공급자와 서비스를 참조하십시오.

GitLab에서 객체 저장소 구성을 지정하는 두 가지 방법이 있습니다:

통합 형식은 가능한 경우 다음 예제에서 사용됩니다.

참고: GitLab 14.x 및 이전 버전에서 저장소별 형식을 사용하는 경우 직접 업로드 모드를 활성화해야 하며, 14.9에서 지원이 제거된 이전 백그라운드 업로드 모드는 NFS와 같은 공유 저장소가 필요합니다.

각 데이터 유형에 대해 별도 버킷을 사용하는 것이 GitLab에서 권장하는 접근 방식입니다. 이렇게 하면 GitLab이 저장하는 다양한 유형의 데이터 사이에서 충돌이 없음이 보장됩니다. 미래에 단일 버킷 사용을 지원할 계획이 있습니다.

증분 로깅 활성화

기본적으로 GitLab Runner는 작업 로그를 조각으로 반환하며, 통합된 객체 저장소를 사용할 때에도 Linux 패키지는 기본적으로 디스크의 /var/opt/gitlab/gitlab-ci/builds에 임시로 캐시합니다. 기본 구성으로는 이 디렉토리를 NFS를 통해 GitLab Rails 및 Sidekiq 노드 중 어느 곳이든 공유해야 합니다.

작업 로그를 NFS를 통해 공유하는 것은 지원되지만, NFS 노드가 배포되지 않은 경우에는 NFS 사용을 피하고 증분 로깅 (NFS 노드가 배포되지 않은 경우 필수)을 활성화하는 것이 좋습니다. 증분 로깅은 작업 로그의 임시 캐싱에 디스크 공간 대신 Redis를 사용합니다.

고급 검색 구성

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

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

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

Kubernetes에서 GitLab Helm 차트를 사용하여 클라우드 네이티브 GitLab의 특정 구성 요소를 실행할 수 있습니다. 이 설정에서는 Kubernetes 클러스터 내에서 GitLab Rails의 동등한 것을 Webservice로 실행할 수 있습니다. 또한 Kubernetes 클러스터 내에서 Sidekiq 노드와 NGINX, Toolbox, Migrations, Prometheus, Grafana와 같은 지원 서비스를 실행할 수 있습니다.

하이브리드 설치는 클라우드 네이티브 및 전통적인 컴퓨팅 배치의 이점을 활용합니다. 이를 통해 상태가 없는(stateless) 구성 요소는 클라우드 네이티브 워크로드 관리의 이점을 얻을 수 있고, 상태가 있는(stateful) 구성 요소는 증가된 영속성을 위해 Linux 패키지 설치된 컴퓨팅 VM에 배포됩니다.

Kubernetes에서 서비스를 실행하는 것은 복잡하다는 것이 잘 알려져 있으므로 이 설정은 고급 설정이므로 강력한 쿠버네티스에 대한 지식과 경험이 있는 경우에만 권장됩니다. 이 섹션의 나머지 부분은 이에 대해 가정합니다.

경고: Gitaly 클러스터를 Kubernetes에서 실행하는 것은 지원되지 않습니다. 자세한 내용은 epic 6127을 참조하세요.

클러스터 토폴로지

동일한 형식으로 일반적인 환경과 호환되는 하이브리드 환경을 설명하는 다음 표 및 다이어그램입니다.

먼저 Kubernetes에서 실행되는 구성 요소들입니다. 그러나 최소 CPU 및 메모리 요구 사항을 준수하는 한 원하는대로 전반적인 구성을 변경할 수 있습니다.

서비스 노드 그룹 노드 구성 GCP AWS 최소할당 가능 CPU 및 메모리
Webservice 4 32 vCPU, 28.8 GB 메모리 n1-highcpu-32 c5.9xlarge 127.5 vCPU, 118 GB 메모리
Sidekiq 4 4 vCPU, 15 GB 메모리 n1-standard-4 m5.xlarge 15.5 vCPU, 50 GB 메모리
지원 서비스 2 4 vCPU, 15 GB 메모리 n1-standard-4 m5.xlarge 7.75 vCPU, 25 GB 메모리
  • 이 설정에서는 Google Kubernetes Engine (GKE)Amazon Elastic Kubernetes Service (EKS)권장하며 정기적으로테스트합니다.
  • 노드 구성은 일치하는 pod vCPU/메모리 비율을 강제적으로 보장하고 성능 테스트 중 스케일링하지 않도록 표시됩니다.
    • 프로덕션 배포에서는 특정 노드에 pod를 할당할 필요가 없습니다. 서로 다른 가용 영역에 있는 3개의 노드 그룹당 최소 3개의 노드를 권장하여 견고한 클라우드 아키텍처 관행에 부합하는 것이 좋습니다.

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

서비스 노드 구성 GCP AWS
Consul1 3 2 vCPU, 1.8 GB 메모리 n1-highcpu-2 c5.large
PostgreSQL1 3 8 vCPU, 30 GB 메모리 n1-standard-8 m5.2xlarge
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/Sentinel - Cache2 3 4 vCPU, 15 GB 메모리 n1-standard-4 m5.xlarge
Redis/Sentinel - Persistent2 3 4 vCPU, 15 GB 메모리 n1-standard-4 m5.xlarge
Gitaly5 3 16 vCPU, 60 GB 메모리6 n1-standard-16 m5.4xlarge
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
Object storage4 - - - -

각주:

  1. 신뢰할 수 있는 타사 외부 PaaS PostgreSQL 솔루션에서 선택하여 실행할 수 있습니다. 자세한 내용은 자체 PostgreSQL 인스턴스 제공권장하는 클라우드 제공업체 및 서비스를 참조하세요.
  2. 신뢰할 수 있는 타사 외부 PaaS Redis 솔루션에서 선택하여 실행할 수 있습니다. 자세한 내용은 자체 Redis 인스턴스 제공권장하는 클라우드 제공업체 및 서비스를 참조하세요.
    • Redis는 주로 단일 스레드이며 CPU 코어의 증가에서 크게 이점을 얻지 않습니다. 이런 규모의 아키텍처에서는 최적의 성능을 얻기 위해 별도의 Cache 및 Persistent 인스턴스를 구축하는 것이 강력히 권장됩니다.
  3. 사용하는 신뢰할 수 있는 타사 로드 밸런서 또는 서비스(LB PaaS)에서 실행하는 것이 권장됩니다. 또한 사이즈는 선택한 로드 밸런서 및 네트워크 대역폭과 같은 추가 요소에 따라 다르며 고가용성 기능을 제공할 수 있습니다. 자세한 내용은 로드 밸런서를 참조하세요.
  4. 신뢰할 수 있는 클라우드 제공업체 또는 자체 관리 솔루션에서 실행해야 합니다. 자세한 내용은 객체 저장소 구성를 참조하세요.
  5. Gitaly 클러스터는 장애 허용성의 이점을 제공하지만 추가적인 설정 및 관리 복잡성을 동반합니다. Gitaly 클러스터를 배포하기 전에 기존 기술적 제한과 고려 사항을 검토하세요. 샤드 형태의 Gitaly를 원하는 경우, Gitaly에 나열된 사양이 동일하게 사용됩니다.
  6. Gitaly 사양은 사용 패턴 및 레포지토리 크기의 높은 백분위에 기반합니다. 그러나 대형 단일 저장소 또는 추가적인 워크로드가 있는 경우 Git 및 Gitaly의 성능에 중대한 영향을 미칠 수 있으므로 추가적인 조정이 필요할 수 있습니다.
note
인스턴스를 구성하는 PaaS 솔루션의 경우, 견고한 클라우드 아키텍처 관행과 일치하도록 3개의 서로 다른 가용 영역에 3개의 노드를 구현하는 것이 강력히 권장됩니다.

리소스 사용량 설정

다음 공식은 리소스 제약 조건 내에서 배포될 수 있는 팟 수를 계산하는 데 도움이 됩니다. 10k 참조 아키텍처 예제 값 파일은 계산된 구성을 Helm 차트에 적용하는 방법을 문서화합니다.

웹 서비스

웹 서비스 팟은 일반적으로 각 워커 당 약 1 CPU와 1.25GB의 메모리가 필요합니다. 권장 토폴로지를 사용하면 각 웹 서비스 팟이 4개의 워커 프로세스를 만들고 각 팟에 다른 작은 프로세스가 실행됨에 따라 각 웹 서비스 팟이 대략 4 CPU와 5GB의 메모리를 소비합니다.

10,000명의 사용자를 위해 Puma 워커를 약 80개 총 계산하여 4개의 워커가 있는 팟 당 20개의 웹 서비스 팟을 배포하는 것을 권장합니다. 제공된 권장 사항에 따라 1 CPU당 1.25GB의 메모리 비율을 사용하여 추가 웹 서비스 팟 당 추가 리소스를 확장할 수 있습니다.

리소스 사용에 대한 자세한 정보는 웹 서비스 리소스를 참조하십시오.

Sidekiq

일반적으로 Sidekiq 팟은 0.9 CPU 및 2GB의 메모리가 필요합니다.

제공된 시작 지점에 따라 최대 14개의 Sidekiq 팟을 배포할 수 있습니다. 추가 팟당 0.9 CPU에서 2GB 메모리 비율을 사용하여 사용 가능한 리소스를 확장할 수 있습니다.

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

Supporting

Supporting 노드 풀은 웹 서비스 및 Sidekiq 풀에 있을 필요가 없는 모든 지원 배포를 수용하기 위해 설계되었습니다.

이에는 클라우드 공급업체의 구현 및 지원 GitLab 배포와 관련된 다양한 배포, 예를 들어 NGINX 또는 GitLab Shell과 같은 배포가 포함됩니다.

모니터링과 같은 추가 배포를 원하면 가능한 경우 Supporting 풀에 배포하는 것이 권장되며, 웹 서비스 또는 Sidekiq 풀이 아닌 Supporting 풀에 배포하는 것이 좋습니다. Supporting 풀은 추가적인 배포를 여러 개 수용할 수 있도록 설계되었습니다. 그러나 주어진 풀에 배포할 수 없는 경우 노드 풀을 맞게 확장할 수 있습니다.

Secrets

클라우드 네이티브 하이브리드 환경을 설정할 때, /etc/gitlab/gitlab-secrets.json 파일에서 백엔드 VM에서 쿠버네티스로 여러 비밀을 동기화해야 합니다.

특히 이 설정에서 GitLab RailsGitLab Shell 비밀을 동기화해야 합니다.