- 요구 사항
- 테스트 방법론
- 구성 요소 설정
- 외부 로드 밸런서 구성
- 내부 로드 밸런서 구성
- Consul 구성
- PostgreSQL 구성
- Redis 구성
- Gitaly 클러스터 구성
- Sidekiq 구성
- GitLab Rails 구성
- Prometheus 구성
- 객체 저장소 구성
- 고급 검색 구성
- 사용자 수가 적은 경우의 지원되는 수정 사항 (HA)
- Helm 차트를 사용한 클라우드 네이티브 하이브리드 참조 아키텍처 (대안)
- 다음 단계
참조 아키텍처: 최대 60 RPS 또는 3,000 사용자
이 페이지는 실제 데이터를 기반으로 수동 및 자동을 포함하여 최대 3,000명의 사용자의 일반적인 최대 부하인 초당 60개의 요청(RPS)을 목표로 하는 GitLab 참조 아키텍처를 설명합니다.
이 아키텍처는 고가용성(HA)이 내장된 가장 작은 아키텍처입니다. HA가 필요하지만 사용자 수가 적거나 총 부하가 낮은 경우 HA를 유지하면서 이 아키텍처의 크기를 줄이는 방법은 더 낮은 사용자 수를 위한 지원 수정 섹션을 참조하세요.
전체 참조 아키텍처 목록은 사용 가능한 참조 아키텍처를 참조하세요.
- 대상 부하: API: 60 RPS, 웹: 6 RPS, Git (Pull): 6 RPS, Git (Push): 1 RPS
- 고가용성: 예, 다만 Praefect는 서드파티 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 | 2 vCPU, 7.5 GB 메모리 | n1-standard-2 |
m5.large |
D2s v3 |
PgBouncer1 | 3 | 2 vCPU, 1.8 GB 메모리 | n1-highcpu-2 |
c5.large |
F2s v2 |
내부 로드 밸런서3 | 1 | 4 vCPU, 3.6 GB 메모리 | n1-highcpu-4 |
c5n.xlarge |
F4s v2 |
Redis/Sentinel2 | 3 | 2 vCPU, 7.5 GB 메모리 | n1-standard-2 |
m5.large |
D2s v3 |
Gitaly5 | 3 | 4 vCPU, 15 GB 메모리6 | n1-standard-4 |
m5.xlarge |
D4s v3 |
Praefect5 | 3 | 2 vCPU, 1.8 GB 메모리 | n1-highcpu-2 |
c5.large |
F2s v2 |
Praefect PostgreSQL1 | 1+ | 2 vCPU, 1.8 GB 메모리 | n1-highcpu-2 |
c5.large |
F2s v2 |
Sidekiq7 | 2 | 4 vCPU, 15 GB 메모리 | n1-standard-4 |
m5.xlarge |
D2s v3 |
GitLab Rails7 | 3 | 8 vCPU, 7.2 GB 메모리 | n1-highcpu-8 |
c5.2xlarge |
F8s v2 |
모니터링 노드 | 1 | 2 vCPU, 1.8 GB 메모리 | n1-highcpu-2 |
c5.large |
F2s v2 |
객체 저장소4 | - | - | - | - | - |
각주:
1. 신뢰할 수 있는 서드파티 외부 PaaS PostgreSQL 솔루션에서 선택적으로 실행할 수 있습니다. 자세한 내용은 자신의 PostgreSQL 인스턴스를 제공하세요를 참조하세요.
2. 신뢰할 수 있는 서드파티 외부 PaaS Redis 솔루션에서 선택적으로 실행할 수 있습니다. 자세한 내용은 자신의 Redis 인스턴스를 제공하세요를 참조하세요.
3. 신뢰할 수 있는 서드파티 로드 밸런서 또는 서비스(LB PaaS)와 함께 실행하는 것이 좋습니다. 이는 HA 기능을 제공합니다.
크기는 선택한 로드 밸런서 및 네트워크 대역폭과 같은 추가 요소에 따라 다릅니다. 자세한 내용은 로드 밸런서를 참조하세요.
4. 신뢰할 수 있는 클라우드 제공업체 또는 자체 관리 솔루션에서 실행해야 합니다. 자세한 내용은 객체 저장소 구성하기를 참조하세요.
5. Gitaly 클러스터는 내결함성의 이점을 제공하지만 설정 및 관리의 추가 복잡성이 따릅니다.
Gitaly 클러스터 배포 전에 기존 기술적 제한 사항과 고려 사항을 검토하세요. 샤딩된 Gitaly가 필요한 경우 위에 나열된 Gitaly
와 동일한 사양을 사용하세요.
6. 상태 저장 데이터가 없으므로 자기 조정 그룹(ASG)에 배치할 수 있습니다.
그러나 클라우드 네이티브 하이브리드 설정이 일반적으로 선호됩니다.
일부 구성 요소(예: 이주 및 메일룸)는 하나의 노드에서만 실행될 수 있으며 이는 Kubernetes에서 더 잘 처리됩니다.
참고:
모든 PaaS 솔루션을 통해 인스턴스를 구성할 때는 내결함성 클라우드 아키텍처 관행에 따라 세 가지 다른 가용 영역에 최소 3개의 노드를 구현하는 것이 좋습니다.
요구 사항
시작하기 전에 참조 아키텍처에 대한 요구 사항을 확인하세요.
테스트 방법론
3k 아키텍처는 대다수의 워크플로우를 커버하도록 설계되었으며, 정기적으로
Test Platform 팀에 의해 다음의 엔드포인트 처리량 목표에 대해 스모크 및 성능 테스트를 수행합니다:
- API: 60 RPS
- Web: 6 RPS
- Git (Pull): 6 RPS
- Git (Push): 1 RPS
위의 목표는 사용자 수에 해당하는 총 환경 부하의 실제 고객 데이터에 기반하여 선택되었습니다.
CI 및 다른 워크로드를 포함합니다.
위의 엔드포인트 목표에 대해 정기적으로 더 높은 처리량이 있다고 제안할 수 있는 메트릭스가 있는 경우,
대규모 모노레포 또는 주목할 만한 추가 워크로드는 성능 환경에 주목할 만한 영향을 미칠 수 있으며,
추가 조정이 필요할 수 있습니다.
이 경우, 링크된 문서를 참고하고 고객 성공 관리자 또는 지원 팀에 연락하여 추가 안내를 받는 것을 강력히 권장합니다.
테스트는 누구나 사용할 수 있는 데이터 세트와 함께 GitLab 성능 도구(GPT)를 사용하여 정기적으로 수행됩니다.
이 테스트의 결과는 GPT 위키에서 공개적으로 제공됩니다.
테스트 전략에 대한 자세한 내용은 문서의 이 섹션을 참조하세요.
테스트에 사용된 로드 밸런서는 Linux 패키지 환경을 위한 HAProxy 또는 클라우드 네이티브 하이브리드를 위한 NGINX Ingress와 같은 동등한 클라우드 공급자 서비스입니다.
이 선택은 특정 요구 사항이나 권장 사항을 나타내지 않으며 대부분의 신뢰할 수 있는 로드 밸런서는 작동할 것으로 예상됩니다.
구성 요소 설정
60 RPS 또는 3,000 사용자를 수용하도록 GitLab 및 그 구성 요소를 설정하려면:
-
외부 로드 밸런서 구성
GitLab 애플리케이션 서비스 노드의 로드 밸런싱을 처리합니다. -
내부 로드 밸런서 구성
GitLab 애플리케이션 내부 연결의 로드 밸런싱을 처리합니다. -
Consul 구성
서비스 디스커버리 및 상태 체크를 위한 것입니다. -
PostgreSQL 구성
GitLab의 데이터베이스입니다. -
PgBouncer 구성
데이터베이스 연결 풀링 및 관리를 위한 것입니다. -
Redis 구성
세션 데이터, 임시 캐시 정보, 및 백그라운드 작업 큐를 저장합니다. -
Gitaly 클러스터 구성
Git 리포지토리에 대한 접근을 제공합니다. -
Sidekiq 구성
백그라운드 작업 처리를 위한 것입니다. -
주 GitLab Rails 애플리케이션 구성
Puma, Workhorse, GitLab Shell을 실행하고 모든 프런트엔드 요청(UI, API, Git over HTTP/SSH 포함)을 제공합니다. -
Prometheus 구성
GitLab 환경을 모니터링합니다. -
객체 저장소 구성
공유 데이터 객체에 사용됩니다. -
고급 검색 구성 (선택 사항)
전체 GitLab 인스턴스에서 더 빠르고 고급 코드 검색을 위해 사용됩니다.
서버는 동일한 10.6.0.0/24 개인 네트워크 범위 내에서 시작되며,
이 주소에서 서로 자유롭게 연결할 수 있습니다.
다음 목록은 각 서버에 대한 설명과 할당된 IP를 포함합니다:
-
10.6.0.10
: 외부 로드 밸런서 -
10.6.0.11
: Consul/Sentinel 1 -
10.6.0.12
: Consul/Sentinel 2 -
10.6.0.13
: Consul/Sentinel 3 -
10.6.0.21
: PostgreSQL 기본 -
10.6.0.22
: PostgreSQL 보조 1 -
10.6.0.23
: PostgreSQL 보조 2 -
10.6.0.31
: PgBouncer 1 -
10.6.0.32
: PgBouncer 2 -
10.6.0.33
: PgBouncer 3 -
10.6.0.20
: 내부 로드 밸런서 -
10.6.0.61
: Redis 기본 -
10.6.0.62
: Redis 복제 1 -
10.6.0.63
: Redis 복제 2 -
10.6.0.51
: Gitaly 1 -
10.6.0.52
: Gitaly 2 -
10.6.0.93
: Gitaly 3 -
10.6.0.131
: Praefect 1 -
10.6.0.132
: Praefect 2 -
10.6.0.133
: Praefect 3 -
10.6.0.141
: Praefect PostgreSQL 1 (비 HA) -
10.6.0.71
: Sidekiq 1 -
10.6.0.72
: Sidekiq 2 -
10.6.0.41
: GitLab 애플리케이션 1 -
10.6.0.42
: GitLab 애플리케이션 2 -
10.6.0.43
: GitLab 애플리케이션 3 -
10.6.0.81
: Prometheus
외부 로드 밸런서 구성
다중 노드 GitLab 구성에서는 애플리케이션 서버로 트래픽을 라우팅하기 위해 외부 로드 밸런서가 필요합니다.
어떤 로드 밸런서를 사용할지 또는 그 정확한 구성에 대한 세부 사항은 GitLab 문서의 범위를 벗어나지만, 로드 밸런서에 대한 일반 요구 사항에 대한 더 많은 정보를 참조하세요. 이 섹션은 선택한 로드 밸런서에 대해 구성할 사항의 세부 사항에 집중합니다.
준비 확인
외부 로드 밸런서가 작동하는 서비스에만 라우팅되도록 하세요. 모니터링 엔드포인트가 내장되어 있어야 합니다. 준비 확인은 모두 체크되는 노드에 대해 추가 구성을 요구합니다. 그렇지 않으면 외부 로드 밸런서가 연결할 수 없습니다.
포트
사용해야 할 기본 포트는 아래 표에 나와 있습니다.
LB 포트 | 백엔드 포트 | 프로토콜 |
---|---|---|
80 | 80 | HTTP (1) |
443 | 443 | TCP 또는 HTTPS (1) (2) |
22 | 22 | TCP |
-
(1): 웹 터미널 지원은 로드 밸런서가 WebSocket 연결을 올바르게 처리해야 합니다. HTTP 또는 HTTPS 프록시를 사용할 때, 이는 로드 밸런서가
Connection
및Upgrade
홉-바이-홉 헤더를 통과하도록 구성해야 함을 의미합니다. 더 많은 세부 사항은 웹 터미널 통합 가이드를 참조하세요. -
(2): 443 포트에 HTTPS 프로토콜을 사용할 경우, 로드 밸런서에 SSL 인증서를 추가해야 합니다. 대신 GitLab 애플리케이션 서버에서 SSL을 종료하려면 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를 개방하는 것에 대한 정책이 있습니다. 이 경우, 사용자가 포트 443에서 SSH를 사용할 수 있도록 하는 대체 SSH 호스트 이름을 구성하는 것이 도움이 될 수 있습니다. 대체 SSH 호스트 이름은 위의 다른 GitLab HTTP 구성과 비교하여 새 가상 IP 주소가 필요합니다.
altssh.gitlab.example.com
과 같은 대체 SSH 호스트 이름을 위해 DNS를 구성하세요.
LB 포트 | 백엔드 포트 | 프로토콜 |
---|---|---|
443 | 22 | TCP |
SSL
다음 질문은 환경에서 SSL을 어떻게 처리할 것인지입니다.
여러 가지 옵션이 있습니다:
- 애플리케이션 노드에서 SSL 종료.
- 로드 밸런서가 백엔드 SSL 없이 SSL 종료 이 경우 로드 밸런서와 애플리케이션 노드 간의 통신은 안전하지 않습니다.
- 로드 밸런서가 백엔드 SSL과 함께 SSL 종료 이 경우 로드 밸런서와 애플리케이션 노드 간의 통신은 안전합니다.
애플리케이션 노드에서 SSL 종료
로드 밸런서를 구성하여 포트 443에서의 연결을 TCP
프로토콜로 전달하도록 설정하십시오.
이렇게 하면 애플리케이션 노드의 NGINX 서비스에 연결이 그대로 전달됩니다. NGINX는 SSL 인증서를 보유하고 포트 443에서 수신 대기합니다.
SSL 인증서 관리 및 NGINX 구성에 대한 자세한 내용은 HTTPS 문서를 참조하십시오.
로드 밸런서가 백엔드 SSL 없이 SSL 종료
로드 밸런서를 HTTP(S)
프로토콜을 사용하도록 구성하십시오.
그렇게 하면 로드 밸런서가 SSL 인증서를 관리하고 SSL을 종료하는 책임을 집니다.
로드 밸런서와 GitLab 간의 통신이 안전하지 않으므로 추가 구성이 필요합니다. 자세한 내용은 프록시 SSL 문서를 참조하십시오.
로드 밸런서가 백엔드 SSL과 함께 SSL 종료
로드 밸런서를 ‘HTTP(S)’ 프로토콜 대신 ‘TCP’를 사용하도록 구성하십시오.
로드 밸런서는 최종 사용자가 볼 SSL 인증서를 관리할 책임이 있습니다.
이 시나리오에서는 로드 밸런서와 NGINX 간의 트래픽도 안전하게 유지됩니다.
프록시 SSL에 대한 추가 구성을 할 필요가 없으며 연결은 전 과정이 안전합니다. 그러나 GitLab에 SSL 인증서를 구성하기 위한 구성을 추가해야 합니다. SSL 인증서 관리 및 NGINX 구성에 대한 자세한 내용은 HTTPS 문서를 참조하십시오.
내부 로드 밸런서 구성
다중 노드 GitLab 구성에서 선택한 내부 구성 요소에 대한 트래픽을 라우팅하기 위해 내부 로드 밸런서가 필요합니다.
예를 들어 PgBouncer 및 Praefect (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 서버를 설정합니다.
다음 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를 설정했는지 확인합니다.
세 번째 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 SQL 및 Amazon RDS가 작동하는 것으로 알려져 있습니다. 그러나 Amazon Aurora는 호환되지 않습니다 기본적으로 부하 분산이 가능하도록 설정되어 있으며 14.4.0부터는 사용이 불가능합니다.
더 많은 정보는 추천 클라우드 제공 업체 및 서비스를 참조하십시오.
타사 외부 서비스를 사용하는 경우:
-
HA Linux 패키지 PostgreSQL 설정은 PostgreSQL, PgBouncer 및 Consul을 포괄합니다. 타사 외부 서비스를 사용할 경우 이러한 모든 구성 요소는 더 이상 필요하지 않습니다.
-
데이터베이스 요구 사항 문서에 따라 PostgreSQL을 설정합니다.
-
원하는 비밀번호로
gitlab
사용자 이름을 설정합니다.gitlab
사용자에게는gitlabhq_production
데이터베이스를 생성할 수 있는 권한이 필요합니다. -
적절한 세부정보로 GitLab 애플리케이션 서버를 구성합니다. 이 단계는 GitLab Rails 애플리케이션 구성에서 다룹니다.
-
HA를 달성하는 데 필요한 노드 수는 서비스에 따라 Linux 패키지와 다를 수 있으며 일치할 필요는 없습니다.
-
그러나 데이터베이스 로드 밸런싱을 통해 성능을 더욱 향상시키고자 하는 경우, 참조 아키텍처의 노드 수를 따르는 것이 권장됩니다.
Linux 패키지를 사용하는 독립형 PostgreSQL
복제 및 장애 조치를 갖춘 PostgreSQL 클러스터에 대한 추천 Linux 패키지 구성은 다음을 요구합니다:
- 최소 세 개의 PostgreSQL 노드.
- 최소 세 개의 Consul 서버 노드.
- 기본 데이터베이스 읽기 및 쓰기를 추적하고 처리하는 최소 세 개의 PgBouncer 노드.
- PgBouncer 노드 간 요청을 균형을 맞추기 위한 내부 로드 발란서 (TCP).
-
데이터베이스 로드 밸런싱이 활성화되어 있어야 합니다.
각 PostgreSQL 노드에 대해 구성되는 로컬 PgBouncer 서비스. 이는 기본 PgBouncer 클러스터와는 별도로 설정됩니다.
다음 IP는 예시로 사용됩니다:
-
10.6.0.21
: PostgreSQL 기본 -
10.6.0.22
: PostgreSQL 보조 1 -
10.6.0.23
: PostgreSQL 보조 2
먼저, 설치를 통해 각 노드에 Linux GitLab 패키지를 설치해야 합니다. 단계에 따라 1단계에서 필수 종속성을 설치하고 2단계에서 GitLab 패키지 저장소를 추가합니다. GitLab을 설치할 때 2단계에서 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>' # 10.6.0.0/24를 네트워크 주소로 교체 postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32) # 데이터베이스 로드 밸런싱을 위한 로컬 PgBouncer 서비스 pgbouncer['databases'] = { gitlabhq_production: { host: "127.0.0.1", user: "pgbouncer", password: '<pgbouncer_password_hash>' } } # 모니터링을 위해 수출업자가 수신 대기할 네트워크 주소 설정 node_exporter['listen_address'] = '0.0.0.0:9100' postgres_exporter['listen_address'] = '0.0.0.0:9187' ## Consul 서버 노드의 IP 주소 ## FQDN을 사용하고 IP와 혼합하여 사용할 수도 있습니다. consul['configuration'] = { retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13), } # # END user configuration
PostgreSQL의 경우 Patroni가 장애 조치를 관리하며, 기본적으로 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를 구성하겠습니다.
참고: PgBouncer는 단일 스레드로 작동하며 CPU 코어 수를 늘려도 큰 이점을 얻지 못합니다.
스케일링 문서를 참조하여 더 많은 정보를 얻으세요.
다음 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' pgbouncer_exporter['listen_address'] = '0.0.0.0:9188'
-
첫 번째 Linux 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하고 이 서버에 동일한 이름의 파일을 추가하거나 교체합니다. 이 패키지 설치를 처음 설정하는 경우 이 단계를 건너뛸 수 있습니다. -
GitLab 재구성을 수행하여 변경 사항을 적용합니다.
-
Consul이 PgBouncer를 다시 로드할 수 있도록
.pgpass
파일을 생성합니다. 요청 시 PgBouncer 비밀번호를 두 번 입력합니다:gitlab-ctl write-pgpass --host 127.0.0.1 --database pgbouncer --user pgbouncer --hostuser gitlab-consul
-
각 노드가 현재 마스터와 통신하고 있는지 확인합니다:
gitlab-ctl pgb-console # PGBOUNCER_PASSWORD를 입력하라는 메시지가 표시됩니다.
비밀번호를 입력 후
psql: ERROR: Auth failed
오류가 발생하면, 이전에 올바른 형식으로 MD5 비밀번호 해시를 생성했는지 확인하십시오. 올바른 형식은 비밀번호와 사용자 이름을 연결한 것입니다:PASSWORDUSERNAME
. 예를 들어,Sup3rS3cr3tpgbouncer
는pgbouncer
사용자에 대한 MD5 비밀번호 해시를 생성하는 데 필요한 텍스트입니다. -
콘솔 프롬프트가 사용 가능해지면 다음 쿼리를 실행합니다:
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)
-
GitLab 서비스가 실행 중인지 확인합니다:
sudo gitlab-ctl status
출력은 다음과 유사해야 합니다:
run: consul: (pid 31530) 77150s; run: log: (pid 31106) 77182s run: logrotate: (pid 32613) 3357s; run: log: (pid 30107) 77500s run: node-exporter: (pid 31550) 77149s; run: log: (pid 30138) 77493s run: pgbouncer: (pid 32033) 75593s; run: log: (pid 31117) 77175s run: pgbouncer-exporter: (pid 31558) 77148s; run: log: (pid 31498) 77156s
Redis 구성
확장 가능한 환경에서 Redis를 사용하는 것은 Primary x Replica
구성을 통해 가능하며, Redis Sentinel 서비스가 모니터링하고 자동으로 장애 조치 절차를 시작합니다.
Sentinel과 함께 사용되면 Redis는 인증이 필요합니다. 자세한 내용은 Redis 보안 문서를 참조하십시오. Redis 서비스를 보호하기 위해 Redis 비밀번호와 엄격한 방화벽 규칙의 조합을 사용하는 것을 권장합니다.
GitLab과 함께 Redis를 구성하기 전에 Redis Sentinel 문서를 읽어 구성과 아키텍처를 완전히 이해할 것을 강력히 권장합니다.
Redis 설정을 위한 요구 사항은 다음과 같습니다:
-
모든 Redis 노드는 서로 통신할 수 있어야 하며 Redis(
6379
) 및 Sentinel(26379
) 포트를 통해 들어오는 연결을 허용해야 합니다(기본 포트를 변경하지 않는 경우). -
GitLab 애플리케이션을 호스팅하는 서버는 Redis 노드에 접근할 수 있어야 합니다.
-
방화벽과 같은 옵션을 사용하여 외부 네트워크(인터넷) 접근으로부터 노드를 보호합니다.
이 섹션에서는 GitLab과 함께 사용할 두 개의 외부 Redis 클러스터 구성을 안내합니다. 다음 IP가 예제로 사용됩니다:
-
10.6.0.61
: Redis Primary -
10.6.0.62
: Redis Replica 1 -
10.6.0.63
: Redis Replica 2
자체 Redis 인스턴스 제공
선택적으로 다음 지침에 따라 서드파티 외부 서비스의 Redis 인스턴스를 사용할 수 있습니다:
-
평판 좋은 제공업체 또는 솔루션을 사용하는 것이 좋습니다. Google Memorystore 및 AWS ElastiCache는 잘 작동하는 것으로 알려져 있습니다.
-
Redis Cluster 모드는 특별히 지원되지 않지만 HA를 갖춘 Redis Standalone은 지원됩니다.
-
설정에 따라 Redis 퇴출 모드를 설정해야 합니다.
자세한 내용은 권장 클라우드 제공업체 및 서비스를 참조하십시오.
Redis 클러스터 구성
이 섹션에서는 새로운 Redis 인스턴스를 설치하고 설정합니다.
기본 및 복제 Redis 노드는 redis['password']
에 정의된 동일한 비밀번호가 필요합니다. 장애 조치 중 언제든지 Sentinel은 노드를 재구성하고 상태를 기본에서 복제로 변경할 수 있습니다(그리고 그 반대도 마찬가지입니다).
기본 Redis 노드 구성
-
Primary Redis 서버에 SSH로 접속합니다.
-
다운로드 및 설치 원하는 Linux 패키지를 설치합니다. 페이지에서 설치 단계 1 및 2만 따라야 하며, 현재 설치와 동일한 버전 및 유형(커뮤니티 또는 엔터프라이즈 에디션)의 올바른 Linux 패키지를 선택해야 합니다.
-
/etc/gitlab/gitlab.rb
파일을 편집하고 다음 내용을 추가합니다:# Redis 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.61' # Redis가 TCP 요청을 수신할 수 있도록 포트를 정의합니다. 다른 머신이 연결할 수 있습니다. redis['port'] = 6379 ## Sentinel의 기본 Redis 서버 포트이며, 기본값이 아닌 것으로 변경하려면 주석을 제거합니다. #redis['master_port'] = 6379 # Redis 및 복제본의 비밀번호 인증 설정(모든 노드에서 동일한 비밀번호 사용). redis['password'] = 'REDIS_PRIMARY_PASSWORD' redis['master_password'] = 'REDIS_PRIMARY_PASSWORD' ## 모든 Redis 노드에서 동일해야 합니다 redis['master_name'] = 'gitlab-redis' ## 이 기본 Redis 노드의 IP 주소입니다. redis['master_ip'] = '10.6.0.61' ## Prometheus에 대한 서비스 발견 활성화 consul['monitoring_service_discovery'] = true ## Consul 서버 노드의 IPs ## 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
-
처음 구성한 Linux 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하여 이 서버에서 동일한 이름의 파일을 추가하거나 교체합니다. 이 노드가 처음 구성하는 Linux 패키지 노드인 경우 이 단계를 건너뛸 수 있습니다. -
변경 사항이 적용되도록 GitLab 재구성을 실행합니다.
복제 Redis 노드 구성하기
-
replica Redis 서버에 SSH로 접속합니다.
-
다운로드 및 설치 원하는 Linux 패키지를 설치합니다. 페이지의 설치 단계 1과 2만 따르고, 현재 설치와 동일한 버전과 유형(커뮤니티 또는 엔터프라이즈 에디션)의 올바른 Linux 패키지를 선택해야 합니다.
-
/etc/gitlab/gitlab.rb
를 편집하고 다음 내용을 추가합니다:# 서버 역할을 'redis_sentinel_role'과 'redis_replica_role'로 지정합니다. roles ['redis_sentinel_role', 'redis_replica_role', 'consul_role'] # Redis Sentinel 서비스의 IP 바인드 주소와 쿼럼 수를 설정합니다. sentinel['bind'] = '0.0.0.0' sentinel['quorum'] = 2 # 다른 머신이 접근할 수 있는 로컬 IP를 가리키는 IP 주소입니다. # '0.0.0.0'으로 바인드하여 모든 인터페이스에서 수신할 수 있도록 설정할 수 있습니다. # 정말 외부에서 접근할 수 있는 IP에 바인드해야 하는 경우에는 # 무단 접근을 방지하기 위해 추가 방화벽 규칙을 추가해야 합니다. redis['bind'] = '10.6.0.62' # Redis가 TCP 요청을 청취할 수 있도록 포트를 정의합니다. # 이를 통해 다른 머신이 연결할 수 있습니다. redis['port'] = 6379 ## Sentinel을 위한 기본 Redis 서버 포트, 기본값이 아닌 값으로 변경하려면 주석을 해제하세요. ## 기본값은 `6379`입니다. #redis['master_port'] = 6379 # 기본 노드에 대해 설정한 Redis 인증을 위한 동일한 비밀번호입니다. redis['password'] = 'REDIS_PRIMARY_PASSWORD' redis['master_password'] = 'REDIS_PRIMARY_PASSWORD' ## 모든 Redis 노드에서 동일해야 합니다. redis['master_name'] = 'gitlab-redis' # 기본 Redis 노드의 IP입니다. redis['master_ip'] = '10.6.0.61' ## Prometheus를 위한 서비스 발견 활성화 consul['monitoring_service_discovery'] = true ## Consul 서버 노드의 IP ## FQDN을 사용할 수도 있으며 IP와 혼합할 수 있습니다. consul['configuration'] = { retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13), } # 수출자가 청취할 네트워크 주소를 설정합니다. node_exporter['listen_address'] = '0.0.0.0:9100' redis_exporter['listen_address'] = '0.0.0.0:9121' # 업그레이드 시 데이터베이스 마이그레이션이 자동으로 실행되는 것을 방지합니다. gitlab_rails['auto_migrate'] = false
-
첫 번째 Linux 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하여 이 서버의 동일한 이름의 파일에 추가하거나 교체합니다. 구성하는 첫 번째 Linux 패키지 노드인 경우 이 단계를 건너뛸 수 있습니다. -
GitLab 재구성 변경 사항을 적용합니다.
-
다른 모든 복제 노드에 대해 다시 단계를 진행하고 IP를 올바르게 설정하는지 확인합니다.
고급 구성 옵션이 지원되며 필요에 따라 추가할 수 있습니다.
Gitaly 클러스터 구성
Gitaly 클러스터는 GitLab이 제공하고 권장하는 Git 저장소를 위한 내결함성 솔루션입니다. 이 구성에서 모든 Git 저장소는 클러스터의 모든 Gitaly 노드에 저장되며, 하나는 기본으로 지정되고 기본 노드가 중단되면 자동으로 장애 조치가 발생합니다.
경고: Gitaly 사양은 사용 패턴과 건강한 상태의 저장소 크기의 높은 백분위수를 기반으로 합니다.
그러나 대형 모노레포(수 기가바이트 이상) 또는 추가 작업 부하가 있는 경우 이는 환경의 성능에 중대한 영향을 미칠 수 있으며 추가 조정이 필요할 수 있습니다.
이 사항이 해당되는 경우, 연결된 문서를 참조하고 고객 성공 관리자 또는 지원 팀에 연락하여 추가 지침을 받는 것을 강력히 권장합니다.
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 클러스터 상태를 저장할 자체 데이터베이스 서버가 필요합니다.
고가용성 설정을 원하는 경우, Praefect는 제3자 PostgreSQL 데이터베이스가 필요합니다. 현재 내부 솔루션이 작업 중입니다.
Praefect 비HA PostgreSQL 독립형 Linux 패키지 사용
다음 IP가 예제로 사용됩니다:
-
10.6.0.141
: Praefect PostgreSQL
먼저, Praefect PostgreSQL 노드에서 설치를 확인하십시오. 단계에 따라 1단계에서 필요한 종속성을 설치하고 2단계에서 GitLab 패키지 리포지토리를 추가합니다. GitLab을 설치할 때 2단계에서 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 및 Consul을 제외한 모든 구성 요소 비활성화 roles(['postgres_role', 'consul_role']) # PostgreSQL 구성 postgresql['listen_address'] = '0.0.0.0' # 자동으로 데이터베이스 마이그레이션이 실행되지 않도록 방지 gitlab_rails['auto_migrate'] = false # Consul 에이전트 구성 ## Prometheus를 위한 서비스 발견 활성화 consul['monitoring_service_discovery'] = true # START user configuration # 필수 정보 섹션에서 설명된 대로 실제 값을 설정하십시오 # # PRAEFECT_POSTGRESQL_PASSWORD_HASH를 생성된 md5 값으로 교체 postgresql['sql_user_password'] = "<praefect_postgresql_password_hash>" # XXX.XXX.XXX.XXX/YY를 네트워크 주소로 교체 postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32) # 모니터링을 위해 내보내기가 수신할 네트워크 주소 설정 node_exporter['listen_address'] = '0.0.0.0:9100' postgres_exporter['listen_address'] = '0.0.0.0:9187' ## Consul 서버 노드의 IP ## FQDN을 사용하고 IP와 혼합하여 사용할 수도 있습니다 consul['configuration'] = { retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13), } # # END user configuration
-
첫 번째 Linux 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하여 이 서버의 동일한 이름의 파일에 추가하거나 교체합니다. 이 첫 번째 Linux 패키지 노드를 구성하는 경우 이 단계를 건너뛸 수 있습니다. - 변경 사항이 적용되도록 GitLab 재구성을 수행합니다.
- 후 구성을 따릅니다.
Praefect HA PostgreSQL 서드파티 솔루션
언급된 바와 같이, 완전한 고가용성을 목표로 할 경우 Praefect의 데이터베이스에 대한 서드파티 PostgreSQL 솔루션을 권장합니다.
PostgreSQL HA에 대한 많은 서드파티 솔루션이 있습니다. 선택된 솔루션은 Praefect와 함께 작동하기 위해 다음을 충족해야 합니다:
- 장애 조치 시 변경되지 않는 모든 연결을 위한 고정 IP.
-
LISTEN
SQL 기능이 지원되어야 합니다.
주의: 서드파티 설정을 사용하면 편리하게도 Praefect의 데이터베이스를 주요 GitLab 데이터베이스와 동일한 서버에 위에 배치할 수 있습니다. 하지만 Geo를 사용하는 경우 복제를 올바르게 처리하기 위해 별도의 데이터베이스 인스턴스가 필요합니다. 이 설정에서는 주요 데이터베이스 설정의 사양을 변경할 필요가 없어야 하며, 영향은 최소화되어야 합니다.
신뢰할 수 있는 공급자나 솔루션을 사용해야 합니다. Google Cloud SQL 및 Amazon RDS는 잘 작동하는 것으로 알려져 있습니다. 그러나 Amazon Aurora는 14.4.0부터 기본적으로 로드 밸런싱이 활성화되어 있어 호환되지 않습니다. 14.4.0.
자세한 정보는 권장 클라우드 공급자 및 서비스를 참조하세요.
데이터베이스가 설정되면 사후 구성을 따르세요.
Praefect PostgreSQL 사후 구성
Praefect PostgreSQL 서버가 설정된 후, Praefect에서 사용할 사용자 및 데이터베이스를 구성해야 합니다.
사용자의 이름을 praefect
로, 데이터베이스를 praefect_production
으로 지정하는 것이 좋으며, PostgreSQL에서 표준으로 구성할 수 있습니다. 사용자의 비밀번호는 이전에 구성한 <praefect_postgresql_password>
와 동일합니다.
Linux 패키지 PostgreSQL 설정에서 작동하는 방식은 다음과 같습니다:
-
Praefect PostgreSQL 노드에 SSH로 접속합니다.
-
관리자 권한으로 PostgreSQL 서버에 연결합니다.
여기서gitlab-psql
사용자를 사용해야 하며, 이는 Linux 패키지에 기본적으로 추가됩니다.
데이터베이스template1
은 모든 PostgreSQL 서버에 기본적으로 생성되므로 사용됩니다./opt/gitlab/embedded/bin/psql -U gitlab-psql -d template1 -h POSTGRESQL_SERVER_ADDRESS
-
새로운 사용자
praefect
를 생성하고<praefect_postgresql_password>
를 바꿉니다: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
와 구별되며, Gitaly 클라이언트가 Praefect 클러스터의 내부 노드에 직접 접근할 수 없도록 해야 합니다. 그렇지 않으면 데이터 손실이 발생할 수 있습니다. -
<praefect_postgresql_password>
: 이전 섹션에서 정의된 Praefect PostgreSQL 비밀번호도 이 설정의 일부로 필요합니다.
Gitaly 클러스터 노드는 virtual storage
를 통해 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 노드를 구성하려면 각 노드에서:
-
Praefect 서버에 SSH로 접속합니다.
-
다운로드 및 설치 선택한 Linux 패키지를 설치합니다. 페이지에서 오직 설치 단계 1과 2만 따르도록 하세요.
-
/etc/gitlab/gitlab.rb
파일을 편집하여 Praefect를 구성합니다:# 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, dbname: 'praefect_production', user: 'praefect', password: '<praefect_postgresql_password>', }, # Praefect 가상 스토리지 구성 # 스토리지 해시는 GitLab의 git_data_dirs에 있는 스토리지 이름 ('praefect')과 Gitaly 노드의 gitaly['configuration'][:storage]에서의 스토리지 이름 ('gitaly-1')과 일치해야 합니다. virtual_storage: [ { # ... name: 'default', node: [ { storage: 'gitaly-1', address: 'tcp://10.6.0.91:8075', token: '<praefect_internal_token>' }, { storage: 'gitaly-2', address: 'tcp://10.6.0.92:8075', token: '<praefect_internal_token>' }, { storage: 'gitaly-3', address: 'tcp://10.6.0.93:8075', token: '<praefect_internal_token>' }, ], }, ], # Praefect가 모니터링을 위해 수신 대기할 네트워크 주소 설정 prometheus_listen_addr: '0.0.0.0:9652', } # 노드 익스포터가 모니터링을 위해 수신 대기할 네트워크 주소 설정 node_exporter['listen_address'] = '0.0.0.0:9100' ## Consul 서버 노드의 IP ## FQDN을 사용하거나 IP와 혼합할 수 있습니다. consul['configuration'] = { retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13), } # # END 사용자 구성
-
첫 번째 Linux 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하여 이 서버에서 동일한 이름의 파일을 추가하거나 교체합니다. 이 Linux 패키지 노드를 처음 구성하는 경우 이 단계를 건너뛸 수 있습니다. -
Praefect는 주요 GitLab 애플리케이션처럼 일부 데이터베이스 마이그레이션을 실행해야 합니다. 이를 위해 마이그레이션을 실행할 Praefect 노드 하나만 선택해야 합니다, 즉 _배포 노드_입니다. 이 노드는 다음과 같이 다른 노드보다 먼저 구성해야 합니다:
-
/etc/gitlab/gitlab.rb
파일에서praefect['auto_migrate']
설정 값은false
에서true
로 변경합니다. -
데이터베이스 마이그레이션이 자동으로 업그레이드 중에 실행되지 않고 재구성 중에만 실행되도록 하려면 다음을 실행합니다:
sudo touch /etc/gitlab/skip-auto-reconfigure
- 변경 사항이 적용되도록 GitLab 재구성을 실행하여 Praefect 데이터베이스 마이그레이션을 실행합니다.
-
-
나머지 모든 Praefect 노드는 변경 사항이 적용되도록 GitLab 재구성을 실행합니다.
Gitaly 구성하기
Gitaly 서버 노드는 클러스터의 일부로 데이터 및 부하에 따라 요구 사항이 다릅니다.
경고:
Gitaly 사양은 사용 패턴과 좋은 상태의 저장소 크기의 높은 백분위수에 기반합니다.
그러나, 대형 모노레포(수 기가바이트보다 큰) 또는 추가 작업 부하가 있는 경우 이는 환경의 성능에 상당한 영향을 미칠 수 있으며 추가 조정이 필요할 수 있습니다.
이 경우, 관련 문서를 참조하고 고객 성공 관리자 또는 지원 팀에 연락하여 추가 안내를 받는 것을 강력히 권장합니다.
Gitaly의 주목할 만한 입출력 요구 사항으로 인해 모든 Gitaly 노드는 솔리드 스테이트 드라이브(SSD)를 사용하는 것을 강력히 권장합니다. 이러한 SSD는 읽기 작업을 위해 최소 8,000 입출력 작업(IOPS)과 쓰기 작업을 위해 2,000 IOPS의 처리량을 가져야 합니다. 클라우드 공급자에서 환경을 실행하고 있다면 IOPS를 올바르게 구성하는 방법에 대한 문서를 참조하세요.
Gitaly 서버는 공용 인터넷에 노출되어서는 안 되며, 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 # Gitaly gitaly['enable'] = true # gitlab-shell API 콜백 URL 구성. 이 없이 `git push`가 실패합니다. # '앞문' GitLab URL 또는 내부 로드 밸런서를 사용할 수 있습니다. gitlab_rails['internal_api_url'] = 'https://gitlab.example.com' # 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', # Gitaly 인증 토큰 # praefect_internal_token과 동일해야 합니다 auth: { # ... token: '<praefect_internal_token>', }, # Gitaly Pack-objects 캐시 # 성능 향상을 위해 활성화하는 것이 좋지만 디스크 I/O를 크게 증가시킬 수 있습니다 # 추가 정보는 https://docs.gitlab.com/ee/administration/gitaly/configure_gitaly.html#pack-objects-cache를 참조하세요 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 클러스터 TLS 지원
Praefect는 TLS 암호화를 지원합니다. 보안 연결을 수신 대기하는 Praefect 인스턴스와 통신하려면 다음을 수행해야 합니다:
- GitLab 구성의 해당 스토리지 항목의
gitaly_address
에tls://
URL 스킴을 사용하십시오. - 자동으로 제공되지 않으므로 인증서를 직접 가져와야 합니다. 각 Praefect 서버에 해당하는 인증서는 해당 Praefect 서버에 설치되어야 합니다.
추가로 인증서 또는 해당 인증 기관은 모든 Gitaly 서버와 해당 서버와 통신하는 모든 Praefect 클라이언트에 설치되어야 하며, 이는 GitLab 사용자 지정 인증서 구성에서 설명된 절차를 따릅니다(아래에 반복됨).
다음 사항에 유의하십시오:
- 인증서는 Praefect 서버에 액세스하는 데 사용하는 주소를 지정해야 합니다. hostname 또는 IP 주소를 인증서의 주체 대체 이름으로 추가해야 합니다.
- 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', }, }
-
파일을 저장하고 reconfigure합니다.
-
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://LOAD_BALANCER_SERVER_ADDRESS:3305', "gitaly_token" => 'PRAEFECT_EXTERNAL_TOKEN' } })
-
파일을 저장하고 GitLab 재구성합니다.
Sidekiq 구성
Sidekiq는 Redis, PostgreSQL 및 Gitaly 인스턴스에 대한 연결이 필요합니다.
또한 권장되는 대로 Object Storage와의 연결이 필요합니다.
주의: 데이터 객체에 대해 NFS 대신 Object Storage를 사용하는 것이 권장됩니다. 다음 예제는 Object Storage 구성을 포함합니다.
주의: 환경의 Sidekiq 작업 처리 속도가 긴 큐로 인해 느린 경우, 이에 맞게 확장할 수 있습니다. 자세한 내용은 스케일링 문서를 참조하십시오.
주의: 컨테이너 레지스트리, SAML 또는 LDAP과 같은 추가 GitLab 기능을 구성할 때, Rails 구성 외에도 Sidekiq 구성을 업데이트하십시오.
다음 IP는 예제로 사용됩니다:
-
10.6.0.71
: Sidekiq 1 -
10.6.0.72
: Sidekiq 2
각 Sidekiq 노드를 구성하려면:
-
Sidekiq 서버에 SSH로 접속합니다.
-
PostgreSQL, Gitaly 및 Redis 포트에 접근할 수 있는지 확인합니다:
telnet <GitLab host> 5432 # PostgreSQL telnet <GitLab host> 8075 # Gitaly telnet <GitLab host> 6379 # Redis
-
다운로드 및 설치하고자 하는 리눅스 패키지를 선택합니다. 페이지에 있는 설치 단계 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['master_name'] = 'gitlab-redis' ## 마스터 노드에 대해 설정한 Redis 인증에 대한 동일한 비밀번호입니다. redis['master_password'] = '<redis_primary_password>' ## 'host' 및 'port'와 함께하는 센티넬 목록 gitlab_rails['redis_sentinels'] = [ {'host' => '10.6.0.11', 'port' => 26379}, {'host' => '10.6.0.12', 'port' => 26379}, {'host' => '10.6.0.13', 'port' => 26379}, ] # Gitaly 클러스터 ## git_data_dirs는 Praefect 가상 저장소에 대해 구성됩니다 ## 주소는 Praefect의 내부 로드 밸런서입니다. ## 토큰은 praefect_external_token입니다. git_data_dirs({ "default" => { "gitaly_address" => "tcp://10.6.0.40:2305", # 내부 로드 밸런서 IP "gitaly_token" => '<praefect_external_token>' } }) # PostgreSQL gitlab_rails['db_host'] = '10.6.0.40' # 내부 로드 밸런서 IP gitlab_rails['db_port'] = 6432 gitlab_rails['db_password'] = '<postgresql_user_password>' gitlab_rails['db_load_balancing'] = { 'hosts' => ['10.6.0.21', '10.6.0.22', '10.6.0.23'] } # PostgreSQL IPs ## 업그레이드 시 데이터베이스 마이그레이션이 자동으로 실행되지 않도록 방지 gitlab_rails['auto_migrate'] = false # Sidekiq sidekiq['listen_address'] = "0.0.0.0" ## Sidekiq 큐 프로세스의 수를 사용 가능한 CPU의 수와 동일하게 설정 sidekiq['queue_groups'] = ['*'] * 4 # 모니터링 consul['enable'] = true consul['monitoring_service_discovery'] = true consul['configuration'] = { retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13) } ## 수출업체가 수신 대기할 네트워크 주소 설정 node_exporter['listen_address'] = '0.0.0.0:9100' ## 모니터링 노드의 IP 주소를 모니터링 화이트 리스트에 추가 gitlab_rails['monitoring_whitelist'] = ['10.6.0.81/32', '127.0.0.0/8'] gitlab_rails['prometheus_address'] = '10.6.0.81:9090' # 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>' }
-
첫 번째 리눅스 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하고 이 서버의 같은 이름의 파일에 추가하거나 교체하십시오. 이 패키지 노드를 처음 구성하는 경우 이 단계를 건너뛸 수 있습니다. -
데이터베이스 마이그레이션이 업그레이드 중 자동으로 실행되지 않고 재구성할 때만 실행되도록 하려면 아래 명령을 실행하십시오:
sudo touch /etc/gitlab/skip-auto-reconfigure
마이그레이션을 처리하는 지정된 노드는 GitLab Rails 후속 구성 섹션에 자세히 설명되어 있습니다.
-
파일을 저장하고 GitLab 재구성을 실행합니다.
-
GitLab 서비스가 실행 중인지 확인합니다:
sudo gitlab-ctl status
출력은 다음과 유사해야 합니다:
run: consul: (pid 30114) 77353s; run: log: (pid 29756) 77367s run: logrotate: (pid 9898) 3561s; run: log: (pid 29653) 77380s run: node-exporter: (pid 30134) 77353s; run: log: (pid 29706) 77372s run: sidekiq: (pid 30142) 77351s; run: log: (pid 29638) 77386s
GitLab Rails 구성
이 섹션에서는 GitLab 애플리케이션(Rails) 구성 요소를 구성하는 방법을 설명합니다.
Rails는 Redis, PostgreSQL 및 Gitaly 인스턴스에 대한 연결이 필요합니다.
또한 권장되는 대로 Object Storage와의 연결이 필요합니다.
다음 예제에는 Object Storage 구성도 포함되어 있습니다.
각 노드에서 다음을 수행합니다:
-
리스 약어 및 설치하실 리눅스 패키지를 다운로드하여 설치하세요.
페이지에서 오직 설치 단계를 1 및 2만 따르십시오. -
/etc/gitlab/gitlab.rb
를 생성하거나 편집하고 다음 구성을 사용하세요.
노드 간의 링크의 일관성을 유지하기 위해, 애플리케이션 서버의external_url
은 사용자가 GitLab에 접근하는 데 사용할 외부 URL을 가리켜야 합니다.
이는 GitLab 애플리케이션 서버로 트래픽을 라우팅할 외부 로드 밸런서의 URL이 될 것입니다:external_url 'https://gitlab.example.com' # git_data_dirs는 Praefect 가상 저장소에 대해 구성됩니다 # 주소는 Praefect의 내부 로드 밸런서입니다 # 토큰은 praefect_external_token입니다 git_data_dirs({ "default" => { "gitaly_address" => "tcp://10.6.0.40:2305", # 내부 로드 밸런서 IP "gitaly_token" => '<praefect_external_token>' } }) ## GitLab 애플리케이션 서버에 없을 구성 요소 비활성화 roles(['application_role']) gitaly['enable'] = false sidekiq['enable'] = false ## PostgreSQL 연결 세부정보 # 애플리케이션 노드에서 PostgreSQL 비활성화 postgresql['enable'] = false gitlab_rails['db_host'] = '10.6.0.20' # 내부 로드 밸런서 IP gitlab_rails['db_port'] = 6432 gitlab_rails['db_password'] = '<postgresql_user_password>' gitlab_rails['db_load_balancing'] = { 'hosts' => ['10.6.0.21', '10.6.0.22', '10.6.0.23'] } # PostgreSQL IPs # 업그레이드 시 자동으로 데이터베이스 마이그레이션이 실행되지 않도록 방지 gitlab_rails['auto_migrate'] = false ## Redis 연결 세부정보 ## 모든 센티넬 노드에서 동일해야 합니다 redis['master_name'] = 'gitlab-redis' ## Redis 기본 노드에 대해 설정한 Redis 인증의 동일한 비밀번호입니다. redis['master_password'] = '<redis_primary_password>' ## `host` 및 `port`가 있는 센티넬 목록 gitlab_rails['redis_sentinels'] = [ {'host' => '10.6.0.11', 'port' => 26379}, {'host' => '10.6.0.12', 'port' => 26379}, {'host' => '10.6.0.13', 'port' => 26379} ] ## Prometheus의 서비스 발견 활성화 consul['enable'] = true consul['monitoring_service_discovery'] = true # 모니터링을 위한 내보내기 도구가 수신 대기할 네트워크 주소 설정 node_exporter['listen_address'] = '0.0.0.0:9100' gitlab_workhorse['prometheus_listen_addr'] = '0.0.0.0:9229' sidekiq['listen_address'] = "0.0.0.0" puma['listen'] = '0.0.0.0' ## Consul 서버 노드의 IP ## FQDN을 사용하여 IP와 혼합할 수도 있습니다 consul['configuration'] = { retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13), } # 모니터링 화이트리스트에 모니터링 노드의 IP 주소를 추가하고 # NGINX 메트릭을 크랩하도록 허용합니다 gitlab_rails['monitoring_whitelist'] = ['10.6.0.81/32', '127.0.0.0/8'] nginx['status']['options']['allow'] = ['10.6.0.81/32', '127.0.0.0/8'] gitlab_rails['prometheus_address'] = '10.6.0.81:9090' ## NFS를 설정한 경우 다음 옵션의 주석을 제거하고 편집하십시오 ## ## NFS 데이터 마운트가 사용 불가능한 경우 GitLab이 시작되지 않도록 합니다 ## #high_availability['mountpoint'] = '/var/opt/gitlab/git-data' ## ## NFS를 통해 권한 부여를 위해 서버 간 UID 및 GID가 일치하는지 확인합니다 ## #user['uid'] = 9000 #user['gid'] = 9000 #web_server['uid'] = 9001 #web_server['gid'] = 9001 #registry['uid'] = 9002 #registry['gid'] = 9002 # 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 with TLS 지원을 사용하는 경우,
git_data_dirs
항목이tcp
대신tls
로 구성되어 있는지 확인하십시오:git_data_dirs({ "default" => { "gitaly_address" => "tls://10.6.0.40:2305", # 내부 로드 밸런서 IP "gitaly_token" => '<praefect_external_token>' } })
-
cert를
/etc/gitlab/trusted-certs
에 복사하세요:sudo cp cert.pem /etc/gitlab/trusted-certs/
-
-
구성한 첫 번째 리눅스 패키지 노드에서
/etc/gitlab/gitlab-secrets.json
파일을 복사하고
이 서버의 같은 이름의 파일을 추가하거나 교체하세요.
만약 이 노드가 구성 중인 첫 번째 리눅스 패키지 노드라면, 이 단계를 건너뛸 수 있습니다. -
설정한 첫 번째 리눅스 패키지 노드에서 SSH 호스트 키를 복사합니다
(이름 형식:/etc/ssh/ssh_host_*_key*
)
그리고 이 서버의 같은 이름의 파일을 추가하거나 교체하세요.
이는 사용자가 로드 밸런스된 Rails 노드에 접근할 때 호스트 불일치 오류가 발생하지 않도록 보장합니다.
만약 이 노드가 구성 중인 첫 번째 리눅스 패키지 노드라면, 이 단계를 건너뛸 수 있습니다. -
데이터베이스 마이그레이션이 자동으로 실행되지 않고 재구성 시에만 실행되도록 하려면, 다음을 실행하세요:
sudo touch /etc/gitlab/skip-auto-reconfigure
마이그레이션은 GitLab Rails 포스트 구성 섹션에 자세히 설명된 대로
단일 지정된 노드에서만 처리해야 합니다. -
변경 사항이 적용되도록 GitLab 재구성을 실행합니다.
-
증분 로깅 활성화합니다.
-
sudo gitlab-rake gitlab:gitaly:check
를 실행하여 노드가 Gitaly에 연결할 수 있는지 확인합니다. -
요청을 보기 위해 로그를 꼬리 잡습니다:
sudo gitlab-ctl tail gitaly
-
GitLab 서비스가 실행 중인지 확인하십시오:
sudo gitlab-ctl status
출력은 다음과 유사해야 합니다:
run: consul: (pid 4890) 8647s; run: log: (pid 29962) 79128s run: gitlab-exporter: (pid 4902) 8647s; run: log: (pid 29913) 79134s run: gitlab-workhorse: (pid 4904) 8646s; run: log: (pid 29713) 79155s run: logrotate: (pid 12425) 1446s; run: log: (pid 29798) 79146s run: nginx: (pid 4925) 8646s; run: log: (pid 29726) 79152s run: node-exporter: (pid 4931) 8645s; run: log: (pid 29855) 79140s run: puma: (pid 4936) 8645s; run: log: (pid 29656) 79161s
external_url
에 https
를 지정하면, 이전 예제와 같이
GitLab은 SSL 인증서가 /etc/gitlab/ssl/
에 있어야 함을 기대합니다.
인증서가 존재하지 않으면 NGINX가 시작되지 않습니다.
자세한 내용은 HTTPS 문서를 참조하세요.
GitLab Rails 후속 구성
-
모든 마이그레이션이 실행되었는지 확인하세요:
gitlab-rake gitlab:db:configure
이 작업은 Rails 노드를 기본 데이터베이스에 직접 연결하도록 구성해야 하며, PgBouncer를 우회합니다.
마이그레이션이 완료된 후에는 노드를 다시 PgBouncer를 통해 통과하도록 구성해야 합니다.
Prometheus 구성
리눅스 패키지는 Prometheus를 실행하는 독립형 모니터링 노드를 구성할 때 사용할 수 있습니다:
- 모니터링 노드에 SSH 접속합니다.
- 다운로드 및 설치 리눅스 패키지를 선택하세요. 페이지의 설치 단계 1과 2만 수행해야 합니다.
-
/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
- 파일을 저장하고 GitLab 재구성을 수행합니다.
-
GitLab 서비스가 실행 중인지 확인합니다:
sudo gitlab-ctl status
출력 결과는 다음과 유사합니다:
run: consul: (pid 31637) 17337s; run: log: (pid 29748) 78432s run: logrotate: (pid 31809) 2936s; run: log: (pid 29581) 78462s run: nginx: (pid 31665) 17335s; run: log: (pid 29556) 78468s run: prometheus: (pid 31672) 17335s; run: log: (pid 29633) 78456s
객체 저장소 구성
GitLab은 다양한 유형의 데이터를 보관하기 위해 객체 저장소 서비스를 사용하는 것을 지원합니다.
데이터 객체에 대해서는 NFS보다 권장되며, 일반적으로는 대규모 설정에서 더 나은 성능, 신뢰성 및 확장성을 제공합니다.
자세한 정보는 추천 클라우드 제공업체 및 서비스를 참조하세요.
GitLab에서 객체 저장소 구성을 지정하는 두 가지 방법이 있습니다:
가능할 때 통합 형식이 다음 예제에서 사용됩니다.
각 데이터 유형에 대해 별도의 버킷을 사용하는 것이 GitLab에 권장되는 접근 방식입니다.
이렇게 하면 GitLab이 저장하는 다양한 데이터 유형 간의 충돌이 없도록 보장합니다.
미래에는 단일 버킷 사용을 활성화할 계획이 있습니다.
증분 로깅 활성화
GitLab Runner는 작업 로그를 조각으로 반환하며, 기본적으로 Linux 패키지는 이 로그를 /var/opt/gitlab/gitlab-ci/builds
의 디스크에 임시로 캐시합니다.
기본 구성에서는 이 디렉토리를 GitLab Rails 및 Sidekiq 노드에서 NFS를 통해 공유해야 합니다.
작업 로그를 NFS를 통해 공유하는 것이 지원되지만, NFS 노드가 배포되지 않았을 때 필요성을 피하기 위해 증분 로깅을 활성화하는 것이 권장됩니다.
증분 로깅은 작업 로그의 임시 캐싱을 위한 디스크 공간 대신 Redis를 사용합니다.
고급 검색 구성
Elasticsearch를 활용하고 고급 검색을 활성화하여 GitLab 인스턴스 전체에서 더 빠르고 고급 코드 검색을 수행할 수 있습니다.
Elasticsearch 클러스터 설계와 요구 사항은 특정 데이터에 따라 다릅니다.
인스턴스와 함께 Elasticsearch 클러스터를 설정하는 방법에 대한 권장 모범 사례를 읽으려면 최적의 클러스터 구성 선택 방법을 참조하세요.
사용자 수가 적은 경우의 지원되는 수정 사항 (HA)
GitLab 참조 아키텍처에서 60 RPS 또는 3,000 사용자는 고가용성(HA)을 달성하는 데 권장하는 최소값입니다.
하지만 HA를 유지하면서 더 적은 사용자를 서비스하거나 더 낮은 RPS가 필요한 환경에서는 복잡성과 비용을 줄이기 위해 이 아키텍처에 대해 몇 가지 지원되는 수정 사항을 적용할 수 있습니다.
GitLab으로 HA를 달성하려면 60 RPS 또는 3,000 사용자 아키텍처의 구성 요소가 궁극적으로 필요하다는 점에 유의해야 합니다.
각 구성 요소는 다양한 고려 사항과 규칙이 있으며, 아키텍처는 이러한 모든 조건을 충족합니다.
이 아키텍처의 작은 버전은 기본적으로 동일하지만 성능 요구 사항이 작아지므로 다음과 같이 지원되는 수정 사항이 있습니다:
참고:
아래에 명시되지 않은 경우, 사용자 수가 적을 때 다른 수정 사항은 지원되지 않습니다.
-
노드 사양 낮추기: 사용자 수에 따라 모든 제안된 노드 사양을 원하는 대로 낮출 수 있습니다. 그러나 일반 요구 사항보다 낮추지 않는 것이 권장됩니다.
-
특정 노드 결합: 다음의 특정 구성 요소는 성능에 대한 비용을 지불하고 복잡성을 줄이기 위해 동일한 노드에서 결합할 수 있습니다:
-
GitLab Rails 및 Sidekiq: Sidekiq 노드를 제거하고 구성 요소를 대신 GitLab Rails 노드에서 활성화할 수 있습니다.
-
PostgreSQL 및 PgBouncer: PgBouncer 노드를 제거하고 PostgreSQL 노드에서 Internal Load Balancer가 그들을 가리키도록 활성화할 수 있습니다. 그러나 데이터베이스 로드 밸런싱을 활성화하려면 여전히 별도의 PgBouncer 배열이 필요합니다.
-
-
노드 수 줄이기: 일부 노드 유형은 합의가 필요하지 않으며 (단, 중복성을 위해 하나 이상의 노드에서 실행해야 함) 더 적은 수의 노드로 실행할 수 있습니다:
-
GitLab Rails 및 Sidekiq: 상태 비저장 서비스는 최소 노드 수가 없습니다. 중복성을 위한 두 개의 노드면 충분합니다.
-
PostgreSQL 및 PgBouncer: 과반수는 반드시 필요하지 않습니다. 중복성을 위한 PostgreSQL 노드 두 개와 PgBouncer 노드 두 개면 충분합니다.
-
Consul, Redis Sentinel 및 Praefect: 투표 과반수를 위해 홀수 개의 노드와 최소 세 개의 노드가 필요합니다.
-
-
평판 좋은 클라우드 PaaS 솔루션에서 특정 구성 요소 실행: 다음 특정 구성 요소는 평판 좋은 클라우드 제공업체 PaaS 솔루션에서 실행되도록 지원됩니다. 이를 통해 추가 의존 구성 요소를 제거할 수 있습니다:
-
PostgreSQL: Google Cloud SQL 또는 Amazon RDS와 같은 평판 좋은 클라우드 PaaS 솔루션에서 실행할 수 있습니다. 이 설정에서는 PgBouncer 및 Consul 노드가 더 이상 필요하지 않습니다:
- Prometheus 자동 발견이 필요하다면 Consul은 여전히 필요할 수 있지만, 그렇지 않으면 모든 노드에 대해 수동 스크랩 구성 추가가 필요합니다.
-
Redis: Google Memorystore 및 AWS ElastiCache와 같은 평판 좋은 클라우드 PaaS 솔루션에서 실행할 수 있습니다. 이 설정에서는 Redis Sentinel이 더 이상 필요하지 않습니다.
-
Helm 차트를 사용한 클라우드 네이티브 하이브리드 참조 아키텍처 (대안)
클라우드 네이티브 GitLab의 선택된 구성 요소를 GitLab Helm 차트와 함께 Kubernetes에서 실행합니다. 이 설정에서는 Kubernetes 클러스터에서 Webservice라는 GitLab Rails의 동등한 부분을 실행할 수 있습니다. 또한 Kubernetes 클러스터에서 Sidekiq라는 동등한 노드를 실행할 수 있습니다. 추가로 지원되는 다른 서비스는 NGINX, Toolbox, Migrations, Prometheus입니다.
하이브리드 설치는 클라우드 네이티브 및 전통적인 컴퓨팅 배포의 이점을 활용합니다. 이를 통해 무상태 구성 요소는 클라우드 네이티브 워크로드 관리의 이점을 누릴 수 있으며, 유상태 구성 요소는 Linux 패키지 설치가 있는 컴퓨팅 VM에 배포되어 증가된 지속성을 활용합니다.
Helm 차트의 고급 구성 문서를 참조하여 Kubernetes와 백엔드 구성 요소 간에 동기화할 GitLab 비밀에 대한 지침을 포함한 설정 지침을 확인하세요.
Gitaly 클러스터는 Kubernetes에서 실행하는 것이 지원되지 않습니다.
더 많은 세부정보는 epic 6127를 참조하십시오.
클러스터 토폴로지
다음 표 및 다이어그램은 위의 일반적인 환경과 동일한 형식을 사용하여 하이브리드 환경을 자세히 설명합니다.
먼저 Kubernetes에서 실행되는 구성 요소입니다. 이러한 구성 요소는 여러 노드 그룹에 걸쳐 실행되며, 최소 CPU 및 메모리 요구 사항을 준수하는 한, 전체 구성을 원하는 대로 변경할 수 있습니다.
구성 요소 노드 그룹 | 대상 노드 풀 총계 | GCP 예제 | AWS 예제 |
---|---|---|---|
Webservice | 16 vCPU 20 GB 메모리 (요청) 28 GB 메모리 (제한) |
2 x n1-standard-16
|
2 x c5.4xlarge
|
Sidekiq | 7.2 vCPU 16 GB 메모리 (요청) 32 GB 메모리 (제한) |
3 x n1-standard-4
|
3 x m5.xlarge
|
지원 서비스 | 4 vCPU 15 GB 메모리 |
2 x n1-standard-2
|
2 x m5.large
|
-
이 설정에 대해 우리는 추천하며 정기적으로 테스트하는 Google Kubernetes Engine (GKE) 및 Amazon Elastic Kubernetes Service (EKS)를 사용합니다. 다른 Kubernetes 서비스도 작동할 수 있지만 결과는 다를 수 있습니다.
-
GCP 및 AWS의 대상 노드 풀 총계를 도달하는 방법에 대한 예제가 편의를 위해 제공됩니다. 이러한 크기는 성능 테스트에 사용되지만 예제를 따르는 것은 필수가 아닙니다. 요구 사항을 충족하고 모든 포드가 배포될 수 있는 한 원하는 대로 다른 노드 풀 설계를 사용할 수 있습니다.
-
Webservice 및 Sidekiq 타겟 노드 풀 총계는 GitLab 구성 요소에만 해당합니다. 선택한 Kubernetes 공급자의 시스템 프로세스에 추가 리소스가 필요합니다. 제공된 예는 이를 고려합니다.
-
지원 타겟 노드 풀 총계는 GitLab 배포를 지원하는 여러 리소스와 원할 경우 추가 배포를 수용하기 위해 일반적으로 제공됩니다. 다른 노드 풀과 유사하게, 선택한 Kubernetes 공급자의 시스템 프로세스 또한 리소스가 필요합니다. 제공된 예는 이를 고려합니다.
-
프로덕션 배포에서는 포드를 특정 노드에 할당할 필요는 없습니다. 그러나 복원 가능한 클라우드 아키텍처 관행에 맞춰 다양한 가용 영역에 걸쳐 각 풀에 여러 노드를 두는 것이 권장됩니다.
-
효율성을 위한 클러스터 오토스케일러와 같은 자동 확장 기능을 활성화하는 것이 좋지만, Webservice 및 Sidekiq 포드의 75% 바닥을 목표로 설정하는 것이 일반적으로 권장됩니다.
다음은 Linux 패키지(또는 해당되는 경우 외부 PaaS 서비스)를 사용하여 정적 컴퓨팅 VM에서 실행되는 백엔드 구성 요소입니다:
서비스 | 노드 | 구성 | GCP | AWS |
---|---|---|---|---|
Consul1 | 3 | 2 vCPU, 1.8 GB 메모리 | n1-highcpu-2 |
c5.large |
PostgreSQL1 | 3 | 2 vCPU, 7.5 GB 메모리 | n1-standard-2 |
m5.large |
PgBouncer1 | 3 | 2 vCPU, 1.8 GB 메모리 | n1-highcpu-2 |
c5.large |
내부 로드 밸런서3 | 1 | 4 vCPU, 3.6 GB 메모리 | n1-highcpu-4 |
c5n.xlarge |
Redis/Sentinel2 | 3 | 2 vCPU, 7.5 GB 메모리 | n1-standard-2 |
m5.large |
Gitaly5 | 3 | 4 vCPU, 15 GB 메모리6 | n1-standard-4 |
m5.xlarge |
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 | - | - | - | - |
각주:
- 평판 좋은 제3자 외부 PaaS PostgreSQL 솔루션에서 선택적으로 실행할 수 있습니다. 자세한 내용은 자신의 PostgreSQL 인스턴스 제공를 참조하십시오.
- 평판 좋은 제3자 외부 PaaS Redis 솔루션에서 선택적으로 실행할 수 있습니다. 자세한 내용은 자신의 Redis 인스턴스 제공를 참조하십시오.
- 평판 좋은 제3자 로드 밸런서 또는 HA 기능을 제공할 수 있는 서비스(LB PaaS)와 함께 실행하는 것이 좋습니다. 크기는 선택한 로드 밸런서 및 네트워크 대역폭과 같은 추가 요인에 따라 다릅니다. 자세한 내용은 로드 밸런서를 참조하십시오.
- 평판 좋은 클라우드 제공업체 또는 자체 관리 솔루션에서 실행해야 합니다. 자세한 내용은 객체 저장소 구성를 참조하십시오.
- Gitaly 클러스터는 내결함성을 제공하는 이점이 있지만, 설정 및 관리의 복잡성이 증가합니다. Gitaly 클러스터 배포 전에 현재 기술적 한계 및 고려 사항을 검토하십시오. 분산 Gitaly를 원하면 위에 나열된
Gitaly
의 사양을 사용하세요. - Gitaly 사양은 높은 백분위수의 사용 패턴과 건강한 리포지토리 크기를 기반으로 합니다. 그러나 대형 모노레포(여러 기가바이트 이상의 크기)나 추가 작업부하가 있는 경우, 이는 Git 및 Gitaly 성능에 상당히 영향을 미칠 수 있으며 추가 조정이 필요할 수 있습니다.
Kubernetes 구성 요소 목표
다음 섹션에서는 Kubernetes에 배포된 GitLab 구성 요소에 사용되는 목표를 자세히 설명합니다.
웹서비스
각 웹서비스 포드(Puma 및 Workhorse)는 다음 구성으로 실행하는 것이 권장됩니다:
- 4 Puma 워커
- 4 vCPU
- 5 GB 메모리 (요청)
- 7 GB 메모리 (제한)
60 RPS 또는 3,000 사용자에 대해 총 Puma 워커 수를 약 16으로 하는 것이 좋으므로 최소 4개의 웹서비스 포드를 실행하는 것이 좋습니다.
웹서비스 리소스 사용에 대한 추가 정보는 웹서비스 리소스 문서에서 확인하세요.
NGINX
웹서비스 노드 전체에 NGINX 컨트롤러 포드를 DaemonSet으로 배포하는 것이 좋습니다. 이는 컨트롤러가 제공하는 웹서비스 포드와 함께 동적으로 확장할 수 있게 하며, 더 큰 머신 유형에서 일반적으로 제공되는 높은 네트워크 대역폭을 활용할 수 있습니다.
이것은 엄격한 요구사항은 아닙니다. NGINX 컨트롤러 포드는 웹 트래픽을 처리할 수 있는 충분한 리소스를 가진 경우 원하는 대로 배포할 수 있습니다.
사이드키크
각 사이드키크 포드는 다음 구성으로 실행하는 것이 권장됩니다:
- 1 사이드키크 워커
- 900m vCPU
- 2 GB 메모리 (요청)
- 4 GB 메모리 (제한)
위의 표준 배포와 유사하게, 여기에서는 초기 목표로 8개의 사이드키크 워커가 사용되었습니다.
특정 워크플로에 따라 추가 워커가 필요할 수 있습니다.
사이드키크 리소스 사용에 대한 추가 정보는 사이드키크 리소스 문서에서 확인하세요.
지원
지원 노드 풀은 웹서비스 및 사이드키크 풀에 있을 필요가 없는 모든 지원 배포를 수용하도록 설계되었습니다.
여기에는 클라우드 공급자의 구현과 GitLab 배포를 지원하는 다양한 배포가 포함됩니다, 예를 들어 GitLab Shell과 같은 것들입니다.
컨테이너 레지스트리, 페이지 또는 모니터링과 같은 추가 배포를 원하실 경우, 가능한 한 이 풀에서 배포하는 것이 좋으며 웹서비스 또는 사이드키크 풀에서는 배포하지 않는 것이 좋습니다. 지원 풀은 여러 추가 배포를 수용하도록 특별히 설계되었습니다. 그러나 귀하의 배포가 주어진 풀에 맞지 않는 경우, 해당 노드 풀을 적절히 늘릴 수 있습니다. 반대로, 사용 사례에서 풀이 과도하게 제공된 경우, 적절히 줄일 수 있습니다.
예제 구성 파일
위의 60 RPS 또는 3,000 참조 아키텍처 구성에 대한 GitLab Helm 차트의 예는 차트 프로젝트에서 찾을 수 있습니다.
다음 단계
이 가이드를 따라 하셨다면 이제 핵심 기능이 적절히 구성된 새 GitLab 환경을 가지시게 됩니다.
필요에 따라 추가 선택적 GitLab 기능을 구성할 수 있습니다. 추가 정보는 GitLab 설치 후 단계를 참조하세요.
참고:
환경 및 요구 사항에 따라 추가 기능을 원활히 설정하기 위해 추가 하드웨어 요구 사항이나 조정이 필요할 수 있습니다. 더 많은 정보는 개별 페이지를 참조하세요.