- 요구 사항
- 테스트 방법론
- 구성 컴포넌트
- 외부 로드 밸런서 구성
- 내부 로드 밸런서 구성
- Consul 구성
- PostgreSQL 구성
- Gitaly 클러스터 구성
- Sidekiq 구성
- GitLab Rails 구성
- 프로메테우스 구성
- 객체 리포지터리 구성
- 고급 검색 구성
- 클라우드 네이티브 하이브리드 참조 아키텍처 Helm 차트(대안)
- Secrets
참조 아키텍처: 최대 10,000명의 사용자 대상
이 페이지에서는 최대 10,000명의 사용자를 대상으로 한 GitLab 참조 아키텍처에 대해 설명합니다. 이 아키텍처는 주목할 만한 여유를 갖추고 있습니다.
자세한 참조 아키텍처 디렉터리은 사용 가능한 참조 아키텍처을 참조하십시오.
- 대상 부하: API: 200 RPS, Web: 20 RPS, Git (Pull): 20 RPS, Git (Push): 4 RPS
- 고가용성: 예 (HA를 제공하려면 Praefect를 구성하여 HA 기능을 갖춘 서드파티 PostgreSQL 솔루션이 필요합니다)
- 예상 비용: 비용 테이블 확인
- 클라우드 네이티브 하이브리드 대안: 예
- 어떤 참조 아키텍처를 사용해야 하는지 확신이 들지 않나요? 자세한 내용은 이 가이드로 이동
서비스 | 노드 수 | 구성 | 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 - Cache2 | 3 | 4 vCPU, 15 GB 메모리 | n1-standard-4
| m5.xlarge
| D4s v3
|
Redis/Sentinel - Persistent2 | 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 | - | - | - | - | - |
각주:
- 신뢰할 수 있는 서드파티 외부 PaaS PostgreSQL 솔루션에서 선택적으로 실행할 수 있습니다. 자세한 내용은 자체 PostgreSQL 인스턴스 제공 및 권장 클라우드 제공업체 및 서비스를 참조하십시오.
- 신뢰할 수 있는 서드파티 외부 PaaS Redis 솔루션에서 선택적으로 실행할 수 있습니다. 자세한 내용은 자체 Redis 인스턴스 제공 및 권장 클라우드 제공업체 및 서비스를 참조하십시오.
- Redis는 주로 싱글 스레드이며 CPU 코어 증가에 크게 이점을 얻을 수 없습니다. 이 크기의 아키텍처의 경우 최적의 성능을 얻기 위해 캐시 및 지속적인 별도의 인스턴스를 갖추는 것이 강력히 권장됩니다.
- 고가용성 기능을 제공할 수 있는 신뢰할 수 있는 서드파티 로드 밸런서 또는 서비스(LB PaaS)로 실행하는 것이 좋습니다. 또한 크기 결정은 선택한 로드 밸런서 및 네트워크 대역폭과 같은 추가 요소에 따라 다릅니다. 자세한 내용은 로드 밸런서를 참조하십시오.
- 신뢰할 수 있는 클라우드 제공업체 또는 Self-managed 솔루션에서 실행해야 합니다. 자세한 내용은 객체 리포지터리 구성를 참조하십시오.
- Gitaly 클러스터는 장애 허용성의 이점을 제공하지만 추가 설정 및 관리 복잡성이 동반됩니다. Gitaly 클러스터를 배포하기 전에 기존 기술적 제한 사항 및 고려 사항을 검토하십시오. 샤드된 Gitaly를 원하는 경우
Gitaly
에 대한 동일한 사양을 사용하십시오. - Gitaly 사양은 모두 사용 패턴 및 건전한 리포지터리 크기의 상위 백분위수에 기반합니다. 그러나 대규모 모노 리포지터리(몇 기가바이트보다 큰)나 추가 작업 부하가 있으면 Git 및 Gitaly 성능에 상당한 영향을 미치며 추가 조정이 필요할 수 있습니다.
- 상태 데이터를 저장하지 않는 Auto Scaling Groups(ASG)에 배치할 수 있습니다. 그러나 GitLab Rails의 경우 마이그레이션 및 Mailroom과 같은 특정 프로세스는 하나의 노드에서만 실행해야 합니다.
요구 사항
시작하기 전에 참조 아키텍처를 참조하십시오.
테스트 방법론
10k 아키텍처는 대부분의 워크플로를 포괄하기 위해 설계되었으며 정기적으로 smoke and performance tested Quality Engineering 팀에 의해 다음의 엔드포인트 처리량 목표에 대해 테스트됩니다.
- API: 200 RPS
- Web: 20 RPS
- Git (Pull): 20 RPS
- Git (Push): 4 RPS
위의 목표는 사용자 카운트에 해당하는 총 환경 부하에 관한 실제 고객 데이터를 기반으로 하여 선택되었으며, CI 및 기타 작업 부하와 함께 추가적인 여유를 충분히 고려하였습니다.
위 엔드포인트 목표에 대해 정기적으로 더 높은 처리량을 보유하고 있다고 제안하는 메트릭이 있다면, large monorepos 또는 두드러진 추가 작업 부하가 성능 환경에 큰 영향을 미칠 수 있으며, 추가적인 조정이 필요할 수 있습니다. 이 경우, 연결된 문서를 참조하거나 추가 안내가 필요한 경우 고객 성공 매니저 또는 지원 팀에 문의하는 것이 강력히 권장됩니다.
테스트는 정기적으로 GitLab Performance Tool (GPT) 및 해당 데이터 집합을 사용하여 수행되며, 이는 누구나 사용할 수 있습니다. 이 테스트의 결과는 GPT 위키에서 공개적으로 이용 가능하며, 추가 정보는 문서의 이 섹션을 참조하십시오.
테스트에 사용된 로드 밸런서들은 Linux 패키지 환경에 대한 HAProxy 또는 등가의 클라우드 제공자 서비스를 통한 Cloud Native Hybrids용 NGINX Ingress입니다. 이 선택 사항은 특정 요구 사항이나 권장 사항을 대표하지 않음을 유의하십시오. 대부분의 신뢰할만한 로드 밸런서들이 작동할 것으로 예상됩니다.
구성 컴포넌트
GitLab 및 해당 컴포넌트를 10,000명의 사용자까지 수용하도록 설정하려면 다음을 수행하십시오.
- 외부 로드 밸런서 구성 GitLab 애플리케이션 서비스 노드의 부하 분산을 처리합니다.
- 내부 로드 밸런서 구성. GitLab 애플리케이션 내부 연결의 부하 분산을 처리합니다.
- Consul 구성.
- PostgreSQL 구성, GitLab의 데이터베이스.
- PgBouncer 구성.
- Redis 구성.
- Gitaly Cluster 구성, Git 리포지터리에 액세스를 제공합니다.
- Sidekiq 구성.
- 기본 GitLab Rails 애플리케이션 구성 Puma, Workhorse, GitLab Shell을 실행하고 UI, API 및 Git over HTTP/SSH를 모두 제공합니다.
- Prometheus 구성하여 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 세컨더리 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.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
: Prometheus
외부 로드 밸런서 구성
다중 노드 GitLab 구성의 경우, 애플리케이션 서버로의 트래픽을 경로로 지정하기 위해 외부 로드 밸런서가 필요합니다.
어떤 로드 밸런서를 사용할지 또는 정확한 구성에 대한 구체적인 사항은 GitLab 문서의 범위를 벗어나지만 더 자세한 정보는 로드 밸런서를 참조하십시오. 이 섹션은 선택한 로드 밸런서의 구성에 중점을 두고 있습니다.
준비 확인 사항
외부 로드 밸런서는 내장된 모니터링 엔드포인트를 사용하여 작동 중인 서비스로만 라우팅하도록하십시오. 준비 확인은 모두 확인되는 노드에 추가 구성을 필요로 합니다. 그렇지 않으면 외부 로드 밸런서가 연결할 수 없게됩니다.
포트
사용할 기본 포트는 아래 표에 표시됩니다.
LB 포트 | 백엔드 포트 | 프로토콜 |
---|---|---|
80 | 80 | HTTP (1) |
443 | 443 | TCP 또는 HTTPS (1) (2) |
22 | 22 | TCP |
- (1): 웹 터미널 지원은 로드 밸런서가 WebSocket 연결을 올바르게 처리해야합니다. HTTP 또는 HTTPS 프록시를 사용할 때, 로드 밸런서는
Connection
및Upgrade
호프바이호프 헤더를 통과시키도록 구성되어야합니다. 자세한 내용은 웹 터미널 통합 가이드를 참조하십시오. - (2): 포트 443에 HTTPS 프로토콜을 사용하는 경우 로드 밸런서에 SSL 인증서를 추가해야합니다. 로드 밸런서에서 SSL을 해제하려면 GitLab 응용 프로그램 서버에서 TCP 프로토콜을 사용하십시오.
GitLab Pages를 사용하는 경우 사용자는 몇 가지 추가 포트 구성이 필요합니다.
GitLab Pages에는 별도의 가상 IP 주소가 필요합니다. DNS를 구성하여 /etc/gitlab/gitlab.rb
의 pages_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를 개방하는 것에 대한 정책을 가지고 있습니다. 이 경우 사용자가 SSH를 443 포트에서 사용할 수 있도록 대체 SSH 호스트 이름을 구성하는 것이 도움이 될 수 있습니다. 대체 SSH 호스트 이름을 altssh.gitlab.example.com
과 같이 구성하십시오.
LB 포트 | 백엔드 포트 | 프로토콜 |
---|---|---|
443 | 22 | TCP |
SSL
다음 질문은 환경에서 SSL을 어떻게 처리할 것인가입니다. 다양한 다른 옵션이 있습니다:
- 응용 프로그램 노드가 SSL을 해제합니다.
- 로드 밸런서가 백엔드 SSL없이 SSL을 해제합니다 및 로드 밸런서와 응용 프로그램 노드 간 통신이 안전하지 않습니다.
- 로드 밸런서가 백엔드 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을 추가 구성할 필요가 없습니다. 그러나 SSL 인증서를 구성하기위해 GitLab에 구성을 추가해야합니다. SSL 인증서를 관리하고 NGINX를 구성하는 자세한 내용은 HTTPS 문서를 참조하십시오.
내부 로드 밸런서 구성
다중 노드 GitLab 구성에서 선택적으로 구성된 경우 PgBouncer 및 Praefect (Gitaly 클러스터)에 대한 연결과 같은 내부 컴포넌트의 트래픽을 라우팅하기 위해 내부 로드 밸런서가 필요합니다.
사용할 로드 밸런서 또는 정확한 구성에 대한 구체적인 내용은 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 서버를 설정합니다.
다음 IP가 예시로 사용됩니다:
-
10.6.0.11
: Consul 1 -
10.6.0.12
: Consul 2 -
10.6.0.13
: Consul 3
Consul을 구성하려면:
- Consul을 호스팅할 서버에 SSH로 로그인합니다.
- 선택한 Linux 패키지를 다운로드하고 설치합니다. 페이지의 설치 단계 1과 2만 따르고 현재 설치된 버전 및 타입(Community 또는 Enterprise editions)과 일치하는 올바른 Linux 패키지를 선택하세요.
-
/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
-
첫 번째 Linux 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하고 해당 서버에 동일한 이름의 파일을 추가하거나 교체합니다. 이게 처음 구성하는 Linux 패키지 노드라면 이 단계를 건너뛰어도 됩니다. -
변경 사항이 적용되려면 GitLab 재구성을 해주세요.
- 다른 Consul 노드에 대해 위 단계를 다시 진행하고 올바른 IP를 설정했는지 확인하세요.
3번째 Consul 서버의 프로비저닝이 완료되면 Consul 로그를 확인하여 Consul Leader가 선출되었음을 확인합니다. sudo gitlab-ctl tail consul
명령을 통해 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 SQL 및 Amazon RDS가 작동하는 것으로 알려져 있습니다. 그러나 Amazon Aurora는 14.4.0부터 기본적으로 활성화된 로드 밸런싱과 호환되지 않습니다. 자세한 정보는 권장 클라우드 제공업체 및 서비스를 참조하세요.
외부 PostgreSQL 서비스를 사용하는 경우:
- HA Linux 패키지 PostgreSQL 설정은 더 이상 필요하지 않으며, PostgreSQL, PgBouncer 및 Consul을 포함합니다.
- 데이터베이스 요구 사항 문서에 따라 PostgreSQL을 설정합니다.
- 선택한 비밀번호로
gitlab
사용자를 설정합니다.gitlab
사용자는gitlabhq_production
데이터베이스를 생성할 권한이 필요합니다. - GitLab 응용프로그램 서버를 적절한 세부 정보로 구성합니다. 이 단계는 GitLab Rails 응용프로그램 구성에서 다루고 있습니다.
- HA를 달성하기 위해 필요한 노드 수는 Linux 패키지와는 다를 수 있으며, 따라서 해당되도록 맞춰야 할 필요가 없습니다.
- 그러나 추가적인 성능 향상을 위해 Database Load Balancing을 사용하려면 참조 아키텍처의 노드 수를 추천합니다.
Linux 패키지를 사용하는 스탠드얼론 PostgreSQL
복제 및 장애 조치가 가능한 PostgreSQL 클러스터를 위한 권장 Linux 패키지 구성은 다음과 같습니다:
- 최소 3개의 PostgreSQL 노드
- 최소 3개의 Consul 서버 노드
- 주 데이터베이스 읽기 및 쓰기 요청을 처리하는 최소 3개의 PgBouncer 노드
- PgBouncer 노드 간의 요청을 균형잡기하기 위한 내부 로드 밸런서(TCP)
- 활성화된 Database Load Balancing
다음 IP가 예시로 사용됩니다:
-
10.6.0.21
: PostgreSQL 기본 -
10.6.0.22
: PostgreSQL 보조 1 -
10.6.0.23
: PostgreSQL 보조 2
먼저, 각 노드에 Linux GitLab 패키지를 설치해야 합니다. 단계를 따라, 단계 1에서 필요한 의존성을 설치하고 단계 2에서 GitLab 패키지 리포지터리를 추가하세요. 두 번째 단계에서 GitLab을 설치할 때 EXTERNAL_URL
값을 제공하지 않도록 주의하세요.
PostgreSQL 노드
-
PostgreSQL 노드 중 하나에 SSH로 로그인합니다.
-
PostgreSQL 사용자/암호 쌍의 암호 해시를 생성합니다. 이는
gitlab
(권장) 기본 사용자를 사용할 것으로 가정합니다. 명령은 암호와 확인을 요청할 것입니다. 이 명령에 의해 출력된 값을 다음 단계의<postgresql_password_hash>
값으로 사용하세요:sudo gitlab-ctl pg-password-md5 gitlab
-
PgBouncer 사용자/암호 쌍의 암호 해시를 생성합니다. 이는
pgbouncer
(권장) 기본 사용자를 사용할 것으로 가정합니다. 명령은 암호와 확인을 요청할 것입니다. 이 명령에 의해 출력된 값을 다음 단계의<pgbouncer_password_hash>
값으로 사용하세요:sudo gitlab-ctl pg-password-md5 pgbouncer
-
PostgreSQL 복제 사용자/암호 쌍의 암호 해시를 생성합니다. 이는
gitlab_replicator
(권장) 기본 사용자를 사용할 것으로 가정합니다. 명령은 암호와 확인을 요청할 것입니다. 이 명령에 의해 출력된 값을 다음 단계의<postgresql_replication_password_hash>
값으로 사용하세요:sudo gitlab-ctl pg-password-md5 gitlab_replicator
-
Consul 데이터베이스 사용자/암호 쌍의 암호 해시를 생성합니다. 이는
gitlab-consul
(권장) 기본 사용자를 사용할 것으로 가정합니다. 명령은 암호와 확인을 요청할 것입니다. 이 명령에 의해 출력된 값을 다음 단계의<consul_password_hash>
값으로 사용하세요:sudo gitlab-ctl pg-password-md5 gitlab-consul
-
모든 데이터베이스 노드에서
/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` 값을 클러스터의 복제 슬롯 수보다 하나 더 설정합니다. # 이는 복제가 사용 가능한 데이터베이스 연결을 모두 소진하는 것을 방지하기 위해 사용됩니다. patroni['postgresql']['max_wal_senders'] = 7 # 업그레이드 시 자동으로 데이터베이스 마이그레이션을 방지합니다 gitlab_rails['auto_migrate'] = false # Consul 에이전트 구성 consul['services'] = %w(postgresql) ## Prometheus를 위한 서비스 검색 활성화 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 ## 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
를 기본적으로 사용하여 충돌을 처리합니다. 대부분의 장애 조치 메서드와 마찬가지로, 데이터 손실 가능성이 적습니다. 자세한 내용은 다양한 Patroni 복제 방법을 참조하세요.
-
첫 번째 Linux 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하여 이 서버의 동일한 이름의 파일을 추가하거나 교체합니다. 이것이 처음 구성하는 Linux 패키지 노드라면 이 단계를 건너뛸 수 있습니다. -
변경 사항이 적용되려면 GitLab을 다시 구성하세요.
필요에 따라 지원되는 고급 구성 옵션을 추가할 수 있습니다.
PostgreSQL 사후 구성
기본 사이트의 Patroni 노드 중 하나에 SSH로 로그인합니다:
-
리더와 클러스터 상태를 확인합니다:
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 | * |
‘상태’ 열에 “running”이 아닌 경우, 계속 진행하기 전에 PostgreSQL 복제 및 장애 조치 문제 해결 섹션을 확인하세요.
PgBouncer 구성
이제 PostgreSQL 서버가 모두 설정되었으므로, 주 데이터베이스로의 읽기/쓰기를 추적하고 처리하기 위해 PgBouncer를 구성해 봅시다.
다음 IP 주소가 예시로 사용될 것입니다.
-
10.6.0.31
: PgBouncer 1 -
10.6.0.32
: PgBouncer 2 -
10.6.0.33
: PgBouncer 3
-
각 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'
-
첫 번째 Linux 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하여 이 서버의 동일한 이름의 파일에 추가하거나 대체합니다. 이것이 첫 번째로 구성하는 Linux 패키지 노드인 경우 이 단계를 건너뛸 수 있습니다. -
변경 사항이 적용되려면 GitLab을 다시 구성하세요.
만약
execute[generate databases.ini]
오류가 발생한다면, 이는 기존의 알려진 문제 때문입니다. 다음 단계 이후에 다시reconfigure
를 실행하면 해결될 것입니다. -
Consul이 PgBouncer를 다시로드할 수 있도록
.pgpass
파일을 생성하세요. 묻힐 때 두 번 PgBouncer 패스워드를 입력합니다.gitlab-ctl write-pgpass --host 127.0.0.1 --database pgbouncer --user pgbouncer --hostuser gitlab-consul
- 이전 단계의 잠재적인 오류를 해결하기 위해 GitLab을 다시 구성하세요.
-
각 노드가 현재 주 데이터베이스와 통신하도록 확인합니다.
gitlab-ctl pgb-console # PGBOUNCER_PASSWORD를 입력하세요
-
콘솔 프롬프트가 사용 가능하면, 다음 쿼리를 실행하세요.
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 구성
스케일 가능한 환경에서 Redis를 사용하는 것은 Primary x Replica 토폴로지와 Redis Sentinel 서비스를 사용하여 장애 조치 프로시저를 자동으로 시작하는 것이 가능합니다.
Redis는 Sentinel과 함께 사용될 경우 인증이 필요합니다. 자세한 내용은 Redis 보안 문서를 참조하세요. Redis 서비스를 보호하기 위해 Redis 패스워드와 엄격한 방화벽 규칙을 혼합하여 사용하는 것을 권장합니다. Redis를 GitLab과 구성하기 전에 Redis Sentinel 문서를 읽어 현토피와 아키텍처를 완전히 이해하는 것을 강력히 권장합니다.
Redis 설정 요구사항은 다음과 같습니다:
- 모든 Redis 노드는 서로 통신하고 Redis (
6379
) 및 Sentinel (26379
) 포트를 통해 들어오는 연결을 허용해야 합니다(기본값을 변경하지 않은 경우). - GitLab 응용 프로그램을 호스팅하는 서버는 Redis 노드에 액세스할 수 있어야 합니다.
- 외부 네트워크(인터넷)로부터 노드를 보호하기 위해 방화벽을 사용합니다.
이 섹션에서는 GitLab과 함께 사용하기 위해 두 개의 외부 Redis 클러스터를 구성하는 방법에 대해 안내합니다. 다음 IP 주소가 예시로 사용될 것입니다.
-
10.6.0.51
: Redis - Cache Primary -
10.6.0.52
: Redis - Cache Replica 1 -
10.6.0.53
: Redis - Cache Replica 2 -
10.6.0.61
: Redis - Persistent Primary -
10.6.0.62
: Redis - Persistent Replica 1 -
10.6.0.63
: Redis - Persistent Replica 2
자체 Redis 인스턴스 제공
다음 안내에 따라 Redis Cache 및 Persistence 인스턴스의 제3자 외부 서비스를 선택적으로 사용할 수 있습니다.
- 이에 대해 신뢰할 수 있는 프로바이더나 솔루션이 사용되어야 합니다. Google Memorystore 및 AWS ElastiCache가 작동하는 것으로 알려져 있습니다.
- Redis 클러스터 모드는 특별히 지원되지 않지만, HA가 있는 Redis Standalone은 지원됩니다.
- 설정에 따라 Redis Eviction 모드를 설정해야 합니다.
자세한 내용은 추천되는 클라우드 프로바이더 및 서비스를 참조하세요.
Redis Cache 클러스터 구성
새로운 Redis Cache 인스턴스를 설치하고 설정하는 섹션입니다.
기본 및 복제 Redis 노드는 두 번째 섹션의 Primary Redis Cache 노드와 동일한 패스워드가
redis['password']
에 정의되어야 합니다. 장애 조치 중에 언제든지
Sentinel에서 노드를 다시 구성하고 해당 노드의 상태를 Primary에서 Replica로 변경하거나 그 반대로 변경할 수 있습니다.
Primary Redis Cache 노드 구성
- Primary Redis 서버에 SSH로 연결합니다.
- 원하는 Linux 패키지를 다운로드 및 설치합니다. 해당 페이지에서 installation steps 1 and 2 만을 따르고 현재 설치와 동일한 버전 및 유형(Community 또는 Enterprise 버전)의 올바른 Linux 패키지를 선택하세요.
-
/etc/gitlab/gitlab.rb
를 편집하고 다음 내용을 추가합니다.# sentinel과 Consul 에이전트를 사용하여 서버 역할을 'redis_master_role'로 지정 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 ## 센티널 용 기본 Redis 서버의 포트. 기본값인 경우 주석 처리하지 않습니다. (Default: '6379'). #redis['master_port'] = 6379 # Redis 및 복제본용 패스워드 인증 설정(모든 노드에서 동일한 패스워드 사용). redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER' redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER' ## 모든 Redis 노드에서 같아야 함 redis['master_name'] = 'gitlab-redis-cache' ## 이 Primary 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.51:6379', 'redis.password' => '여기에 Redis 패스워드 입력', } # 업그레이드 시 자동으로 데이터베이스 마이그레이션을 방지 gitlab_rails['auto_migrate'] = false
- 첫 번째 Linux 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하여이 서버의 동일한 이름의 파일을 추가하거나 교체합니다. 이것이 구성 중인 첫 번째 Linux 패키지 노드인 경우 이 단계를 건너뛸 수 있습니다. - 변경 사항이 적용되려면 GitLab을 다시 구성하십시오.
복제된 Redis Cache 노드 구성
- 복제본 Redis 서버에 SSH로 연결합니다.
- 원하는 Linux 패키지를 다운로드 및 설치합니다. 해당 페이지에서 _installation steps 1 and 2_만을 따르고 현재 설치와 동일한 버전 및 유형(Community 또는 Enterprise 버전)의 올바른 Linux 패키지를 선택하세요.
-
/etc/gitlab/gitlab.rb
를 편집하고 이전 섹션의 primary 노드와 같은 내용을 추가하면서redis_master_node
를redis_replica_node
로 변경합니다.# sentinel 및 복제본 서버 역할로 지정 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.52' # Redis가 TCP 요청을 수신하도록 포트 정의 redis['port'] = 6379 ## 센티널 용 기본 Redis 서버의 포트. 기본값인 경우 주석 처리하지 않습니다. (Default: '6379'). #redis['master_port'] = 6379 # Redis 및 복제본용 패스워드 인증 설정(모든 노드에서 동일한 패스워드 사용). redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER' redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER' ## 모든 Redis 노드에서 같아야 함 redis['master_name'] = 'gitlab-redis-cache' ## primary 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' => '여기에 Redis 패스워드 입력', } # 업그레이드 시 자동으로 데이터베이스 마이그레이션을 방지 gitlab_rails['auto_migrate'] = false
- 첫 번째 Linux 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하여이 서버의 동일한 이름의 파일을 추가하거나 교체합니다. 이것이 구성 중인 첫 번째 Linux 패키지 노드이면이 단계를 건너뛸 수 있습니다. - 변경 사항이 적용되려면 GitLab을 다시 구성하십시오.
- 다른 복제 노드에 대해서도 다시 단계를 거치고 IP를 올바르게 설정했는지 확인하세요.
필요에 따라 고급 구성 옵션을 지원하며 추가할 수 있습니다.
Redis 영속 클러스터 구성
이 부분은 새로운 Redis 영속 인스턴스를 설치하고 설정하는 곳입니다.
주(primary) 및 복제(replica) Redis 노드는 장애 조치(failover) 중에 언제든지 Sentinel이 노드를 다시 구성하고 그 상태를 주(primary)에서 복제(replica)로 변경(그 반대도 마찬가지)할 수 있어야 합니다.
주(primary) Redis 영속 노드 구성
- Primary Redis 서버에 SSH로 로그인합니다.
- 설치 및 다운로드 페이지에서 선택한 리눅스 패키지를 설치합니다. 페이지의 설치 단계 1 및 2만 따르고, 현재 설치된 버전 및 유형(커뮤니티 또는 엔터프라이즈 버전)과 일치하는 올바른 리눅스 패키지를 선택하세요.
-
/etc/gitlab/gitlab.rb
를 편집하고 다음 내용을 추가합니다:# Sentinel 및 Consul 에이전트를 사용하여 서버 역할을 'redis_master_role'로 지정합니다. 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'로 바인딩하거나 모든 인터페이스에서 수신하는 '0.0.0.0'로도 설정할 수 있습니다. # 외부 접근이 필요한 경우, 무단 접근을 방지하기 위해 추가 방화벽 규칙을 추가해야 합니다. redis['bind'] = '10.6.0.61' # 다른 머신이 연결할 수 있도록 Redis가 TCP 요청을 수신할 수 있도록 포트를 정의합니다. redis['port'] = 6379 ## Sentinel을 위한 주(primary) Redis 서버 포트, 기본값에서 변경하려면 주석을 제거합니다. 기본값은 `6379`입니다. #redis['master_port'] = 6379 # Redis 및 복제본에 대한 암호 인증을 설정합니다(모든 노드에서 동일한 암호를 사용하세요). redis['password'] = 'SECOND_CLUSTER의 REDIS_PRIMARY_PASSWORD' redis['master_password'] = 'SECOND_CLUSTER의 REDIS_PRIMARY_PASSWORD' ## 모든 Redis 노드에서 동일해야 합니다. redis['master_name'] = 'gitlab-redis-persistent' ## 이 주(primary) 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
-
처음 리눅스 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하고, 이 서버에 동일한 이름의 파일을 추가하거나 교체합니다. 이것이 설정하는 첫 번째 리눅스 패키지 노드인 경우 이 단계를 건너뛰어도 좋습니다. - 변경 사항이 적용되도록 GitLab을 다시 구성하세요.
복제(replica) Redis 영속 노드 구성
- 복제(replica) Redis 영속 서버에 SSH로 로그인합니다.
- 설치 및 다운로드 페이지에서 선택한 리눅스 패키지를 설치합니다. 페이지의 설치 단계 1 및 2만 따르고, 현재 설치된 버전 및 유형(커뮤니티 또는 엔터프라이즈 버전)과 일치하는 올바른 리눅스 패키지를 선택하세요.
-
/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'로 바인딩하거나 모든 인터페이스에서 수신하는 '0.0.0.0'로도 설정할 수 있습니다. # 외부 접근이 필요한 경우, 무단 접근을 방지하기 위해 추가 방화벽 규칙을 추가해야 합니다. redis['bind'] = '10.6.0.62' # 다른 머신이 연결할 수 있도록 Redis가 TCP 요청을 수신할 수 있도록 포트를 정의합니다. redis['port'] = 6379 ## Sentinel을 위한 주(primary) Redis 서버 포트, 기본값에서 변경하려면 주석을 제거합니다. 기본값은 `6379`입니다. #redis['master_port'] = 6379 # 주 노드에 대한 Redis 인증에 사용하는 동일한 암호입니다. redis['password'] = 'SECOND_CLUSTER의 REDIS_PRIMARY_PASSWORD' redis['master_password'] = 'SECOND_CLUSTER의 REDIS_PRIMARY_PASSWORD' ## 모든 Redis 노드에서 동일해야 합니다. redis['master_name'] = 'gitlab-redis-persistent' # 주(primary) 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
-
처음 리눅스 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하고, 이 서버에 동일한 이름의 파일을 추가하거나 교체합니다. 이것이 설정하는 첫 번째 리눅스 패키지 노드인 경우 이 단계를 건너뛰어도 좋습니다. -
변경 사항이 적용되도록 GitLab을 다시 구성하세요.
- 다른 복제 노드에서도 위 단계를 다시 진행하고, IP를 올바르게 설정했는지 확인하세요.
필요한 경우 고급 구성 옵션을 지원하며 추가할 수 있습니다.
Gitaly 클러스터 구성
Gitaly 클러스터는 Git 리포지터리를 저장하기 위한 GitLab에서 제공하고 권장하는 고장 허용 솔루션입니다. 이 구성에서 각 Git 리포지터리는 클러스터의 모든 Gitaly 노드에 저장되며, 하나는 주 노드로 지정되며 기본 노드가 다운되면 자동 장애 조치(Failover)가 발생합니다.
Gitaly 클러스터는 고장 허용 기능을 제공하지만, 설정 및 관리의 추가 복잡성이 동반됩니다. Gitaly 클러스터를 배포하기 전에 기술적인 제한 사항과 고려해야 할 사항을 검토하세요.
가이드:
- 대신 샤드로 분할된 Gitaly를 구현하려면, 별도의 Gitaly 문서를 참고하십시오. 동일한 Gitaly 사양을 사용합니다.
- Gitaly 클러스터에서 관리되지 않는 기존 리포지터리를 이전하려면, Gitaly 클러스터로 마이그레이션을 참조하십시오.
권장 클러스터 구성에는 다음 컴포넌트가 포함됩니다:
- 3개의 Gitaly 노드: Git 리포지터리의 복제된 리포지터리.
- 3개의 Praefect 노드: Gitaly 클러스터용 라우터 및 트랜잭션 관리자.
- 1개의 Praefect PostgreSQL 노드: Praefect의 데이터베이스 서버. Praefect 데이터베이스 연결을 고가용성으로 만들기 위해 제3자 솔루션이 필요합니다.
- 1개의 로드 밸런서: Praefect에 대해 로드 밸런서가 필요합니다. 내부 로드 밸런서가 사용됩니다.
이 섹션은 순서대로 권장 표준 설정을 구성하는 방법에 대해 자세히 설명합니다. 더 고급화된 설정에 대해서는 독립 Gitaly 클러스터 문서를 참조하세요.
Praefect PostgreSQL 구성
Gitaly 클러스터의 라우팅 및 트랜잭션 관리자인 Praefect는 Gitaly 클러스터 상태 데이터를 저장하기 위해 별도의 데이터베이스 서버가 필요합니다.
고가용성(Highly Available) 설정을 원하는 경우, Praefect에는 제3자 PostgreSQL 데이터베이스가 필요합니다. 내장 솔루션이 작업 중입니다.
Praefect 비-HA PostgreSQL 독립형(Linux 패키지 사용)
다음 IP 주소는 예시로 사용됩니다:
-
10.6.0.141
: Praefect PostgreSQL
먼저, Praefect PostgreSQL 노드에 Linux GitLab 패키지를 설치하세요. 1단계의 필요한 의존성을 설치하고, 2단계에서 GitLab 패키지 리포지터리를 추가하세요. 두 번째 단계에서 GitLab을 설치할 때 EXTERNAL_URL
값을 제공하지 마십시오.
- Praefect PostgreSQL 노드에 SSH로 로그인합니다.
- Praefect PostgreSQL 사용자에게 사용할 강력한 암호를 생성합니다. 이 암호를
<praefect_postgresql_password>
로 사용할 수 있도록 기록해 두십시오. -
Praefect PostgreSQL 사용자/암호 쌍에 대한 암호 해시를 생성합니다. 이는 기본 사용자가
praefect
(추천)를 사용할 것으로 가정합니다. 명령은 비밀번호<praefect_postgresql_password>
와 확인을 요청할 것입니다. 이 명령이 출력하는 값을<praefect_postgresql_password_hash>
값으로 다음 단계에서 사용합니다:sudo gitlab-ctl pg-password-md5 praefect
-
/etc/gitlab/gitlab.rb
파일을 편집하여# START user configuration
섹션에서 값을 대체합니다:# PostgreSQL configuration roles(['postgres_role', 'consul_role']) # PostgreSQL configuration postgresql['listen_address'] = '0.0.0.0' gitlab_rails['auto_migrate'] = false # Configure the Consul agent consul['monitoring_service_discovery'] = true # START user configuration # Please set the real values as explained in Required Information section # postgresql['sql_user_password'] = "<praefect_postgresql_password_hash>" postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32) # Set the network addresses that the exporters will listen on for monitoring node_exporter['listen_address'] = '0.0.0.0:9100' postgres_exporter['listen_address'] = '0.0.0.0:9187' consul['configuration'] = { retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13), } # # END user configuration
-
이전에 구성한 첫 번째 Linux 패키지 노드의
/etc/gitlab/gitlab-secrets.json
파일을 복사하여이 서버의 동일한 이름의 파일을 추가하거나 교체합니다. 이것이 구성하는 첫 번째 Linux 패키지 노드라면이 단계를 건너 뛸 수 있습니다. -
변경 사항이 적용되려면 GitLab을 다시 구성하십시오.
- 후속 구성을 따르십시오.
Praefect HA PostgreSQL third-party solution
지정에 따르면, Praefect의 데이터베이스에 대한 서드파티 PostgreSQL 솔루션이 완전한 고가용성을 목표로 한다면 권장됩니다.
PostgreSQL HA를 위한 많은 서드파티 솔루션이 있습니다. Praefect와 함께 작동하려면 선택한 솔루션이 다음을 준수해야 합니다.
- 장애 조치(failover) 시 변경되지 않는 모든 연결을 위한 정적 IP.
-
LISTEN
SQL 기능을 지원해야 함.
이를 위해 신뢰할 수 있는 공급업체 또는 솔루션을 사용해야 합니다. Google Cloud SQL과 Amazon 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 설정 예시:
- Praefect PostgreSQL 노드에 SSH 연결합니다.
-
PostgreSQL 서버에 관리 액세스 권한으로 연결합니다. Linux 패키지에 기본적으로 추가되는
gitlab-psql
사용자를 여기에서 사용해야 합니다.template1
데이터베이스를 사용하는 이유는 모든 PostgreSQL 서버에 기본적으로 생성되기 때문입니다./opt/gitlab/embedded/bin/psql -U gitlab-psql -d template1 -h POSTGRESQL_SERVER_ADDRESS
-
<praefect_postgresql_password>
로 새로운 사용자praefect
를 생성합니다.CREATE ROLE praefect WITH LOGIN CREATEDB PASSWORD '<praefect_postgresql_password>';
-
이제
praefect
사용자로 PostgreSQL 서버에 다시 연결합니다./opt/gitlab/embedded/bin/psql -U praefect -d template1 -h POSTGRESQL_SERVER_ADDRESS
-
새 데이터베이스
praefect_production
을 생성합니다.CREATE DATABASE praefect_production WITH ENCODING=UTF8;
Praefect 구성
Praefect는 Gitaly 클러스터의 라우터 및 트랜잭션 관리자이며 모든 Gitaly와의 연결은 이를 통해 이루어집니다. 이 섹션에서는 이를 구성하는 방법을 자세하게 설명합니다.
Praefect는 클러스터 전체 통신을 보호하기 위해 몇 가지 시크릿 토큰이 필요합니다:
-
<praefect_external_token>
: Gitaly 클러스터에서 호스팅되는 리포지터리에 사용되며, 이 토큰을 지닌 Gitaly 클라이언트만 접근할 수 있습니다. -
<praefect_internal_token>
: Gitaly 클러스터 내부의 복제 트래픽에 사용됩니다. 이 토큰은praefect_external_token
과는 별도로 동작합니다. 외부 클라이언트는 Praefect 클러스터의 내부 노드에 직접 액세스해서는 안 되기 때문입니다. -
<praefect_postgresql_password>
: 이전 섹션에서 정의한 Praefect PostgreSQL 비밀번호도 이 설정의 일부로 필요합니다.
Gitaly 클러스터 노드는 가상 스토리지
를 통해 Praefect에서 구성됩니다. 각 스토리지는 클러스터를 구성하는 각 Gitaly 노드의 세부 정보를 포함합니다. 각 스토리지에는 이름이 있으며 이 이름은 구성의 여러 영역에서 사용됩니다. 이 가이드에서는 스토리지의 이름이 default
로 지정되며, 스토리지 이름을 praefect
서버의 git_data_dirs
및 Gitaly 노드인 gitaly['configuration'][:storage]
의 이름과 동일하게 지정해야 합니다.
기존 환경을 Gitaly Cluster를 사용하도록 업그레이드하는 경우 다른 이름을 사용해야 할 수 있습니다.
더 많은 정보는 Praefect 문서를 참조하세요.
다음 IP 주소는 예시로 사용될 것입니다:
-
10.6.0.131
: Praefect 1 -
10.6.0.132
: Praefect 2 -
10.6.0.133
: Praefect 3
Praefect 노드를 구성하는 방법은 다음과 같습니다: 각 Praefect 노드에서:
- Praefect 서버에 SSH 연결합니다.
- 필요한 경우, 선택한 Linux 패키지를 다운로드하고 설치합니다. 페이지의 설치 단계 1, _2_만 따르도록 합니다.
-
Praefect를 구성하려면
/etc/gitlab/gitlab.rb
파일을 편집합니다.# 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 설정 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 Virtual Storage 구성 # Storage 항목의 이름은 GitLab 서버('praefect')의 git_data_dirs 및 Gitaly 노드('gitaly-1')의 gitaly['configuration'][:storage]에서 사용되어야 하는 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 주소 ## IP 주소뿐만 아니라 FQDN을 사용하고 섞어서 사용할 수 있습니다 consul['configuration'] = { retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13), } # # 사용자 구성 끝
-
첫 번째 Linux 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하여 이 서버의 해당 파일에 추가하거나 대체합니다. 이것이 첫 번째 Linux 패키지 노드를 설정하는 경우에는 이 단계를 건너뛰어도 됩니다. -
Praefect는 주 데이터베이스 응용 프로그램과 마찬가지로 데이터베이스 마이그레이션을 실행해야 합니다. 따라서 마이그레이션을 실행할 Praefect 노드를 선택하여 한 번만 실행해야 합니다. 이 노드를 _배포 노드_로 지정합니다. 이 노드를 설정하기 전에 다음과 같이 변경해야 합니다:
-
/etc/gitlab/gitlab.rb
파일에서praefect['auto_migrate']
설정 값을false
에서true
로 변경합니다. -
업그레이드 시 자동으로 데이터베이스 마이그레이션을 실행하지 않도록 하려면 다음을 실행합니다:
sudo touch /etc/gitlab/skip-auto-reconfigure
- 변경 사항을 적용하고 Praefect 데이터베이스 마이그레이션을 실행하려면 GitLab을 다시 구성하세요.
-
- 다른 Praefect 노드에서 변경 사항을 적용하려면 GitLab을 다시 구성하세요.
Gitaly 구성
클러스터를 이루는 Gitaly 서버 노드는 데이터와 부하에 따라 요구 사항이 달라집니다.
Gitaly는 상당한 입력 및 출력 요구 사항이 있으므로, 모든 Gitaly 노드에서는 반드시 SSD(Solid State Drive)를 사용하는 것을 권장합니다. 이 SSD는 읽기 작업에 대해 최소 8,000 IOPS 및 쓰기 작업에 대해 2,000 IOPS의 처리량을 가져야 합니다. 환경을 클라우드 제공업체에서 실행 중이라면, 해당 업체의 문서를 참조하여 IOPS를 올바르게 구성해야 합니다.
Gitaly 서버는 기본적으로 암호화되지 않은 Gitaly의 네트워크 트래픽으로 인해 외부 인터넷에 노출되어서는 안됩니다. 방화벽의 사용을 강력히 권장하며, 또 다른 옵션은 TLS 사용하는 것입니다.
Gitaly 구성을 위해 다음 사항을 주의해야 합니다:
-
gitaly['configuration'][:storage]
는 특정 Gitaly 노드의 저장 경로를 반영하도록 구성되어야 합니다. -
auth_token
은praefect_internal_token
과 동일해야 합니다.
다음은 예시로 사용될 IP 주소입니다:
-
10.6.0.91
: Gitaly 1 -
10.6.0.92
: Gitaly 2 -
10.6.0.93
: Gitaly 3
각 노드에서:
- 선택한 Linux 패키지를 다운로드하고 설치하세요. 페이지에서 설치 단계 1과 2만 따르고
EXTERNAL_URL
값을 제공하지 않도록 주의하십시오. -
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 Auth 토큰 # 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, }, } # # 사용자 구성 끝
- 각 해당 서버의
/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', }, ], }
-
-
첫 번째 Linux 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하고 이 서버의 동일한 이름의 파일을 추가하거나 교체하세요. 이것이 구성 중인 첫 번째 Linux 패키지 노드인 경우 이 단계를 건너뛸 수 있습니다. - 파일을 저장한 후 GitLab 구성을 다시 설정하세요.
Gitaly Cluster TLS 지원
Praefect는 TLS 암호화를 지원합니다. 안전한 연결을 수신 대기하는 Praefect 인스턴스와 통신하려면 다음 단계를 따라야 합니다:
- GitLab 구성에서 해당 리포지터리 엔트리의
gitaly_address
에tls://
URL 스키마를 사용합니다. - 자체 인증서를 가져와야 합니다. 이는 자동으로 제공되지 않습니다. 각 Praefect 서버에 해당하는 인증서를 설치해야 합니다.
또한, 인증서 또는 해당 인증서 기관은 모든 Gitaly 서버 및 Praefect 클라이언트에 설치되어야 하며, 설명된 절차를 따라 통신해야 합니다. GitLab 사용자 정의 인증서 구성을 참조하세요.
다음 사항을 참고하세요:
- 인증서는 Praefect 서버에 액세스하는 데 사용하는 주소를 지정해야 합니다. 호스트 이름 또는 IP 주소를 인증서의 대체 이름(Subject Alternative Name)으로 추가해야 합니다.
- Praefect 서버를 암호화되지 않는 수신 대기 주소
listen_addr
와 암호화된 수신 대기 주소tls_listen_addr
로 구성할 수 있습니다. 필요한 경우, 이는 암호화되지 않은 트래픽에서 암호화된 트래픽으로 순환적으로 전환할 수 있게 합니다. 암호화되지 않은 수신 대기를 비활성화하려면praefect['configuration'][:listen_addr] = nil
로 설정합니다. - 내부 로드 밸런서도 인증서에 액세스해야 하며 TLS 통과를 허용하도록 구성해야 합니다. 이에 대한 구성 방법은 로드 밸런서 문서를 참조하세요.
TLS로 Praefect를 구성하려면 다음을 수행하세요:
-
Praefect 서버용 인증서를 생성합니다.
-
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
-
/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', }, }
-
파일을 저장하고 GitLab을 다시 구성합니다.
-
Praefect 클라이언트(각 Gitaly 서버 포함)에서 인증서 또는 해당 인증서 기관을
/etc/gitlab/trusted-certs
에 복사합니다:sudo cp cert.pem /etc/gitlab/trusted-certs/
-
Praefect 클라이언트(Gitaly 서버 제외)에서
/etc/gitlab/gitlab.rb
에서git_data_dirs
를 다음과 같이 편집합니다:git_data_dirs({ "default" => { "gitaly_address" => 'tls://로드밸런서_서버_주소:3305', "gitaly_token" => 'PRAEFECT_EXTERNAL_TOKEN' } })
-
파일을 저장하고 GitLab을 다시 구성합니다.
Sidekiq 구성
Sidekiq는 Redis, PostgreSQL 및 Gitaly 인스턴스에 연결이 필요합니다. 또한 권장된대로 Object Storage에 연결해야 합니다.
-
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 노드를 구성하려면 각 노드에서 다음을 수행하세요:
- Sidekiq 서버에 SSH로 로그인합니다.
- 사용중인 Linux 패키지를 다운로드 및 설치합니다. 페이지의 설치 단계 1 및 2만 따르도록 주의하세요.
-
/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>@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>' 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 Cluster ## 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'] # Object Storage ## 이는 GCP에서 Object Storage를 구성하는 예제입니다 ## 원하는대로 선택한 Object Storage 제공업체로 이 구성을 대체하세요 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>' }
-
처음 구성한 Linux 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하고 이 서버에서 파일을 추가하거나 교체합니다. 이가 처음 구성 중인 Linux 패키지 노드인 경우 이 단계를 건너뛰어도 됩니다. -
업그레이드 시 자동으로 데이터베이스 마이그레이션을 실행하지 않도록 하려면 다음을 실행합니다:
sudo touch /etc/gitlab/skip-auto-reconfigure
GitLab을 다시 구성하여 변경 사항을 적용합니다.
GitLab Rails 구성
이 섹션에서는 GitLab 애플리케이션(Rails) 구성 방법을 설명합니다.
Rails는 Redis, PostgreSQL 및 Gitaly 인스턴스에 연결을 필요로 합니다. 또한 권장 사항으로 Object Storage에 대한 연결이 필요합니다.
다음 IP가 예시로 사용됩니다:
-
10.6.0.111
: GitLab 애플리케이션 1 -
10.6.0.112
: GitLab 애플리케이션 2 -
10.6.0.113
: GitLab 애플리케이션 3
각 노드에서 다음을 수행하세요:
-
선택한 Linux 패키지를 다운로드하고 설치합니다. 페이지의 설치 단계 1과 2를 따로 따르십시오.
-
/etc/gitlab/gitlab.rb
를 편집하고 다음 구성을 사용합니다. 노드 전체에서 링크의 일관성을 유지하려면 응용 프로그램 서버의external_url
이 사용자가 GitLab에 액세스하는 데 사용할 외부 URL을 가리키도록 해야 합니다. 이것은 GitLab 애플리케이션 서버로 트래픽을 라우팅할 외부 로드 밸런서의 URL일 것입니다.external_url 'https://gitlab.example.com' # git_data_dirs get configured for the Praefect virtual storage # Address is Internal Load Balancer for Praefect # Token is praefect_external_token git_data_dirs({ "default" => { "gitaly_address" => "tcp://10.6.0.40:2305", # 내부 로드 밸런서 IP "gitaly_token" => '<praefect_external_token>' } }) ## 응용 프로그램 서버에 없는 컴포넌트 비활성화 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 IPs # 업그레이드 시 데이터베이스 마이그레이션이 자동으로 실행되지 않도록 함 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'] ############################# ### Object storage ### ############################# # 이것은 GCP에서 Object Storage를 구성하는 예제입니다 # 원하는 대로 선택한 Object Storage 공급자로 이 구성을 대체하십시오 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>' }
-
Gitaly에 TLS 지원을 사용하는 경우,
git_data_dirs
항목이tls
대신tcp
로 구성되었는지 확인하세요:git_data_dirs({ "default" => { "gitaly_address" => "tls://10.6.0.40:2305", # 내부 로드 밸런서 IP "gitaly_token" => '<praefect_external_token>' } })
-
/etc/gitlab/trusted-certs
로 인증서를 복사하세요:sudo cp cert.pem /etc/gitlab/trusted-certs/
-
- 첫 번째 Linux 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하고 이 서버의 같은 이름의 파일을 추가하거나 대체하세요.이게 당신이 구성하는 첫 번째 Linux 패키지 노드인 경우에는 이 단계를 건너뛸 수 있습니다. - 첫 번째 Linux 패키지 노드에서 SSH 호스트 키(
/etc/ssh/ssh_host_*_key*
형식의 모든 파일)를 복사하고 이 서버의 같은 이름의 파일을 추가하거나 대체하세요. 이를 통해 사용자들이 로드 밸런스된 Rails 노드에 액세스하는 동안 호스트 불일치 오류가 발생하지 않도록 합니다. 이게 당신이 구성하는 첫 번째 Linux 패키지 노드인 경우에는 이 단계를 건너뛸 수 있습니다. -
데이터베이스 마이그레이션은 업그레이드 시 자동으로 실행되지 않고 reconfigure 중에만 실행되도록 하려면 다음 명령을 실행하세요:
sudo touch /etc/gitlab/skip-auto-reconfigure
설계된 단일 노드만이 GitLab Rails 사후 구성 섹션에 설명된 대로 마이그레이션을 처리해야 합니다.
- 변경사항이 적용되려면 GitLab을 다시 구성하세요.
- 증분 로깅을 활성화하세요.
-
노드가 Gitaly에 연결할 수 있는지 확인하세요:
sudo gitlab-rake gitlab:gitaly:check
그런 다음 요청을 보려면 로그를 관찰하세요:
sudo gitlab-ctl tail gitaly
- 선택 사항으로 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
실행
- GitLab 15.3 이상의 경우
external_url
에 https
를 지정한 경우 앞의 예와 같이, GitLab은 SSL 인증서가 /etc/gitlab/ssl/
에 있을 것으로 예상합니다. 인증서가 없는 경우 NGINX가 시작하지 않습니다. 자세한 정보는 HTTPS 문서를 참조하세요.
GitLab Rails 포스트 구성
-
설치 및 업데이터 중 데이터베이스 마이그레이션을 실행할 응용프로그램 노드를 지정하세요. GitLab 데이터베이스를 초기화하고 모든 마이그레이션이 실행되었는지 확인하세요:
sudo gitlab-rake gitlab:db:configure
Rails 노드가 주 데이터베이스에 직접 연결하도록 구성되어 있어야 하며, PgBouncer 우회해야 합니다. 마이그레이션이 완료되면 노드를 다시 PgBouncer를 거치도록 구성해야 합니다.
-
데이터베이스에서 SSH 키를 빠르게 조회하도록 구성하세요(../operations/fast_ssh_key_lookup.md).
프로메테우스 구성
Linux 패키지를 사용하여 독립 실행형 모니터링 노드를 구성할 수 있습니다. 이 노드에서 프로메테우스를 실행하세요.
다음 IP를 예시로 사용합니다:
-
10.6.0.151
: 프로메테우스
모니터링 노드를 구성하려면:
- 모니터링 노드에 SSH로 로그인하세요.
-
선택한 Linux 패키지를 다운로드하고 설치하세요. 페이지에서 설치 단계 1과 2만 따르도록 해야 합니다.
-
/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
- 변경 사항이 적용되려면 GitLab을 다시 구성하세요.
객체 리포지터리 구성
GitLab은 다양한 유형의 데이터를 저장하는 데 객체 리포지터리 서비스를 사용할 수 있습니다. 이는 대규모 설정에서 NFS(../nfs.md)보다 권장되며 보통 성능, 신뢰성, 확장성 면에서 훨씬 우수합니다. 자세한 내용은 권장 클라우드 제공업체 및 서비스를 참조하세요.
GitLab에서 객체 리포지터리 구성을 지정하는 두 가지 방법이 있습니다:
가능한 경우 통합된 형식이 사용됩니다.
각 데이터 유형에 대해 별도의 버킷을 사용하는 것이 GitLab에서 권장하는 방법입니다. 이로써 GitLab이 저장하는 다양한 유형의 데이터 간 충돌이 없도록 보장할 수 있습니다. 미래에는 단일 버킷 사용을 허용할 계획입니다.
증분 로깅 활성화
GitLab Runner는 작업 로그를 청크 단위로 반환하며, 리눅스 패키지는 기본적으로 일시적으로 /var/opt/gitlab/gitlab-ci/builds
에 캐시합니다. 기본 구성에서는 이 디렉터리를 NFS를 통해 GitLab Rails 및 Sidekiq 노드에서 공유해야 합니다.
NFS를 통해 작업 로그를 공유하는 것은 지원되지만, NFS 노드를 배포하지 않는 경우 증분 로깅을 활성화하는 것이 좋습니다(개발되지 않은 경우). 증분 로깅은 임시로 작업 로그를 디스크 공간 대신에 Redis를 사용하여 캐싱합니다.
고급 검색 구성
Elasticsearch를 활용하여 전체 GitLab 인스턴스에서 더 빠르고 더 고급스러운 코드 검색을 가능하게 하는 고급 검색 활성화가 가능합니다.
Elasticsearch 클러스터 설계 및 요구 사항은 특정 데이터에 따라 달라집니다. 인스턴스 옆에 Elasticsearch 클러스터를 설정하는 좋은 방법에 대한 권장 사항을 확인하려면 최적의 클러스터 구성을 선택하는 안내를 읽어보세요.
클라우드 네이티브 하이브리드 참조 아키텍처 Helm 차트(대안)
GitLab Helm 차트를 사용하여 Kubernetes에서 클라우드 네이티브 GitLab의 선택 컴포넌트를 실행합니다. 이 설정에서, 웹 서비스라고 불리는 Kubernetes 클러스터에 GitLab Rails의 동등한 버전을 실행할 수 있습니다. 또한, 사이드킥 노드의 동등 버전을 Sidekiq라고 불리는 Kubernetes 클러스터에서 실행할 수 있습니다. 또한, 다음과 같은 다른 지원 서비스들이 지원됩니다: NGINX, Toolbox, 마이그레이션, Prometheus, Grafana.
하이브리드 설치는 클라우드 네이티브 및 전통적인 컴퓨팅 배포의 이점을 활용합니다. 이를 통해 상태 유지되지 않는 컴포넌트는 클라우드 네이티브 워크로드 관리의 이점을 누리는 반면, 상태 유지되는 컴포넌트는 Linux 패키지 설치를 통해 컴퓨팅 VM에서 배포되어 증가된 지속성의 이점을 누릅니다.
Helm 차트 고급 구성 문서에서는 Kubernetes와 백엔드 컴포넌트 간에 동기화할 GitLab 비밀을 안내하는 설정 지침을 참조하십시오.
클러스터 토폴로지
다음 표 및 다이어그램은 동일한 형식으로 전형적인 환경을 사용하여 하이브리드 환경을 설명합니다.
먼저, Kubernetes에서 실행되는 컴포넌트들입니다. 이들은 여러 노드 그룹에 걸쳐 실행되지만, 최소 CPU 및 메모리 요구 사항을 준수하면서 원하는대로 전반적인 구성을 변경할 수 있습니다.
서비스 노드 그룹 | 노드 수 | 구성 | GCP | AWS | 최소 할당 가능 CPU 및 메모리 |
---|---|---|---|---|---|
웹서비스 | 4 | 32 vCPU, 28.8 GB 메모리 | n1-highcpu-32
| c5.9xlarge
| 127.5 vCPU, 118 GB 메모리 |
사이드킥 | 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)을 사용합니다. 다른 Kubernetes 서비스도 작동할 수 있지만 실제 성과는 달라질 수 있습니다.
- 노드 구성은 성능 테스트 중에 포드 vCPU/메모리 비율을 강제하기 때문에 표시됩니다.
- 프로덕션 배포에서는 특정 노드에 pod을 할당할 필요가 없습니다. 세 가지 다른 가용 영역에 각각 최소한 세 개의 노드를 권장하여 강력한 클라우드 아키텍처 관행과 일치시키는 것이 강력히 권장됩니다.
다음은 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 - 캐시2 | 3 | 4 vCPU, 15 GB 메모리 | n1-standard-4
| m5.xlarge
|
Redis/Sentinel - 지속적2 | 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
|
객체 리포지터리4 | - | - | - | - |
각주:
- 명성있는 타사 외부 PaaS PostgreSQL 솔루션에서 선택적으로 실행할 수 있습니다. 자세한 정보는 자체 PostgreSQL 인스턴스 제공 및 권장 클라우드 제공자 및 서비스를 참조하십시오.
- 명성있는 타사 외부 PaaS Redis 솔루션에서 선택적으로 실행할 수 있습니다. 자세한 정보는 자체 Redis 인스턴스 제공 및 권장 클라우드 제공자 및 서비스를 참조하십시오.
- 레디스는 주로 단일 스레드이며 CPU 코어 증가로 인한 혜택이 크지 않습니다. 이 크기의 아키텍처의 경우 최적의 성능을 얻기 위해 별도의 캐시 및 지속적인 인스턴스를 분리하는 것이 강력히 추천됩니다.
- 명성 있는 타사 로드 밸런서 또는 서비스(LB PaaS)에서 실행하는 것이 권장됩니다. HA 기능을 제공할 수 있습니다. 또한 크기 조정은 선택한 로드 밸런서와 네트워크 대역폭 등 추가 요소에 따라 다를 수 있습니다. 자세한 내용은 로드 밸런서를 참조하십시오.
- 명성 있는 클라우드 제공자 또는 Self-managed 솔루션에서 실행해야 합니다. 자세한 내용은 객체 리포지터리 구성를 참조하십시오.
- Gitaly 클러스터는 고장 허용성의 이점을 제공하지만 해당 설정과 관리의 복잡성이 더해집니다.
Gitaly 클러스터를 배포하기 전의 기술적 제한사항 및 고려 사항을 검토하십시오. 샤드로 구성된 Gitaly를 원하는 경우,
Gitaly
에 대해 위에서 나열된 동일한 사양을 사용하십시오. - Gitaly 사양은 사용 패턴 및 리포지터리 크기의 높은 백분위에 기반합니다. 그러나 대형 단일 리포지터리(여러 기가바이트보다 큰) 또는 추가 워크로드가 있는 경우 Git 및 Gitaly의 성능에 상당한 영향을 미칠 수 있으며 추가적인 조정이 필요할 가능성이 높습니다.
리소스 사용량 설정
다음 공식들은 리소스 제한 내에서 배포될 수 있는 파드 수를 계산하는 데 도움이 됩니다. 10k 참조 아키텍처 예제 값 파일 은 Helm 차트에 계산된 구성을 적용하는 방법을 문서화합니다.
웹 서비스
일반적으로 웹 서비스 파드는 각 워커 당 약 1 CPU와 1.25 GB의 메모리가 필요합니다. 각 웹 서비스 파드는 기본적으로 4개의 워커 프로세스가 생성되며 각 파드에는 다른 작은 프로세스가 실행되므로 권장된 토폴로지를 사용하면 대략 4 CPU와 5 GB의 메모리를 소비합니다.
10,000 사용자의 경우 대략 80개의 총 Puma 워커 수를 권장합니다. 제공된 권장 사항에 따르면 각 파드 당 4개의 워커와 각 노드 당 5개의 파드를 최대 20개까지 배포할 수 있습니다. 추가 웹 서비스 파드마다 각 워커 프로세스 당 1 CPU에서 1.25 GB의 메모리 비율을 이용하여 사용 가능한 리소스를 확장하세요.
리소스 사용에 대한 자세한 정보는 웹 서비스 리소스를 참조하십시오.
Sidekiq
일반적으로 Sidekiq 파드는 0.9 CPU와 2GB 메모리가 필요합니다.
제공된 시작점에 따라 최대 14개의 Sidekiq 파드를 배포할 수 있습니다. 추가 파드마다 0.9 CPU에서 2GB 메모리 비율을 사용하여 사용 가능한 리소스를 확장하세요.
리소스 사용에 대한 자세한 정보는 Sidekiq 리소스를 참조하십시오.
Supporting
지원 노드 풀은 웹 서비스 및 Sidekiq 풀에 있을 필요가 없는 모든 지원 배포물을 수용할 수 있도록 설계되었습니다.
이에는 클라우드 공급업체 구현 및 지원 GitLab 배포물(예: NGINX 또는 GitLab Shell)과 관련된 여러 배포물이 포함됩니다.
Monitoring과 같은 추가 배포물을 원하는 경우 가능한 경우 웹 서비스 또는 Sidekiq 풀이 아닌 지원 풀에 배포하는 것이 좋습니다. 지원 풀은 몇 가지 추가 배포물을 수용하도록 특별히 설계되었으므로, 주어진 풀에 맞지 않는 배포물이더라도 노드 풀을 적절히 늘릴 수 있습니다.
Secrets
클라우드 네이티브 하이브리드 환경을 설정할 때, 백엔드 VM에서 Kubernetes로 /etc/gitlab/gitlab-secrets.json
파일에서 동기화해야 하는 비밀들이 몇 가지 있음을 언급할 가치가 있습니다.
특히 이 설정에서 GitLab Rails과 GitLab Shell 비밀을 동기화해야 합니다.