InfoGrab DocsInfoGrab Docs

GitLab 아키텍처 개요

요약

GitLab에는 두 가지 소프트웨어 배포판이 있습니다: 오픈 소스 Community Edition (CE). 오픈 코어 Enterprise Edition (EE). EE 리포지터리는 보관(archived) 처리되었습니다.

소프트웨어 배포#

GitLab에는 두 가지 소프트웨어 배포판이 있습니다:

EE 리포지터리는 보관(archived) 처리되었습니다. GitLab은 현재 단일 코드베이스로 운영됩니다.

GitLab은 다양한 구독 플랜으로 이용할 수 있습니다.

새 버전의 GitLab은 안정(stable) 브랜치에서 릴리즈되며, main 브랜치는 최신 개발 버전에 사용됩니다.

자세한 내용은 GitLab 릴리즈 프로세스를 참조하세요.

두 배포판 모두 추가 컴포넌트가 필요합니다. 이 컴포넌트들은 아래 컴포넌트 세부 정보 섹션에서 설명되며, 각각 독립적인 리포지터리를 갖습니다. 각 종속 컴포넌트의 새 버전은 보통 태그로 관리되지만, GitLab 코드베이스의 main 브랜치를 유지하면 해당 컴포넌트들의 최신 안정 버전을 사용할 수 있습니다. 새 버전은 일반적으로 GitLab 릴리즈와 거의 동시에 출시되며, 긴급 보안 업데이트는 예외일 수 있습니다.

컴포넌트#

GitLab의 일반적인 설치 환경은 GNU/Linux이지만, 쿠버네티스 플랫폼을 사용하는 배포 사례도 점점 증가하고 있습니다. 가장 큰 GitLab 인스턴스는 GitLab.com으로, 공식 GitLab Helm chart공식 Linux 패키지를 사용하여 배포됩니다.

일반적인 설치에서는 NGINX 또는 Apache를 웹 서버로 사용하여 GitLab Workhorse를 통해 Puma 애플리케이션 서버로 요청을 프록시합니다. GitLab은 Puma 애플리케이션 서버를 사용하여 웹 페이지와 GitLab API를 제공합니다. job 큐로는 Sidekiq을 사용하며, Sidekiq은 Redis를 job 정보, 메타데이터, 수신 job의 비영속(non-persistent) 데이터베이스 백엔드로 사용합니다.

기본적으로 Puma와 Workhorse 간의 통신은 Unix 도메인 소켓을 통해 이루어지지만, TCP를 통한 요청 전달도 지원됩니다. Workhorse는 gitlab/public 디렉터리에 접근하여 Puma 애플리케이션 서버를 거치지 않고 정적 페이지, 업로드(예: 아바타 이미지나 첨부 파일), 사전 컴파일된 에셋을 직접 제공합니다.

GitLab 애플리케이션은 영속적인 데이터베이스 정보(예: 사용자, 권한, 이슈, 기타 메타데이터)를 저장하기 위해 PostgreSQL을 사용합니다. GitLab은 베어(bare) Git 리포지터리를 설정 파일의 repositories: 섹션에 정의된 위치에 저장합니다. 또한 기본 브랜치와 훅 정보도 베어 리포지터리에 함께 보관합니다.

HTTP/HTTPS를 통해 리포지터리를 제공할 때 GitLab은 GitLab API를 사용하여 인가 및 접근을 처리하고 Git 오브젝트를 제공합니다.

애드온 컴포넌트인 GitLab Shell은 SSH를 통해 리포지터리를 제공합니다. 설정 파일의 GitLab Shell 섹션에 정의된 위치 내에서 SSH 키를 관리합니다. 해당 위치의 파일은 절대 수동으로 편집해서는 안 됩니다. GitLab Shell은 Gitaly를 통해 베어 리포지터리에 접근하여 Git 오브젝트를 제공하며, Redis와 통신하여 GitLab이 처리할 job을 Sidekiq에 제출합니다. GitLab Shell은 인가 및 접근 여부를 확인하기 위해 GitLab API를 조회합니다.

Gitaly는 GitLab Shell과 GitLab 웹 앱으로부터 Git 작업을 실행하며, GitLab 웹 앱에 Git 속성(예: 제목, 브랜치, 태그, 기타 메타데이터)을 가져오고 블롭(예: diff, 커밋, 파일)을 조회할 수 있는 API를 제공합니다.

GitLab.com의 프로덕션 아키텍처도 참고해 보세요.

기존 컴포넌트 수정 및 새 컴포넌트 도입#

애플리케이션이 전통적인 Linux 머신에 설치될 때와 쿠버네티스 같은 컨테이너화된 플랫폼에서 실행될 때는 동작 방식에 근본적인 차이가 있습니다.

공식 설치 방법과 비교하여 주요 차이점은 다음과 같습니다:

  • 공식 Linux 패키지는 동일한 파일 시스템에서 여러 서비스가 파일에 접근할 수 있습니다. 공유 파일은 쿠버네티스 플랫폼에서 실행되는 애플리케이션에는 사용할 수 없는 옵션입니다.

  • 공식 Linux 패키지는 기본적으로 공유 설정과 네트워크에 접근할 수 있는 서비스를 포함합니다. 쿠버네티스에서 실행되는 서비스는 완전히 격리되거나 특정 포트를 통해서만 접근 가능할 수 있으므로 이와 다를 수 있습니다.

즉, 새로운 기능을 설계하고 새 컴포넌트를 추가할 때는 서비스 간 공유 상태를 신중하게 고려해야 합니다. 동일한 파일에 접근해야 하는 서비스는 적절한 API를 통해 정보를 교환할 수 있어야 합니다. 가능하면 파일을 통한 방식은 지양해야 합니다.

API 우선 철학으로 작성된 컴포넌트는 두 가지 방법 모두와 호환되므로, 모든 새로운 기능과 서비스는 쿠버네티스 호환성을 우선으로 고려하여 작성해야 합니다.

이를 보장하는 가장 간단한 방법은 공식 GitLab Helm chart에 기능 또는 서비스 지원을 추가하거나 Distribution 팀에 문의하는 것입니다.

자세한 내용은 새 서비스 컴포넌트 추가 프로세스를 참조하세요.

간략한 컴포넌트 개요#

다음은 GitLab 아키텍처를 이해하기 위한 단순화된 아키텍처 다이어그램입니다.

전체 아키텍처 다이어그램은 아래의 컴포넌트 다이어그램에서 확인할 수 있습니다.

%%{init: {"flowchart": { "useMaxWidth": false } }}%% graph TB %% Component declarations and formatting HTTP((HTTP/HTTPS)) SSH((SSH)) GitLabPages(GitLab Pages) GitLabWorkhorse(GitLab Workhorse) GitLabShell(GitLab Shell) Gitaly(Gitaly) Puma("Puma (Gitlab Rails)") Sidekiq("Sidekiq (GitLab Rails)") PostgreSQL(PostgreSQL) Redis(Redis)

HTTP -- TCP 80,443 --> NGINX SSH -- TCP 22 --> GitLabShell

NGINX -- TCP 8090 --> GitLabPages NGINX --> GitLabWorkhorse

GitLabShell --> Gitaly GitLabShell --> GitLabWorkhorse

GitLabWorkhorse --> Gitaly GitLabWorkhorse --> Puma GitLabWorkhorse --> Redis

Sidekiq --> PostgreSQL Sidekiq --> Redis

Puma --> PostgreSQL Puma --> Redis Puma --> Gitaly

Gitaly --> GitLabWorkhorse

별도로 명시된 경우를 제외하고 모든 연결은 Unix 소켓을 사용합니다.

컴포넌트 다이어그램#

%%{init: {"flowchart": { "useMaxWidth": false } }}%% graph LR %% Anchor items in the appropriate subgraph. %% Link them where the destination* is.

subgraph Clients Browser((Browser)) Git((Git)) end

%% External Components / Applications Geo{{GitLab Geo}} -- TCP 80, 443 --> HTTP Geo -- TCP 22 --> SSH Geo -- TCP 5432 --> PostgreSQL Runner{{GitLab Runner}} -- TCP 443 --> HTTP K8sAgent{{GitLab agent}} -- TCP 443 --> HTTP

%% GitLab Application Suite subgraph GitLab subgraph Ingress HTTP[[HTTP/HTTPS]] SSH[[SSH]] NGINX[NGINX] GitLabShell[GitLab Shell]

    %% inbound/internal
    Browser -- TCP 80,443 --> HTTP
    Git -- TCP 80,443 --> HTTP
    Git -- TCP 22 --> SSH
    HTTP -- TCP 80, 443 --> NGINX
    SSH -- TCP 22 --> GitLabShell
end

subgraph GitLab Services
    %% inbound from NGINX
    NGINX --> GitLabWorkhorse
    NGINX -- TCP 8090 --> GitLabPages
    NGINX -- TCP 8150 --> GitLabKas
    NGINX --> Registry
    %% inbound from GitLabShell
    GitLabShell --> GitLabWorkhorse

    %% services
    Puma["Puma (GitLab Rails)"]
    Puma <--> Registry
    GitLabWorkhorse[GitLab Workhorse] <--> Puma
    GitLabKas[GitLab agent server] --> GitLabWorkhorse
    GitLabPages[GitLab Pages] --> GitLabWorkhorse
    Mailroom
    Sidekiq
end

subgraph Integrated Services
    %% Mattermost
    Mattermost
    Mattermost ---> GitLabWorkhorse
    NGINX --> Mattermost

    %% Grafana
    Grafana
    NGINX --> Grafana
end

subgraph Metadata
    %% PostgreSQL
    PostgreSQL
    PostgreSQL --> Consul

    %% Consul and inbound
    Consul
    Puma ---> Consul
    Sidekiq ---> Consul
    Migrations --> PostgreSQL

    %% PgBouncer and inbound
    PgBouncer
    PgBouncer --> Consul
    PgBouncer --> PostgreSQL
    Sidekiq --> PgBouncer
    Puma --> PgBouncer
end

subgraph State
    %% Redis and inbound
    Redis
    Puma --> Redis
    Sidekiq --> Redis
    GitLabWorkhorse --> Redis
    Mailroom --> Redis
    GitLabKas --> Redis

    %% Sentinel and inbound
    Sentinel <--> Redis
    Puma --> Sentinel
    Sidekiq --> Sentinel
    GitLabWorkhorse --> Sentinel
    Mailroom --> Sentinel
    GitLabKas --> Sentinel
end

subgraph Git Repositories
    %% Gitaly / Praefect
    Praefect --> Gitaly
    GitLabKas --> Praefect
    GitLabShell --> Praefect
    GitLabWorkhorse --> Praefect
    Puma --> Praefect
    Sidekiq --> Praefect
    Praefect <--> PraefectPGSQL[PostgreSQL]
    %% Gitaly makes API calls
    %% Ordered here to ensure placement.
    Gitaly --> GitLabWorkhorse
end

subgraph Storage
    %% ObjectStorage and inbound traffic
    ObjectStorage["Object storage"]
    Puma -- TCP 443 --> ObjectStorage
    Sidekiq -- TCP 443 --> ObjectStorage
    GitLabWorkhorse -- TCP 443 --> ObjectStorage
    Registry -- TCP 443 --> ObjectStorage
    GitLabPages -- TCP 443 --> ObjectStorage
    %% Gitaly can perform repository backups to object storage.
    Gitaly --> ObjectStorage
end

subgraph Monitoring
    %% Prometheus
    Grafana -- TCP 9090 --> Prometheus[Prometheus]
    Prometheus -- TCP 80, 443 --> Puma
    RedisExporter[Redis Exporter] --> Redis
    Prometheus -- TCP 9121 --> RedisExporter
    PostgreSQLExporter[PostgreSQL Exporter] --> PostgreSQL
    PgBouncerExporter[PgBouncer Exporter] --> PgBouncer
    Prometheus -- TCP 9187 --> PostgreSQLExporter
    Prometheus -- TCP 9100 --> NodeExporter[Node Exporter]
    Prometheus -- TCP 9168 --> GitLabExporter[GitLab Exporter]
    Prometheus -- TCP 9127 --> PgBouncerExporter
    Prometheus --> Alertmanager
    GitLabExporter --> PostgreSQL
    GitLabExporter --> GitLabShell
    GitLabExporter --> Sidekiq

    %% Alertmanager
    Alertmanager -- TCP 25 --> SMTP
end

%% end subgraph GitLab end

subgraph External subgraph External Services SMTP[SMTP Gateway] LDAP

    %% Outbound SMTP
    Sidekiq -- TCP 25 --> SMTP
    Puma -- TCP 25 --> SMTP
    Mailroom -- TCP 25 --> SMTP

    %% Outbound LDAP
    Puma -- TCP 369 --> LDAP
    Sidekiq -- TCP 369 --> LDAP

    %% Elasticsearch
    Elasticsearch
    Puma -- TCP 9200 --> Elasticsearch
    Sidekiq -- TCP 9200 --> Elasticsearch
    Elasticsearch --> Praefect

    %% Zoekt
    Zoekt --> Praefect
end
subgraph External Monitoring
    %% Sentry
    Sidekiq -- TCP 80, 443 --> Sentry
    Puma -- TCP 80, 443 --> Sentry

    %% Jaeger
    Jaeger
    Sidekiq -- UDP 6831 --> Jaeger
    Puma -- UDP 6831 --> Jaeger
    Gitaly -- UDP 6831 --> Jaeger
    GitLabShell -- UDP 6831 --> Jaeger
    GitLabWorkhorse -- UDP 6831 --> Jaeger
end

%% end subgraph External end

click Alertmanager "#alertmanager" click Praefect "#praefect" click Geo "#gitlab-geo" click NGINX "#nginx" click Runner "#gitlab-runner" click Registry "#registry" click ObjectStorage "#object-storage" click Mattermost "#mattermost" click Gitaly "#gitaly" click Jaeger "#jaeger" click GitLabWorkhorse "#gitlab-workhorse" click LDAP "#ldap-authentication" click Puma "#puma" click GitLabShell "#gitlab-shell" click SSH "#ssh-request-22" click Sidekiq "#sidekiq" click Sentry "#sentry" click GitLabExporter "#gitlab-exporter" click Elasticsearch "#elasticsearch" click Migrations "#database-migrations" click PostgreSQL "#postgresql" click Consul "#consul" click PgBouncer "#pgbouncer" click PgBouncerExporter "#pgbouncer-exporter" click RedisExporter "#redis-exporter" click Redis "#redis" click Prometheus "#prometheus" click Grafana "#grafana" click GitLabPages "#gitlab-pages" click PostgreSQLExporter "#postgresql-exporter" click SMTP "#outbound-email" click NodeExporter "#node-exporter"

컴포넌트 범례#

  • ✅ - 기본 설치됨

  • ⚙ - 추가 설정 필요

  • ⤓ - 수동 설치 필요

  • ❌ - 지원되지 않거나 안내 없음

  • N/A - 해당 없음

컴포넌트 상태는 각 컴포넌트의 설정 문서로 연결됩니다.

컴포넌트 목록#

컴포넌트 설명 Omnibus GitLab GitLab Environment Toolkit (GET) GitLab chart minikube Minimal GitLab.com Source GDK CE/EE
AI Gateway GitLab AI 네이티브 기능 EE Only
GitLab Duo Workflow Service GitLab AI 네이티브 기능 EE Only
Certificate Management TLS 설정, Let's Encrypt CE & EE
Consul 데이터베이스 노드 검색, 장애 조치 EE Only
Database Migrations 데이터베이스 마이그레이션 CE & EE
Elasticsearch GitLab 내 향상된 검색 EE Only
Gitaly GitLab의 모든 Git 호출을 처리하는 Git RPC 서비스 CE & EE
GitLab Exporter 다양한 GitLab 메트릭 생성 CE & EE
GitLab Geo 지리적으로 분산된 GitLab 사이트 EE Only
GitLab Pages 정적 웹사이트 호스팅 CE & EE
GitLab agent for Kubernetes 클라우드 네이티브 방식으로 쿠버네티스 클러스터 통합 EE Only
GitLab self-monitoring: Alertmanager Prometheus의 알림을 중복 제거, 그룹화 및 라우팅 CE & EE
GitLab self-monitoring: Grafana 메트릭 대시보드 CE & EE
GitLab self-monitoring: Jaeger GitLab 인스턴스에서 생성된 트레이스 확인 CE & EE
GitLab self-monitoring: Prometheus 시계열 데이터베이스, 메트릭 수집 및 쿼리 서비스 CE & EE
GitLab self-monitoring: Sentry GitLab 인스턴스에서 발생한 오류 추적 CE & EE
GitLab Shell SSH를 통한 git 세션 처리 CE & EE
GitLab Workhorse 스마트 리버스 프록시, 대용량 HTTP 요청 처리 CE & EE
Inbound email (SMTP) 이슈 업데이트를 위한 메시지 수신 CE & EE
Jaeger integration 배포된 앱의 분산 추적 EE Only
LDAP Authentication 중앙화된 LDAP 디렉터리에 대해 사용자 인증 CE & EE
Mattermost 오픈 소스 Slack 대안 CE & EE
Object storage S3 호환 오브젝트 스토리지 서비스 CE & EE
NGINX 적절한 컴포넌트로 요청 라우팅, SSL 종료 CE & EE
Node Exporter 시스템 메트릭을 제공하는 Prometheus 엔드포인트 N/A N/A CE & EE
Outbound email (SMTP) 사용자에게 이메일 메시지 전송 CE & EE
Patroni PostgreSQL HA 클러스터 리더 선출 및 복제 관리 EE Only
PgBouncer Exporter PgBouncer 메트릭을 제공하는 Prometheus 엔드포인트 CE & EE
PgBouncer 데이터베이스 연결 풀링, 장애 조치 EE Only
PostgreSQL Exporter PostgreSQL 메트릭을 제공하는 Prometheus 엔드포인트 CE & EE
PostgreSQL 데이터베이스 CE & EE
Praefect Git 클라이언트와 Gitaly 스토리지 노드 사이의 투명한 프록시 CE & EE
Puma (GitLab Rails) 웹 인터페이스 및 API 요청 처리 CE & EE
Redis Exporter Redis 메트릭을 제공하는 Prometheus 엔드포인트 CE & EE
Redis 캐싱 서비스 CE & EE
Registry 컨테이너 레지스트리, 이미지 푸시 및 풀 허용 CE & EE
Runner GitLab CI/CD job 실행 CE & EE
Sentry integration 배포된 앱의 오류 추적 CE & EE
Sidekiq 백그라운드 job 처리기 CE & EE
Token Revocation API 유출된 시크릿 수신 및 취소 EE Only

컴포넌트 세부 정보#

이 문서는 GitLab 내부 구조와 컴포넌트 간 상호작용을 더 깊이 이해하고자 하는 시스템 관리자 및 GitLab 지원 엔지니어를 위해 작성되었습니다.

GitLab을 배포할 때는 아래에 설명된 프로세스들의 집합체로 이해해야 합니다. 문제를 해결하거나 디버깅할 때는 참조하는 컴포넌트를 최대한 구체적으로 명시하는 것이 좋습니다. 그렇게 하면 명확성이 높아지고 혼란을 줄일 수 있습니다.

레이어

프로세스 관점에서 GitLab은 두 가지 레이어로 구성됩니다:

  • 모니터링(Monitoring): 이 레이어의 항목은 GitLab 애플리케이션을 제공하는 데 필수적이지는 않지만, 관리자에게 인프라와 서비스 전반의 상태에 대한 더 깊은 인사이트를 제공합니다.

  • 코어(Core): GitLab 플랫폼 제공에 필수적인 프로세스입니다. 이 프로세스 중 하나라도 중단되면 GitLab 장애가 발생합니다. 코어 레이어는 다음과 같이 세분화할 수 있습니다:

프로세서(Processors): 실제 작업을 수행하고 서비스를 제공하는 프로세스입니다.

  • 데이터(Data): GitLab 서비스를 위한 구조화된 데이터를 저장하거나 제공하는 서비스입니다.

Alertmanager#

Omnibus

Alert manager는 Prometheus에서 제공하는 도구로, "Prometheus 서버와 같은 클라이언트 애플리케이션에서 보낸 알림을 처리합니다. 알림의 중복을 제거하고, 그룹화하고, 이메일, PagerDuty, Opsgenie 등의 올바른 수신자 통합으로 라우팅합니다. 또한 알림의 묵음(silencing) 및 억제(inhibition)도 처리합니다." 어떤 항목을 알림으로 설정하는지에 대해서는 이슈 #45740에서 더 자세히 확인할 수 있습니다.

AI Gateway#

  • 프로젝트 페이지:

Charts

  • 설정:

Source

GitLab AI Gateway는 self-managed, dedicated, GitLab.com 등 어떤 인스턴스를 사용하더라도 모든 GitLab 사용자가 AI 기능을 사용할 수 있도록 해주는 독립 실행형 서비스입니다.

자세한 내용은 다음을 참조하세요:

GitLab Duo Workflow Service#

  • 프로젝트 페이지:

Charts

  • 설정:

Source

GitLab Duo Workflow Service는 Runway 서비스를 통해 배포되는 에이전틱(agentic) AI 기능입니다.

자세한 내용은 다음을 참조하세요:

인증서 관리#

  • 프로젝트 페이지:

Omnibus

Omnibus

Consul#

Omnibus

  • Charts

  • 레이어: 코어 서비스(데이터)

  • GitLab.com: Consul

Consul은 서비스 검색 및 설정을 위한 도구입니다. Consul은 분산형, 고가용성, 고확장성을 갖추고 있습니다.

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

  • 설정:

Omnibus

Elasticsearch#

Omnibus

Elasticsearch는 클라우드를 위해 구축된 분산형 RESTful 검색 엔진입니다.

Gitaly#

Omnibus

  • Charts

  • Source

  • 레이어: 코어 서비스(데이터)

  • 프로세스: gitaly

Gitaly는 GitLab의 분산 배포(GitLab.com 또는 고가용성 배포 등)에서 Git 스토리지에 NFS가 필요 없도록 하기 위해 GitLab이 설계한 서비스입니다. 11.3.0부터 이 서비스가 GitLab의 모든 Git 수준 접근을 처리합니다. 프로젝트의 README에서 더 자세히 알아볼 수 있습니다.

Praefect#

Omnibus

  • Source

  • 레이어: 코어 서비스(데이터)

  • 프로세스: praefect

Praefect는 각 Git 클라이언트와 Gitaly 사이에서 리포지터리 업데이트를 보조 노드에 복제하는 것을 조율하는 투명한 프록시입니다.

GitLab Geo#

  • 설정:

Omnibus

  • Charts

  • GDK

  • 레이어: 코어 서비스(프로세서)

Geo는 분산된 팀의 개발 속도를 높이기 위해 구축된 프리미엄 기능으로, 기본 GitLab 인스턴스의 하나 이상의 읽기 전용 미러를 제공합니다. 이 미러(Geo 보조 사이트)는 대형 리포지터리나 프로젝트를 클론하거나 가져오는 시간을 줄이거나 재해 복구(Disaster Recovery) 솔루션의 일부로 활용할 수 있습니다.

GitLab Exporter#

Omnibus

GitLab Exporter는 GitLab 애플리케이션 내부 메트릭을 Prometheus로 내보낼 수 있도록 GitLab이 직접 설계한 프로세스입니다. 프로젝트의 README에서 더 자세히 알아볼 수 있습니다.

GitLab agent for Kubernetes#

Omnibus

GitLab agent for Kubernetes는 GitLab과 쿠버네티스 통합 작업을 보안적이고 클라우드 네이티브 방식으로 해결하기 위해 클러스터 내에서 동작하는 액티브 컴포넌트입니다.

이를 사용하여 쿠버네티스 클러스터에 배포를 동기화할 수 있습니다.

GitLab Pages#

  • 설정:

Omnibus

GitLab Pages는 GitLab의 리포지터리에서 직접 정적 웹사이트를 게시할 수 있는 기능입니다.

포트폴리오, 문서, 선언문, 비즈니스 프레젠테이션 등 개인 또는 비즈니스 웹사이트에 활용할 수 있습니다. 또한 콘텐츠에 라이선스를 부여할 수도 있습니다.

GitLab Runner#

Omnibus

GitLab Runner는 job을 실행하고 결과를 GitLab으로 전송합니다.

GitLab CI/CD는 GitLab에 포함된 오픈 소스 지속적 통합 서비스로 테스트를 조율합니다. 이 프로젝트의 이전 이름은 GitLab CI Multi Runner였지만, 지금부터는 GitLab Runner(CI 없이)를 사용해야 합니다.

GitLab Shell#

Omnibus

GitLab Shell은 SSH 기반 git 세션을 처리하고 인가된 키 목록을 수정하기 위해 GitLab에서 설계한 프로그램입니다. GitLab Shell은 Unix 셸이 아니며 Bash나 Zsh의 대체물도 아닙니다.

GitLab Workhorse#

Omnibus

  • Charts

  • Source

  • 레이어: 코어 서비스(프로세서)

  • 프로세스: gitlab-workhorse

GitLab Workhorse는 Puma의 부하를 줄이기 위해 GitLab에서 설계한 프로그램입니다. 개발 배경에 대한 역사적 이유에서 더 자세히 알아볼 수 있습니다. GitLab 전반의 속도를 높이기 위한 스마트 리버스 프록시 역할을 하도록 설계되었습니다.

Grafana#

Omnibus

Grafana는 Graphite, Elasticsearch, OpenTSDB, Prometheus, InfluxDB를 위한 기능이 풍부한 오픈 소스 메트릭 대시보드 및 그래프 편집기입니다.

Jaeger#

Omnibus

Jaeger는 Dapper와 OpenZipkin에서 영감을 받은 분산 추적 시스템입니다. 마이크로서비스 기반 분산 시스템의 모니터링에 활용할 수 있습니다.

Logrotate#

Omnibus

  • 레이어: 코어 서비스

  • 프로세스: logrotate

GitLab은 로그를 기록하는 다수의 서비스로 구성되어 있습니다. 책임 있는 로깅을 보장하기 위해 자체 Logrotate를 번들로 포함합니다. 이는 일반적인 오픈 소스 도구를 패키지로 제공하는 것입니다.

Mattermost#

Omnibus

Mattermost는 https://mattermost.com에서 제공하는 오픈 소스, 프라이빗 클라우드 기반 Slack 대안입니다.

오브젝트 스토리지#

  • 설정:

Omnibus

GitLab은 CI 아티팩트, LFS 오브젝트, 업로드, 컨테이너 레지스트리 이미지 등의 데이터를 저장하기 위해 S3 호환 오브젝트 스토리지가 필요합니다. GitLab은 완전한 S3 API 호환성을 제공하는 모든 오브젝트 스토리지 공급자와 호환됩니다. 공급자 선택은 사용자의 책임입니다. Amazon S3, Google Cloud Storage, Azure Blob Storage와 같은 클라우드 관리형 서비스와 자체 호스팅 S3 호환 솔루션이 일반적으로 사용됩니다.

NGINX#

  • 프로젝트 페이지:

Omnibus

Omnibus

  • Charts

  • Source

  • 레이어: 코어 서비스(프로세서)

  • 프로세스: nginx

NGINX는 모든 HTTP 요청에 대한 Ingress 포트를 갖추고 있으며 요청을 GitLab 내 적절한 하위 시스템으로 라우팅합니다. 수정되지 않은 버전의 인기 오픈 소스 웹 서버를 번들로 제공합니다.

Node Exporter#

Omnibus

Node Exporter는 기본 머신(CPU/디스크/로드 등)에 대한 메트릭을 제공하는 Prometheus 도구입니다. Prometheus 프로젝트의 일반적인 오픈 소스 도구를 패키지로 제공하는 것입니다.

Patroni#

Omnibus

PgBouncer#

Omnibus

PostgreSQL을 위한 경량 연결 풀링 도구입니다.

PgBouncer Exporter#

Omnibus

PgBouncer용 Prometheus 익스포터입니다. 9127/metrics에서 메트릭을 내보냅니다.

PostgreSQL#

Omnibus

GitLab은 애플리케이션 메타데이터와 사용자 정보를 저장하기 위해 인기 있는 데이터베이스를 패키지로 제공합니다.

PostgreSQL Exporter#

Omnibus

postgres_exporter는 커뮤니티에서 제공하는 Prometheus 익스포터로, PostgreSQL 데이터를 Prometheus로 전달하여 Grafana 대시보드에서 활용할 수 있도록 합니다.

Prometheus#

Omnibus

  • Charts

  • 레이어: 모니터링

  • 프로세스: prometheus

  • GitLab.com: Prometheus

Prometheus는 GitLab 관리자가 GitLab 서비스를 제공하는 데 사용되는 개별 프로세스에 대한 메트릭을 노출할 수 있도록 지원하는 시계열 도구입니다.

Redis#

Omnibus

  • Charts

  • Source

  • 레이어: 코어 서비스(데이터)

  • 프로세스: redis

Redis는 다음을 저장하기 위해 패키지로 제공됩니다:

  • 세션 데이터

  • 임시 캐시 정보

  • 백그라운드 job 큐

GitLab이 Redis를 어떻게 사용하는지에 대한 자세한 내용은 Redis 가이드라인을 참조하세요.

Redis Exporter#

Omnibus

Redis Exporter는 Redis 프로세스에 대한 특정 메트릭을 Prometheus에 제공하여 Grafana에서 이를 그래프로 시각화할 수 있도록 설계되었습니다.

Registry#

Omnibus

레지스트리는 사용자가 자신의 Docker 이미지를 저장하는 데 사용하는 컴포넌트입니다. 번들된 레지스트리는 NGINX를 로드 밸런서로 사용하고 GitLab을 인증 관리자로 사용합니다. 클라이언트가 레지스트리에서 이미지를 풀 또는 푸시하려고 요청하면 401 응답과 함께 인증 토큰을 얻을 위치(이 경우 GitLab 인스턴스)를 나타내는 헤더를 반환합니다. 클라이언트는 GitLab에서 풀 또는 푸시 인증 토큰을 요청한 후 레지스트리에 원래 요청을 재시도합니다. 자세한 내용은 토큰 인증을 참조하세요.

외부 레지스트리도 GitLab을 인증 엔드포인트로 사용하도록 설정할 수 있습니다.

Sentry#

Omnibus

Sentry는 근본적으로 실시간으로 크래시를 모니터링하고 수정할 수 있도록 지원하는 서비스입니다. 서버는 Python으로 작성되었지만 모든 언어, 모든 애플리케이션에서 이벤트를 전송할 수 있는 완전한 API를 제공합니다.

배포된 앱의 모니터링을 위해서는 Sentry 통합 문서를 참조하세요.

Sidekiq#

Omnibus

Sidekiq은 Redis 큐에서 job을 꺼내 처리하는 Ruby 백그라운드 job 처리기입니다. 백그라운드 job을 통해 GitLab은 작업을 백그라운드로 이동하여 더 빠른 요청/응답 사이클을 제공합니다.

Puma#

GitLab 13.0부터 Puma가 기본 웹 서버입니다.

Omnibus

  • Charts

  • Source

  • GDK

  • 레이어: 코어 서비스(프로세서)

  • 프로세스: puma

  • GitLab.com: Puma

Puma는 GitLab에서 사용자 대면 기능을 제공하는 핵심 Rails 애플리케이션을 실행하는 Ruby 애플리케이션 서버입니다. GitLab 버전에 따라 프로세스 출력에서 bundle 또는 config.ru로 표시될 수 있습니다.

LDAP Authentication#

  • 설정:

Omnibus

아웃바운드 이메일#

  • 설정:

Omnibus

인바운드 이메일#

  • 설정:

Omnibus

요청 유형별 GitLab#

GitLab은 최종 사용자가 서비스에 접근할 수 있는 두 가지 "인터페이스"를 제공합니다:

  • 웹 HTTP 요청 (UI/API 조회)

  • Git HTTP/SSH 요청 (Git 데이터 푸시/풀)

일부 프로세스는 두 방식 모두에서 사용되고, 일부는 특정 요청 유형에만 사용되므로 이 차이를 이해하는 것이 중요합니다.

GitLab 웹 HTTP 요청 사이클#

HTTP 엔드포인트(예: /users/sign_in)에 요청할 때 요청은 GitLab 서비스를 통해 다음 경로를 거칩니다:

  • NGINX - 첫 번째 리버스 프록시 역할을 합니다.

  • GitLab Workhorse - Rails 애플리케이션으로 가야 할지, Puma의 부하를 줄이기 위해 다른 곳으로 가야 할지 결정합니다.

  • Puma - 웹 요청이고 애플리케이션에 접근해야 하므로 Puma로 라우팅됩니다.

  • PostgreSQL/Gitaly/Redis - 요청 유형에 따라 데이터를 저장하거나 조회하기 위해 이 서비스들에 접근할 수 있습니다.

GitLab Git 요청 사이클#

아래에서는 HTTP와 SSH Git 요청이 각각 취하는 다른 경로를 설명합니다. 웹 요청 사이클과 일부 겹치는 부분도 있고 차이점도 있습니다.

웹 요청 (80/443)#

HTTP를 통한 Git 작업은 Git 문서에 설명된 상태 비저장(stateless) "스마트" 프로토콜을 사용하지만, 이러한 작업을 처리하는 책임은 여러 GitLab 컴포넌트에 분산됩니다.

다음은 git fetch에 대한 시퀀스 다이어그램입니다. 모든 요청은 NGINX 및 기타 HTTP 로드 밸런서를 통과하지만, 이들에 의해 변환되지 않습니다. 모든 경로는 /namespace/project.git URL을 기준으로 표시됩니다.

sequenceDiagram participant Git on client participant NGINX participant Workhorse participant Rails participant Gitaly participant Git on server

Note left of Git on client: git fetch<br/>info-refs
Git on client->>+Workhorse: GET /info/refs?service=git-upload-pack
Workhorse->>+Rails: GET /info/refs?service=git-upload-pack
Note right of Rails: Auth check
Rails-->>-Workhorse: Gitlab::Workhorse.git_http_ok
Workhorse->>+Gitaly: SmartHTTPService.InfoRefsUploadPack request
Gitaly->>+Git on server: git upload-pack --stateless-rpc --advertise-refs
Git on server-->>-Gitaly: git upload-pack response
Gitaly-->>-Workhorse: SmartHTTPService.InfoRefsUploadPack response
Workhorse-->>-Git on client: 200 OK

Note left of Git on client: git fetch<br/>fetch-pack
Git on client->>+Workhorse: POST /git-upload-pack
Workhorse->>+Rails: POST /git-upload-pack
Note right of Rails: Auth check
Rails-->>-Workhorse: Gitlab::Workhorse.git_http_ok
Workhorse->>+Gitaly: SmartHTTPService.PostUploadPack request
Gitaly->>+Git on server: git upload-pack --stateless-rpc
Git on server-->>-Gitaly: git upload-pack response
Gitaly-->>-Workhorse: SmartHTTPService.PostUploadPack response
Workhorse-->>-Git on client: 200 OK

git push도 동일한 시퀀스를 따르지만, git-upload-pack 대신 git-receive-pack이 사용됩니다.

SSH 요청 (22)#

SSH를 통한 Git 작업은 Git 문서에 설명된 상태 저장(stateful) 프로토콜을 사용할 수 있지만, 이를 처리하는 책임은 여러 GitLab 컴포넌트에 분산됩니다.

어떤 GitLab 컴포넌트도 SSH를 직접 사용하지 않습니다. 모든 SSH 연결은 클라이언트 머신의 Git과 연결을 종료하는 SSH 서버 사이에서 이루어집니다. SSH 서버는 모든 연결을 git 사용자로 인증되었다고 처리하며, GitLab 사용자는 클라이언트가 제시한 SSH 키로 구별됩니다.

다음은 Fast SSH key lookup이 활성화되어 있다고 가정한 git fetch의 시퀀스 다이어그램입니다. AuthorizedKeysCommandGitLab Shell이 제공하는 실행 파일입니다:

sequenceDiagram participant Git on client participant SSH server participant AuthorizedKeysCommand participant GitLab Shell participant Rails participant Gitaly participant Git on server

Note left of Git on client: git fetch
Git on client->>+SSH server: ssh git fetch-pack request
SSH server->>+AuthorizedKeysCommand: gitlab-shell-authorized-keys-check git AAAA...
AuthorizedKeysCommand->>+Rails: GET /internal/api/authorized_keys?key=AAAA...
Note right of Rails: Lookup key ID
Rails-->>-AuthorizedKeysCommand: 200 OK, command="gitlab-shell upload-pack key_id=1"
AuthorizedKeysCommand-->>-SSH server: command="gitlab-shell upload-pack key_id=1"
SSH server->>+GitLab Shell: gitlab-shell upload-pack key_id=1
GitLab Shell->>+Rails: GET /internal/api/allowed?action=upload_pack&key_id=1
Note right of Rails: Auth check
Rails-->>-GitLab Shell: 200 OK, { gitaly: ... }
GitLab Shell->>+Gitaly: SSHService.SSHUploadPack request
Gitaly->>+Git on server: git upload-pack request
Note over Git on client,Git on server: Bidirectional communication between Git client and server
Git on server-->>-Gitaly: git upload-pack response
Gitaly -->>-GitLab Shell: SSHService.SSHUploadPack response
GitLab Shell-->>-SSH server: gitlab-shell upload-pack response
SSH server-->>-Git on client: ssh git fetch-pack response

git push 작업도 매우 유사하지만, git upload-pack 대신 git receive-pack이 사용됩니다.

Fast SSH key lookup이 활성화되어 있지 않은 경우, SSH 서버는 ~git/.ssh/authorized_keys 파일을 읽어 주어진 SSH 세션에서 실행할 명령을 결정합니다. 이 파일은 사용자가 SSH 키를 수정할 때마다 실행되도록 예약된 Rails의 AuthorizedKeysWorker가 최신 상태로 유지합니다.

SSH 인증서를 키 대신 사용할 수도 있습니다. 이 경우 AuthorizedKeysCommandAuthorizedPrincipalsCommand로 대체됩니다. 이는 Rails 내부 API를 사용하지 않고 인증서에서 사용자 이름을 추출하며, 이후 /api/internal/allowed 호출에서 key_id 대신 사용됩니다.

GitLab Shell에는 Gitaly를 포함하지 않는 몇 가지 작업도 있습니다(예: 이중 인증 코드 재설정 등). 이러한 작업도 동일한 방식으로 처리되지만, Gitaly로의 왕복이 없습니다. Rails가 내부 API 호출의 일부로 작업을 수행하고, GitLab Shell이 사용자에게 직접 응답을 스트리밍합니다.

시스템 레이아웃#

그림에서 ~git는 일반적으로 /home/git인 Git 사용자의 홈 디렉터리를 의미합니다.

GitLab은 주로 git 사용자로서 /home/git 사용자 홈 디렉터리 내에 설치됩니다. 홈 디렉터리에는 GitLab 서버 소프트웨어와 리포지터리가 있습니다(리포지터리 위치는 설정에서 변경 가능합니다).

베어 리포지터리는 /home/git/repositories에 위치합니다. GitLab은 Ruby on Rails 애플리케이션이므로 내부 동작의 세부 사항은 Ruby on Rails 애플리케이션의 동작 방식을 학습함으로써 이해할 수 있습니다.

SSH를 통해 리포지터리를 제공하기 위해 /home/git/gitlab-shell에 설치된 GitLab Shell이라는 애드온 애플리케이션을 사용합니다.

설치 폴더 요약#

다음은 git 사용자 홈 디렉터리의 디렉터리 구조를 요약한 것입니다.

프로세스#

ps aux | grep '^git'

GitLab을 운영하려면 여러 컴포넌트가 필요합니다. 영속 데이터베이스(PostgreSQL)와 Redis 데이터베이스가 필요하며, Apache httpd 또는 NGINX를 사용하여 Puma로 proxypass합니다. 이러한 모든 컴포넌트는 GitLab과 다른 시스템 사용자(postgres, redis, www-data 등, git 대신)로 실행되어야 합니다.

git 사용자로 Sidekiq과 Puma(기본적으로 포트 8080에서 실행되는 단순 Ruby HTTP 서버)를 시작합니다. GitLab 사용자 하에는 보통 4개의 프로세스가 있습니다: puma master(1개 프로세스), puma cluster worker(2개 프로세스), sidekiq(1개 프로세스).

리포지터리 접근#

리포지터리는 HTTP 또는 SSH를 통해 접근합니다. HTTP 클론/푸시/풀은 GitLab API를 사용하며, SSH 클론은 GitLab Shell이 처리합니다(앞서 설명됨).

트러블슈팅#

자세한 내용은 README를 참조하세요.

서비스 Init 스크립트#

GitLab init 스크립트는 Puma와 Sidekiq을 시작하고 중지합니다:

/etc/init.d/gitlab
Usage: service gitlab {start|stop|restart|reload|status}

Redis(키-값 스토어/비영속 데이터베이스):

/etc/init.d/redis
Usage: /etc/init.d/redis {start|stop|status|restart|condrestart|try-restart}

SSH 데몬:

/etc/init.d/sshd
Usage: /etc/init.d/sshd {start|stop|restart|reload|force-reload|condrestart|try-restart|status}

웹 서버(다음 중 하나):

/etc/init.d/httpd
Usage: httpd {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}

$ /etc/init.d/nginx
Usage: nginx {start|stop|restart|reload|force-reload|status|configtest}

영속 데이터베이스:

$ /etc/init.d/postgresql
Usage: /etc/init.d/postgresql {start|stop|restart|reload|force-reload|status} [version ..]

서비스 로그 위치#

GitLab(Puma 및 Sidekiq 로그 포함):

  • /home/git/gitlab/log/에는 보통 application.log, production.log, sidekiq.log, puma.stdout.log, git_json.log, puma.stderr.log가 있습니다.

GitLab Shell:

  • /home/git/gitlab-shell/gitlab-shell.log

SSH:

  • /var/log/auth.log 인증 로그(Ubuntu 기준).

  • /var/log/secure 인증 로그(RHEL 기준).

NGINX:

  • /var/log/nginx/에 오류 및 접근 로그가 있습니다.

Apache httpd:

  • Apache 로그 설명.

  • /var/log/apache2/에 오류 및 출력 로그가 있습니다(Ubuntu 기준).

  • /var/log/httpd/에 오류 및 출력 로그가 있습니다(RHEL 기준).

Redis:

  • /var/log/redis/redis.log에 있으며, 로테이션된 로그도 여기에 있습니다.

PostgreSQL:

  • /var/log/postgresql/*

GitLab 특정 설정 파일#

GitLab의 설정 파일은 /home/git/gitlab/config/*에 위치합니다. 일반적으로 참조되는 설정 파일은 다음과 같습니다:

  • gitlab.yml: GitLab Rails 설정

  • puma.rb: Puma 웹 서버 설정

  • database.yml: 데이터베이스 연결 설정

GitLab Shell의 설정 파일은 /home/git/gitlab-shell/config.yml에 있습니다.

GitLab Rails에 새 설정 추가하기#

gitlab.yml에 포함되어야 하는 설정은 다음과 관련된 것들입니다:

  • 여러 서비스에 걸쳐 애플리케이션이 어떻게 연결되는지. 예: Gitaly 주소, Redis 주소, Postgres 주소, Consul 주소.

  • 분산 추적(Distributed Tracing) 설정 및 일부 관측 가능성(observability) 설정. 예: 히스토그램 버킷 경계.

  • Postgres 연결이 설정되기 이전에 Rails 초기화 중에 설정되어야 하는 것들.

그 외의 많은 설정은 ApplicationSetting의 앱 자체에 두는 것이 더 적합합니다. UI에서 설정을 관리하는 것이 설정 파일을 직접 관리하는 것보다 일반적으로 더 나은 사용자 경험을 제공합니다. 개발 비용 측면에서 gitlab.yml 수정이 더 빠른 반복처럼 보일 수 있지만, 아래의 모든 배포 방법을 고려하면 좋지 않은 트레이드오프일 수 있습니다.

gitlab.yml에 설정을 추가할 때:

유지보수 작업#

GitLab은 버전 정보를 확인하고 애플리케이션 내에서 설정이 올바르게 구성되었는지 빠르게 점검할 수 있는 Rake 태스크를 제공합니다. 유지보수 Rake 태스크를 참조하세요. 간단히 정리하면 다음을 실행하세요:

sudo -i -u git
cd gitlab
bundle exec rake gitlab:env:info RAILS_ENV=production
bundle exec rake gitlab:check RAILS_ENV=production

sudo -i -u git 또는 sudo su - git을 사용하여 git 사용자로 로그인하는 것을 권장합니다. GitLab에서 제공하는 sudo 명령은 Ubuntu에서는 동작하지만 RHEL에서는 항상 동작하지 않을 수 있습니다.

GitLab.com#

GitLab.com 아키텍처는 참고를 위해 상세히 설명되어 있지만, 이 아키텍처는 수백만 명의 사용자가 있을 때만 유용합니다.

AI 아키텍처#

AI 네이티브 기능을 활성화하기 위한 SaaS 모델 게이트웨이가 제공됩니다.

GitLab 아키텍처 개요

GitLab v19.1
원문 보기
요약

GitLab에는 두 가지 소프트웨어 배포판이 있습니다: 오픈 소스 Community Edition (CE). 오픈 코어 Enterprise Edition (EE). EE 리포지터리는 보관(archived) 처리되었습니다.

소프트웨어 배포#

GitLab에는 두 가지 소프트웨어 배포판이 있습니다:

EE 리포지터리는 보관(archived) 처리되었습니다. GitLab은 현재 단일 코드베이스로 운영됩니다.

GitLab은 다양한 구독 플랜으로 이용할 수 있습니다.

새 버전의 GitLab은 안정(stable) 브랜치에서 릴리즈되며, main 브랜치는 최신 개발 버전에 사용됩니다.

자세한 내용은 GitLab 릴리즈 프로세스를 참조하세요.

두 배포판 모두 추가 컴포넌트가 필요합니다. 이 컴포넌트들은 아래 컴포넌트 세부 정보 섹션에서 설명되며, 각각 독립적인 리포지터리를 갖습니다. 각 종속 컴포넌트의 새 버전은 보통 태그로 관리되지만, GitLab 코드베이스의 main 브랜치를 유지하면 해당 컴포넌트들의 최신 안정 버전을 사용할 수 있습니다. 새 버전은 일반적으로 GitLab 릴리즈와 거의 동시에 출시되며, 긴급 보안 업데이트는 예외일 수 있습니다.

컴포넌트#

GitLab의 일반적인 설치 환경은 GNU/Linux이지만, 쿠버네티스 플랫폼을 사용하는 배포 사례도 점점 증가하고 있습니다. 가장 큰 GitLab 인스턴스는 GitLab.com으로, 공식 GitLab Helm chart공식 Linux 패키지를 사용하여 배포됩니다.

일반적인 설치에서는 NGINX 또는 Apache를 웹 서버로 사용하여 GitLab Workhorse를 통해 Puma 애플리케이션 서버로 요청을 프록시합니다. GitLab은 Puma 애플리케이션 서버를 사용하여 웹 페이지와 GitLab API를 제공합니다. job 큐로는 Sidekiq을 사용하며, Sidekiq은 Redis를 job 정보, 메타데이터, 수신 job의 비영속(non-persistent) 데이터베이스 백엔드로 사용합니다.

기본적으로 Puma와 Workhorse 간의 통신은 Unix 도메인 소켓을 통해 이루어지지만, TCP를 통한 요청 전달도 지원됩니다. Workhorse는 gitlab/public 디렉터리에 접근하여 Puma 애플리케이션 서버를 거치지 않고 정적 페이지, 업로드(예: 아바타 이미지나 첨부 파일), 사전 컴파일된 에셋을 직접 제공합니다.

GitLab 애플리케이션은 영속적인 데이터베이스 정보(예: 사용자, 권한, 이슈, 기타 메타데이터)를 저장하기 위해 PostgreSQL을 사용합니다. GitLab은 베어(bare) Git 리포지터리를 설정 파일의 repositories: 섹션에 정의된 위치에 저장합니다. 또한 기본 브랜치와 훅 정보도 베어 리포지터리에 함께 보관합니다.

HTTP/HTTPS를 통해 리포지터리를 제공할 때 GitLab은 GitLab API를 사용하여 인가 및 접근을 처리하고 Git 오브젝트를 제공합니다.

애드온 컴포넌트인 GitLab Shell은 SSH를 통해 리포지터리를 제공합니다. 설정 파일의 GitLab Shell 섹션에 정의된 위치 내에서 SSH 키를 관리합니다. 해당 위치의 파일은 절대 수동으로 편집해서는 안 됩니다. GitLab Shell은 Gitaly를 통해 베어 리포지터리에 접근하여 Git 오브젝트를 제공하며, Redis와 통신하여 GitLab이 처리할 job을 Sidekiq에 제출합니다. GitLab Shell은 인가 및 접근 여부를 확인하기 위해 GitLab API를 조회합니다.

Gitaly는 GitLab Shell과 GitLab 웹 앱으로부터 Git 작업을 실행하며, GitLab 웹 앱에 Git 속성(예: 제목, 브랜치, 태그, 기타 메타데이터)을 가져오고 블롭(예: diff, 커밋, 파일)을 조회할 수 있는 API를 제공합니다.

GitLab.com의 프로덕션 아키텍처도 참고해 보세요.

기존 컴포넌트 수정 및 새 컴포넌트 도입#

애플리케이션이 전통적인 Linux 머신에 설치될 때와 쿠버네티스 같은 컨테이너화된 플랫폼에서 실행될 때는 동작 방식에 근본적인 차이가 있습니다.

공식 설치 방법과 비교하여 주요 차이점은 다음과 같습니다:

  • 공식 Linux 패키지는 동일한 파일 시스템에서 여러 서비스가 파일에 접근할 수 있습니다. 공유 파일은 쿠버네티스 플랫폼에서 실행되는 애플리케이션에는 사용할 수 없는 옵션입니다.

  • 공식 Linux 패키지는 기본적으로 공유 설정과 네트워크에 접근할 수 있는 서비스를 포함합니다. 쿠버네티스에서 실행되는 서비스는 완전히 격리되거나 특정 포트를 통해서만 접근 가능할 수 있으므로 이와 다를 수 있습니다.

즉, 새로운 기능을 설계하고 새 컴포넌트를 추가할 때는 서비스 간 공유 상태를 신중하게 고려해야 합니다. 동일한 파일에 접근해야 하는 서비스는 적절한 API를 통해 정보를 교환할 수 있어야 합니다. 가능하면 파일을 통한 방식은 지양해야 합니다.

API 우선 철학으로 작성된 컴포넌트는 두 가지 방법 모두와 호환되므로, 모든 새로운 기능과 서비스는 쿠버네티스 호환성을 우선으로 고려하여 작성해야 합니다.

이를 보장하는 가장 간단한 방법은 공식 GitLab Helm chart에 기능 또는 서비스 지원을 추가하거나 Distribution 팀에 문의하는 것입니다.

자세한 내용은 새 서비스 컴포넌트 추가 프로세스를 참조하세요.

간략한 컴포넌트 개요#

다음은 GitLab 아키텍처를 이해하기 위한 단순화된 아키텍처 다이어그램입니다.

전체 아키텍처 다이어그램은 아래의 컴포넌트 다이어그램에서 확인할 수 있습니다.

%%{init: {"flowchart": { "useMaxWidth": false } }}%% graph TB %% Component declarations and formatting HTTP((HTTP/HTTPS)) SSH((SSH)) GitLabPages(GitLab Pages) GitLabWorkhorse(GitLab Workhorse) GitLabShell(GitLab Shell) Gitaly(Gitaly) Puma("Puma (Gitlab Rails)") Sidekiq("Sidekiq (GitLab Rails)") PostgreSQL(PostgreSQL) Redis(Redis)

HTTP -- TCP 80,443 --> NGINX SSH -- TCP 22 --> GitLabShell

NGINX -- TCP 8090 --> GitLabPages NGINX --> GitLabWorkhorse

GitLabShell --> Gitaly GitLabShell --> GitLabWorkhorse

GitLabWorkhorse --> Gitaly GitLabWorkhorse --> Puma GitLabWorkhorse --> Redis

Sidekiq --> PostgreSQL Sidekiq --> Redis

Puma --> PostgreSQL Puma --> Redis Puma --> Gitaly

Gitaly --> GitLabWorkhorse

별도로 명시된 경우를 제외하고 모든 연결은 Unix 소켓을 사용합니다.

컴포넌트 다이어그램#

%%{init: {"flowchart": { "useMaxWidth": false } }}%% graph LR %% Anchor items in the appropriate subgraph. %% Link them where the destination* is.

subgraph Clients Browser((Browser)) Git((Git)) end

%% External Components / Applications Geo{{GitLab Geo}} -- TCP 80, 443 --> HTTP Geo -- TCP 22 --> SSH Geo -- TCP 5432 --> PostgreSQL Runner{{GitLab Runner}} -- TCP 443 --> HTTP K8sAgent{{GitLab agent}} -- TCP 443 --> HTTP

%% GitLab Application Suite subgraph GitLab subgraph Ingress HTTP[[HTTP/HTTPS]] SSH[[SSH]] NGINX[NGINX] GitLabShell[GitLab Shell]

    %% inbound/internal
    Browser -- TCP 80,443 --> HTTP
    Git -- TCP 80,443 --> HTTP
    Git -- TCP 22 --> SSH
    HTTP -- TCP 80, 443 --> NGINX
    SSH -- TCP 22 --> GitLabShell
end

subgraph GitLab Services
    %% inbound from NGINX
    NGINX --> GitLabWorkhorse
    NGINX -- TCP 8090 --> GitLabPages
    NGINX -- TCP 8150 --> GitLabKas
    NGINX --> Registry
    %% inbound from GitLabShell
    GitLabShell --> GitLabWorkhorse

    %% services
    Puma["Puma (GitLab Rails)"]
    Puma <--> Registry
    GitLabWorkhorse[GitLab Workhorse] <--> Puma
    GitLabKas[GitLab agent server] --> GitLabWorkhorse
    GitLabPages[GitLab Pages] --> GitLabWorkhorse
    Mailroom
    Sidekiq
end

subgraph Integrated Services
    %% Mattermost
    Mattermost
    Mattermost ---> GitLabWorkhorse
    NGINX --> Mattermost

    %% Grafana
    Grafana
    NGINX --> Grafana
end

subgraph Metadata
    %% PostgreSQL
    PostgreSQL
    PostgreSQL --> Consul

    %% Consul and inbound
    Consul
    Puma ---> Consul
    Sidekiq ---> Consul
    Migrations --> PostgreSQL

    %% PgBouncer and inbound
    PgBouncer
    PgBouncer --> Consul
    PgBouncer --> PostgreSQL
    Sidekiq --> PgBouncer
    Puma --> PgBouncer
end

subgraph State
    %% Redis and inbound
    Redis
    Puma --> Redis
    Sidekiq --> Redis
    GitLabWorkhorse --> Redis
    Mailroom --> Redis
    GitLabKas --> Redis

    %% Sentinel and inbound
    Sentinel <--> Redis
    Puma --> Sentinel
    Sidekiq --> Sentinel
    GitLabWorkhorse --> Sentinel
    Mailroom --> Sentinel
    GitLabKas --> Sentinel
end

subgraph Git Repositories
    %% Gitaly / Praefect
    Praefect --> Gitaly
    GitLabKas --> Praefect
    GitLabShell --> Praefect
    GitLabWorkhorse --> Praefect
    Puma --> Praefect
    Sidekiq --> Praefect
    Praefect <--> PraefectPGSQL[PostgreSQL]
    %% Gitaly makes API calls
    %% Ordered here to ensure placement.
    Gitaly --> GitLabWorkhorse
end

subgraph Storage
    %% ObjectStorage and inbound traffic
    ObjectStorage["Object storage"]
    Puma -- TCP 443 --> ObjectStorage
    Sidekiq -- TCP 443 --> ObjectStorage
    GitLabWorkhorse -- TCP 443 --> ObjectStorage
    Registry -- TCP 443 --> ObjectStorage
    GitLabPages -- TCP 443 --> ObjectStorage
    %% Gitaly can perform repository backups to object storage.
    Gitaly --> ObjectStorage
end

subgraph Monitoring
    %% Prometheus
    Grafana -- TCP 9090 --> Prometheus[Prometheus]
    Prometheus -- TCP 80, 443 --> Puma
    RedisExporter[Redis Exporter] --> Redis
    Prometheus -- TCP 9121 --> RedisExporter
    PostgreSQLExporter[PostgreSQL Exporter] --> PostgreSQL
    PgBouncerExporter[PgBouncer Exporter] --> PgBouncer
    Prometheus -- TCP 9187 --> PostgreSQLExporter
    Prometheus -- TCP 9100 --> NodeExporter[Node Exporter]
    Prometheus -- TCP 9168 --> GitLabExporter[GitLab Exporter]
    Prometheus -- TCP 9127 --> PgBouncerExporter
    Prometheus --> Alertmanager
    GitLabExporter --> PostgreSQL
    GitLabExporter --> GitLabShell
    GitLabExporter --> Sidekiq

    %% Alertmanager
    Alertmanager -- TCP 25 --> SMTP
end

%% end subgraph GitLab end

subgraph External subgraph External Services SMTP[SMTP Gateway] LDAP

    %% Outbound SMTP
    Sidekiq -- TCP 25 --> SMTP
    Puma -- TCP 25 --> SMTP
    Mailroom -- TCP 25 --> SMTP

    %% Outbound LDAP
    Puma -- TCP 369 --> LDAP
    Sidekiq -- TCP 369 --> LDAP

    %% Elasticsearch
    Elasticsearch
    Puma -- TCP 9200 --> Elasticsearch
    Sidekiq -- TCP 9200 --> Elasticsearch
    Elasticsearch --> Praefect

    %% Zoekt
    Zoekt --> Praefect
end
subgraph External Monitoring
    %% Sentry
    Sidekiq -- TCP 80, 443 --> Sentry
    Puma -- TCP 80, 443 --> Sentry

    %% Jaeger
    Jaeger
    Sidekiq -- UDP 6831 --> Jaeger
    Puma -- UDP 6831 --> Jaeger
    Gitaly -- UDP 6831 --> Jaeger
    GitLabShell -- UDP 6831 --> Jaeger
    GitLabWorkhorse -- UDP 6831 --> Jaeger
end

%% end subgraph External end

click Alertmanager "#alertmanager" click Praefect "#praefect" click Geo "#gitlab-geo" click NGINX "#nginx" click Runner "#gitlab-runner" click Registry "#registry" click ObjectStorage "#object-storage" click Mattermost "#mattermost" click Gitaly "#gitaly" click Jaeger "#jaeger" click GitLabWorkhorse "#gitlab-workhorse" click LDAP "#ldap-authentication" click Puma "#puma" click GitLabShell "#gitlab-shell" click SSH "#ssh-request-22" click Sidekiq "#sidekiq" click Sentry "#sentry" click GitLabExporter "#gitlab-exporter" click Elasticsearch "#elasticsearch" click Migrations "#database-migrations" click PostgreSQL "#postgresql" click Consul "#consul" click PgBouncer "#pgbouncer" click PgBouncerExporter "#pgbouncer-exporter" click RedisExporter "#redis-exporter" click Redis "#redis" click Prometheus "#prometheus" click Grafana "#grafana" click GitLabPages "#gitlab-pages" click PostgreSQLExporter "#postgresql-exporter" click SMTP "#outbound-email" click NodeExporter "#node-exporter"

컴포넌트 범례#

  • ✅ - 기본 설치됨

  • ⚙ - 추가 설정 필요

  • ⤓ - 수동 설치 필요

  • ❌ - 지원되지 않거나 안내 없음

  • N/A - 해당 없음

컴포넌트 상태는 각 컴포넌트의 설정 문서로 연결됩니다.

컴포넌트 목록#

컴포넌트 설명 Omnibus GitLab GitLab Environment Toolkit (GET) GitLab chart minikube Minimal GitLab.com Source GDK CE/EE
AI Gateway GitLab AI 네이티브 기능 EE Only
GitLab Duo Workflow Service GitLab AI 네이티브 기능 EE Only
Certificate Management TLS 설정, Let's Encrypt CE & EE
Consul 데이터베이스 노드 검색, 장애 조치 EE Only
Database Migrations 데이터베이스 마이그레이션 CE & EE
Elasticsearch GitLab 내 향상된 검색 EE Only
Gitaly GitLab의 모든 Git 호출을 처리하는 Git RPC 서비스 CE & EE
GitLab Exporter 다양한 GitLab 메트릭 생성 CE & EE
GitLab Geo 지리적으로 분산된 GitLab 사이트 EE Only
GitLab Pages 정적 웹사이트 호스팅 CE & EE
GitLab agent for Kubernetes 클라우드 네이티브 방식으로 쿠버네티스 클러스터 통합 EE Only
GitLab self-monitoring: Alertmanager Prometheus의 알림을 중복 제거, 그룹화 및 라우팅 CE & EE
GitLab self-monitoring: Grafana 메트릭 대시보드 CE & EE
GitLab self-monitoring: Jaeger GitLab 인스턴스에서 생성된 트레이스 확인 CE & EE
GitLab self-monitoring: Prometheus 시계열 데이터베이스, 메트릭 수집 및 쿼리 서비스 CE & EE
GitLab self-monitoring: Sentry GitLab 인스턴스에서 발생한 오류 추적 CE & EE
GitLab Shell SSH를 통한 git 세션 처리 CE & EE
GitLab Workhorse 스마트 리버스 프록시, 대용량 HTTP 요청 처리 CE & EE
Inbound email (SMTP) 이슈 업데이트를 위한 메시지 수신 CE & EE
Jaeger integration 배포된 앱의 분산 추적 EE Only
LDAP Authentication 중앙화된 LDAP 디렉터리에 대해 사용자 인증 CE & EE
Mattermost 오픈 소스 Slack 대안 CE & EE
Object storage S3 호환 오브젝트 스토리지 서비스 CE & EE
NGINX 적절한 컴포넌트로 요청 라우팅, SSL 종료 CE & EE
Node Exporter 시스템 메트릭을 제공하는 Prometheus 엔드포인트 N/A N/A CE & EE
Outbound email (SMTP) 사용자에게 이메일 메시지 전송 CE & EE
Patroni PostgreSQL HA 클러스터 리더 선출 및 복제 관리 EE Only
PgBouncer Exporter PgBouncer 메트릭을 제공하는 Prometheus 엔드포인트 CE & EE
PgBouncer 데이터베이스 연결 풀링, 장애 조치 EE Only
PostgreSQL Exporter PostgreSQL 메트릭을 제공하는 Prometheus 엔드포인트 CE & EE
PostgreSQL 데이터베이스 CE & EE
Praefect Git 클라이언트와 Gitaly 스토리지 노드 사이의 투명한 프록시 CE & EE
Puma (GitLab Rails) 웹 인터페이스 및 API 요청 처리 CE & EE
Redis Exporter Redis 메트릭을 제공하는 Prometheus 엔드포인트 CE & EE
Redis 캐싱 서비스 CE & EE
Registry 컨테이너 레지스트리, 이미지 푸시 및 풀 허용 CE & EE
Runner GitLab CI/CD job 실행 CE & EE
Sentry integration 배포된 앱의 오류 추적 CE & EE
Sidekiq 백그라운드 job 처리기 CE & EE
Token Revocation API 유출된 시크릿 수신 및 취소 EE Only

컴포넌트 세부 정보#

이 문서는 GitLab 내부 구조와 컴포넌트 간 상호작용을 더 깊이 이해하고자 하는 시스템 관리자 및 GitLab 지원 엔지니어를 위해 작성되었습니다.

GitLab을 배포할 때는 아래에 설명된 프로세스들의 집합체로 이해해야 합니다. 문제를 해결하거나 디버깅할 때는 참조하는 컴포넌트를 최대한 구체적으로 명시하는 것이 좋습니다. 그렇게 하면 명확성이 높아지고 혼란을 줄일 수 있습니다.

레이어

프로세스 관점에서 GitLab은 두 가지 레이어로 구성됩니다:

  • 모니터링(Monitoring): 이 레이어의 항목은 GitLab 애플리케이션을 제공하는 데 필수적이지는 않지만, 관리자에게 인프라와 서비스 전반의 상태에 대한 더 깊은 인사이트를 제공합니다.

  • 코어(Core): GitLab 플랫폼 제공에 필수적인 프로세스입니다. 이 프로세스 중 하나라도 중단되면 GitLab 장애가 발생합니다. 코어 레이어는 다음과 같이 세분화할 수 있습니다:

프로세서(Processors): 실제 작업을 수행하고 서비스를 제공하는 프로세스입니다.

  • 데이터(Data): GitLab 서비스를 위한 구조화된 데이터를 저장하거나 제공하는 서비스입니다.

Alertmanager#

Omnibus

Alert manager는 Prometheus에서 제공하는 도구로, "Prometheus 서버와 같은 클라이언트 애플리케이션에서 보낸 알림을 처리합니다. 알림의 중복을 제거하고, 그룹화하고, 이메일, PagerDuty, Opsgenie 등의 올바른 수신자 통합으로 라우팅합니다. 또한 알림의 묵음(silencing) 및 억제(inhibition)도 처리합니다." 어떤 항목을 알림으로 설정하는지에 대해서는 이슈 #45740에서 더 자세히 확인할 수 있습니다.

AI Gateway#

  • 프로젝트 페이지:

Charts

  • 설정:

Source

GitLab AI Gateway는 self-managed, dedicated, GitLab.com 등 어떤 인스턴스를 사용하더라도 모든 GitLab 사용자가 AI 기능을 사용할 수 있도록 해주는 독립 실행형 서비스입니다.

자세한 내용은 다음을 참조하세요:

GitLab Duo Workflow Service#

  • 프로젝트 페이지:

Charts

  • 설정:

Source

GitLab Duo Workflow Service는 Runway 서비스를 통해 배포되는 에이전틱(agentic) AI 기능입니다.

자세한 내용은 다음을 참조하세요:

인증서 관리#

  • 프로젝트 페이지:

Omnibus

Omnibus

Consul#

Omnibus

  • Charts

  • 레이어: 코어 서비스(데이터)

  • GitLab.com: Consul

Consul은 서비스 검색 및 설정을 위한 도구입니다. Consul은 분산형, 고가용성, 고확장성을 갖추고 있습니다.

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

  • 설정:

Omnibus

Elasticsearch#

Omnibus

Elasticsearch는 클라우드를 위해 구축된 분산형 RESTful 검색 엔진입니다.

Gitaly#

Omnibus

  • Charts

  • Source

  • 레이어: 코어 서비스(데이터)

  • 프로세스: gitaly

Gitaly는 GitLab의 분산 배포(GitLab.com 또는 고가용성 배포 등)에서 Git 스토리지에 NFS가 필요 없도록 하기 위해 GitLab이 설계한 서비스입니다. 11.3.0부터 이 서비스가 GitLab의 모든 Git 수준 접근을 처리합니다. 프로젝트의 README에서 더 자세히 알아볼 수 있습니다.

Praefect#

Omnibus

  • Source

  • 레이어: 코어 서비스(데이터)

  • 프로세스: praefect

Praefect는 각 Git 클라이언트와 Gitaly 사이에서 리포지터리 업데이트를 보조 노드에 복제하는 것을 조율하는 투명한 프록시입니다.

GitLab Geo#

  • 설정:

Omnibus

  • Charts

  • GDK

  • 레이어: 코어 서비스(프로세서)

Geo는 분산된 팀의 개발 속도를 높이기 위해 구축된 프리미엄 기능으로, 기본 GitLab 인스턴스의 하나 이상의 읽기 전용 미러를 제공합니다. 이 미러(Geo 보조 사이트)는 대형 리포지터리나 프로젝트를 클론하거나 가져오는 시간을 줄이거나 재해 복구(Disaster Recovery) 솔루션의 일부로 활용할 수 있습니다.

GitLab Exporter#

Omnibus

GitLab Exporter는 GitLab 애플리케이션 내부 메트릭을 Prometheus로 내보낼 수 있도록 GitLab이 직접 설계한 프로세스입니다. 프로젝트의 README에서 더 자세히 알아볼 수 있습니다.

GitLab agent for Kubernetes#

Omnibus

GitLab agent for Kubernetes는 GitLab과 쿠버네티스 통합 작업을 보안적이고 클라우드 네이티브 방식으로 해결하기 위해 클러스터 내에서 동작하는 액티브 컴포넌트입니다.

이를 사용하여 쿠버네티스 클러스터에 배포를 동기화할 수 있습니다.

GitLab Pages#

  • 설정:

Omnibus

GitLab Pages는 GitLab의 리포지터리에서 직접 정적 웹사이트를 게시할 수 있는 기능입니다.

포트폴리오, 문서, 선언문, 비즈니스 프레젠테이션 등 개인 또는 비즈니스 웹사이트에 활용할 수 있습니다. 또한 콘텐츠에 라이선스를 부여할 수도 있습니다.

GitLab Runner#

Omnibus

GitLab Runner는 job을 실행하고 결과를 GitLab으로 전송합니다.

GitLab CI/CD는 GitLab에 포함된 오픈 소스 지속적 통합 서비스로 테스트를 조율합니다. 이 프로젝트의 이전 이름은 GitLab CI Multi Runner였지만, 지금부터는 GitLab Runner(CI 없이)를 사용해야 합니다.

GitLab Shell#

Omnibus

GitLab Shell은 SSH 기반 git 세션을 처리하고 인가된 키 목록을 수정하기 위해 GitLab에서 설계한 프로그램입니다. GitLab Shell은 Unix 셸이 아니며 Bash나 Zsh의 대체물도 아닙니다.

GitLab Workhorse#

Omnibus

  • Charts

  • Source

  • 레이어: 코어 서비스(프로세서)

  • 프로세스: gitlab-workhorse

GitLab Workhorse는 Puma의 부하를 줄이기 위해 GitLab에서 설계한 프로그램입니다. 개발 배경에 대한 역사적 이유에서 더 자세히 알아볼 수 있습니다. GitLab 전반의 속도를 높이기 위한 스마트 리버스 프록시 역할을 하도록 설계되었습니다.

Grafana#

Omnibus

Grafana는 Graphite, Elasticsearch, OpenTSDB, Prometheus, InfluxDB를 위한 기능이 풍부한 오픈 소스 메트릭 대시보드 및 그래프 편집기입니다.

Jaeger#

Omnibus

Jaeger는 Dapper와 OpenZipkin에서 영감을 받은 분산 추적 시스템입니다. 마이크로서비스 기반 분산 시스템의 모니터링에 활용할 수 있습니다.

Logrotate#

Omnibus

  • 레이어: 코어 서비스

  • 프로세스: logrotate

GitLab은 로그를 기록하는 다수의 서비스로 구성되어 있습니다. 책임 있는 로깅을 보장하기 위해 자체 Logrotate를 번들로 포함합니다. 이는 일반적인 오픈 소스 도구를 패키지로 제공하는 것입니다.

Mattermost#

Omnibus

Mattermost는 https://mattermost.com에서 제공하는 오픈 소스, 프라이빗 클라우드 기반 Slack 대안입니다.

오브젝트 스토리지#

  • 설정:

Omnibus

GitLab은 CI 아티팩트, LFS 오브젝트, 업로드, 컨테이너 레지스트리 이미지 등의 데이터를 저장하기 위해 S3 호환 오브젝트 스토리지가 필요합니다. GitLab은 완전한 S3 API 호환성을 제공하는 모든 오브젝트 스토리지 공급자와 호환됩니다. 공급자 선택은 사용자의 책임입니다. Amazon S3, Google Cloud Storage, Azure Blob Storage와 같은 클라우드 관리형 서비스와 자체 호스팅 S3 호환 솔루션이 일반적으로 사용됩니다.

NGINX#

  • 프로젝트 페이지:

Omnibus

Omnibus

  • Charts

  • Source

  • 레이어: 코어 서비스(프로세서)

  • 프로세스: nginx

NGINX는 모든 HTTP 요청에 대한 Ingress 포트를 갖추고 있으며 요청을 GitLab 내 적절한 하위 시스템으로 라우팅합니다. 수정되지 않은 버전의 인기 오픈 소스 웹 서버를 번들로 제공합니다.

Node Exporter#

Omnibus

Node Exporter는 기본 머신(CPU/디스크/로드 등)에 대한 메트릭을 제공하는 Prometheus 도구입니다. Prometheus 프로젝트의 일반적인 오픈 소스 도구를 패키지로 제공하는 것입니다.

Patroni#

Omnibus

PgBouncer#

Omnibus

PostgreSQL을 위한 경량 연결 풀링 도구입니다.

PgBouncer Exporter#

Omnibus

PgBouncer용 Prometheus 익스포터입니다. 9127/metrics에서 메트릭을 내보냅니다.

PostgreSQL#

Omnibus

GitLab은 애플리케이션 메타데이터와 사용자 정보를 저장하기 위해 인기 있는 데이터베이스를 패키지로 제공합니다.

PostgreSQL Exporter#

Omnibus

postgres_exporter는 커뮤니티에서 제공하는 Prometheus 익스포터로, PostgreSQL 데이터를 Prometheus로 전달하여 Grafana 대시보드에서 활용할 수 있도록 합니다.

Prometheus#

Omnibus

  • Charts

  • 레이어: 모니터링

  • 프로세스: prometheus

  • GitLab.com: Prometheus

Prometheus는 GitLab 관리자가 GitLab 서비스를 제공하는 데 사용되는 개별 프로세스에 대한 메트릭을 노출할 수 있도록 지원하는 시계열 도구입니다.

Redis#

Omnibus

  • Charts

  • Source

  • 레이어: 코어 서비스(데이터)

  • 프로세스: redis

Redis는 다음을 저장하기 위해 패키지로 제공됩니다:

  • 세션 데이터

  • 임시 캐시 정보

  • 백그라운드 job 큐

GitLab이 Redis를 어떻게 사용하는지에 대한 자세한 내용은 Redis 가이드라인을 참조하세요.

Redis Exporter#

Omnibus

Redis Exporter는 Redis 프로세스에 대한 특정 메트릭을 Prometheus에 제공하여 Grafana에서 이를 그래프로 시각화할 수 있도록 설계되었습니다.

Registry#

Omnibus

레지스트리는 사용자가 자신의 Docker 이미지를 저장하는 데 사용하는 컴포넌트입니다. 번들된 레지스트리는 NGINX를 로드 밸런서로 사용하고 GitLab을 인증 관리자로 사용합니다. 클라이언트가 레지스트리에서 이미지를 풀 또는 푸시하려고 요청하면 401 응답과 함께 인증 토큰을 얻을 위치(이 경우 GitLab 인스턴스)를 나타내는 헤더를 반환합니다. 클라이언트는 GitLab에서 풀 또는 푸시 인증 토큰을 요청한 후 레지스트리에 원래 요청을 재시도합니다. 자세한 내용은 토큰 인증을 참조하세요.

외부 레지스트리도 GitLab을 인증 엔드포인트로 사용하도록 설정할 수 있습니다.

Sentry#

Omnibus

Sentry는 근본적으로 실시간으로 크래시를 모니터링하고 수정할 수 있도록 지원하는 서비스입니다. 서버는 Python으로 작성되었지만 모든 언어, 모든 애플리케이션에서 이벤트를 전송할 수 있는 완전한 API를 제공합니다.

배포된 앱의 모니터링을 위해서는 Sentry 통합 문서를 참조하세요.

Sidekiq#

Omnibus

Sidekiq은 Redis 큐에서 job을 꺼내 처리하는 Ruby 백그라운드 job 처리기입니다. 백그라운드 job을 통해 GitLab은 작업을 백그라운드로 이동하여 더 빠른 요청/응답 사이클을 제공합니다.

Puma#

GitLab 13.0부터 Puma가 기본 웹 서버입니다.

Omnibus

  • Charts

  • Source

  • GDK

  • 레이어: 코어 서비스(프로세서)

  • 프로세스: puma

  • GitLab.com: Puma

Puma는 GitLab에서 사용자 대면 기능을 제공하는 핵심 Rails 애플리케이션을 실행하는 Ruby 애플리케이션 서버입니다. GitLab 버전에 따라 프로세스 출력에서 bundle 또는 config.ru로 표시될 수 있습니다.

LDAP Authentication#

  • 설정:

Omnibus

아웃바운드 이메일#

  • 설정:

Omnibus

인바운드 이메일#

  • 설정:

Omnibus

요청 유형별 GitLab#

GitLab은 최종 사용자가 서비스에 접근할 수 있는 두 가지 "인터페이스"를 제공합니다:

  • 웹 HTTP 요청 (UI/API 조회)

  • Git HTTP/SSH 요청 (Git 데이터 푸시/풀)

일부 프로세스는 두 방식 모두에서 사용되고, 일부는 특정 요청 유형에만 사용되므로 이 차이를 이해하는 것이 중요합니다.

GitLab 웹 HTTP 요청 사이클#

HTTP 엔드포인트(예: /users/sign_in)에 요청할 때 요청은 GitLab 서비스를 통해 다음 경로를 거칩니다:

  • NGINX - 첫 번째 리버스 프록시 역할을 합니다.

  • GitLab Workhorse - Rails 애플리케이션으로 가야 할지, Puma의 부하를 줄이기 위해 다른 곳으로 가야 할지 결정합니다.

  • Puma - 웹 요청이고 애플리케이션에 접근해야 하므로 Puma로 라우팅됩니다.

  • PostgreSQL/Gitaly/Redis - 요청 유형에 따라 데이터를 저장하거나 조회하기 위해 이 서비스들에 접근할 수 있습니다.

GitLab Git 요청 사이클#

아래에서는 HTTP와 SSH Git 요청이 각각 취하는 다른 경로를 설명합니다. 웹 요청 사이클과 일부 겹치는 부분도 있고 차이점도 있습니다.

웹 요청 (80/443)#

HTTP를 통한 Git 작업은 Git 문서에 설명된 상태 비저장(stateless) "스마트" 프로토콜을 사용하지만, 이러한 작업을 처리하는 책임은 여러 GitLab 컴포넌트에 분산됩니다.

다음은 git fetch에 대한 시퀀스 다이어그램입니다. 모든 요청은 NGINX 및 기타 HTTP 로드 밸런서를 통과하지만, 이들에 의해 변환되지 않습니다. 모든 경로는 /namespace/project.git URL을 기준으로 표시됩니다.

sequenceDiagram participant Git on client participant NGINX participant Workhorse participant Rails participant Gitaly participant Git on server

Note left of Git on client: git fetch<br/>info-refs
Git on client->>+Workhorse: GET /info/refs?service=git-upload-pack
Workhorse->>+Rails: GET /info/refs?service=git-upload-pack
Note right of Rails: Auth check
Rails-->>-Workhorse: Gitlab::Workhorse.git_http_ok
Workhorse->>+Gitaly: SmartHTTPService.InfoRefsUploadPack request
Gitaly->>+Git on server: git upload-pack --stateless-rpc --advertise-refs
Git on server-->>-Gitaly: git upload-pack response
Gitaly-->>-Workhorse: SmartHTTPService.InfoRefsUploadPack response
Workhorse-->>-Git on client: 200 OK

Note left of Git on client: git fetch<br/>fetch-pack
Git on client->>+Workhorse: POST /git-upload-pack
Workhorse->>+Rails: POST /git-upload-pack
Note right of Rails: Auth check
Rails-->>-Workhorse: Gitlab::Workhorse.git_http_ok
Workhorse->>+Gitaly: SmartHTTPService.PostUploadPack request
Gitaly->>+Git on server: git upload-pack --stateless-rpc
Git on server-->>-Gitaly: git upload-pack response
Gitaly-->>-Workhorse: SmartHTTPService.PostUploadPack response
Workhorse-->>-Git on client: 200 OK

git push도 동일한 시퀀스를 따르지만, git-upload-pack 대신 git-receive-pack이 사용됩니다.

SSH 요청 (22)#

SSH를 통한 Git 작업은 Git 문서에 설명된 상태 저장(stateful) 프로토콜을 사용할 수 있지만, 이를 처리하는 책임은 여러 GitLab 컴포넌트에 분산됩니다.

어떤 GitLab 컴포넌트도 SSH를 직접 사용하지 않습니다. 모든 SSH 연결은 클라이언트 머신의 Git과 연결을 종료하는 SSH 서버 사이에서 이루어집니다. SSH 서버는 모든 연결을 git 사용자로 인증되었다고 처리하며, GitLab 사용자는 클라이언트가 제시한 SSH 키로 구별됩니다.

다음은 Fast SSH key lookup이 활성화되어 있다고 가정한 git fetch의 시퀀스 다이어그램입니다. AuthorizedKeysCommandGitLab Shell이 제공하는 실행 파일입니다:

sequenceDiagram participant Git on client participant SSH server participant AuthorizedKeysCommand participant GitLab Shell participant Rails participant Gitaly participant Git on server

Note left of Git on client: git fetch
Git on client->>+SSH server: ssh git fetch-pack request
SSH server->>+AuthorizedKeysCommand: gitlab-shell-authorized-keys-check git AAAA...
AuthorizedKeysCommand->>+Rails: GET /internal/api/authorized_keys?key=AAAA...
Note right of Rails: Lookup key ID
Rails-->>-AuthorizedKeysCommand: 200 OK, command="gitlab-shell upload-pack key_id=1"
AuthorizedKeysCommand-->>-SSH server: command="gitlab-shell upload-pack key_id=1"
SSH server->>+GitLab Shell: gitlab-shell upload-pack key_id=1
GitLab Shell->>+Rails: GET /internal/api/allowed?action=upload_pack&key_id=1
Note right of Rails: Auth check
Rails-->>-GitLab Shell: 200 OK, { gitaly: ... }
GitLab Shell->>+Gitaly: SSHService.SSHUploadPack request
Gitaly->>+Git on server: git upload-pack request
Note over Git on client,Git on server: Bidirectional communication between Git client and server
Git on server-->>-Gitaly: git upload-pack response
Gitaly -->>-GitLab Shell: SSHService.SSHUploadPack response
GitLab Shell-->>-SSH server: gitlab-shell upload-pack response
SSH server-->>-Git on client: ssh git fetch-pack response

git push 작업도 매우 유사하지만, git upload-pack 대신 git receive-pack이 사용됩니다.

Fast SSH key lookup이 활성화되어 있지 않은 경우, SSH 서버는 ~git/.ssh/authorized_keys 파일을 읽어 주어진 SSH 세션에서 실행할 명령을 결정합니다. 이 파일은 사용자가 SSH 키를 수정할 때마다 실행되도록 예약된 Rails의 AuthorizedKeysWorker가 최신 상태로 유지합니다.

SSH 인증서를 키 대신 사용할 수도 있습니다. 이 경우 AuthorizedKeysCommandAuthorizedPrincipalsCommand로 대체됩니다. 이는 Rails 내부 API를 사용하지 않고 인증서에서 사용자 이름을 추출하며, 이후 /api/internal/allowed 호출에서 key_id 대신 사용됩니다.

GitLab Shell에는 Gitaly를 포함하지 않는 몇 가지 작업도 있습니다(예: 이중 인증 코드 재설정 등). 이러한 작업도 동일한 방식으로 처리되지만, Gitaly로의 왕복이 없습니다. Rails가 내부 API 호출의 일부로 작업을 수행하고, GitLab Shell이 사용자에게 직접 응답을 스트리밍합니다.

시스템 레이아웃#

그림에서 ~git는 일반적으로 /home/git인 Git 사용자의 홈 디렉터리를 의미합니다.

GitLab은 주로 git 사용자로서 /home/git 사용자 홈 디렉터리 내에 설치됩니다. 홈 디렉터리에는 GitLab 서버 소프트웨어와 리포지터리가 있습니다(리포지터리 위치는 설정에서 변경 가능합니다).

베어 리포지터리는 /home/git/repositories에 위치합니다. GitLab은 Ruby on Rails 애플리케이션이므로 내부 동작의 세부 사항은 Ruby on Rails 애플리케이션의 동작 방식을 학습함으로써 이해할 수 있습니다.

SSH를 통해 리포지터리를 제공하기 위해 /home/git/gitlab-shell에 설치된 GitLab Shell이라는 애드온 애플리케이션을 사용합니다.

설치 폴더 요약#

다음은 git 사용자 홈 디렉터리의 디렉터리 구조를 요약한 것입니다.

프로세스#

ps aux | grep '^git'

GitLab을 운영하려면 여러 컴포넌트가 필요합니다. 영속 데이터베이스(PostgreSQL)와 Redis 데이터베이스가 필요하며, Apache httpd 또는 NGINX를 사용하여 Puma로 proxypass합니다. 이러한 모든 컴포넌트는 GitLab과 다른 시스템 사용자(postgres, redis, www-data 등, git 대신)로 실행되어야 합니다.

git 사용자로 Sidekiq과 Puma(기본적으로 포트 8080에서 실행되는 단순 Ruby HTTP 서버)를 시작합니다. GitLab 사용자 하에는 보통 4개의 프로세스가 있습니다: puma master(1개 프로세스), puma cluster worker(2개 프로세스), sidekiq(1개 프로세스).

리포지터리 접근#

리포지터리는 HTTP 또는 SSH를 통해 접근합니다. HTTP 클론/푸시/풀은 GitLab API를 사용하며, SSH 클론은 GitLab Shell이 처리합니다(앞서 설명됨).

트러블슈팅#

자세한 내용은 README를 참조하세요.

서비스 Init 스크립트#

GitLab init 스크립트는 Puma와 Sidekiq을 시작하고 중지합니다:

/etc/init.d/gitlab
Usage: service gitlab {start|stop|restart|reload|status}

Redis(키-값 스토어/비영속 데이터베이스):

/etc/init.d/redis
Usage: /etc/init.d/redis {start|stop|status|restart|condrestart|try-restart}

SSH 데몬:

/etc/init.d/sshd
Usage: /etc/init.d/sshd {start|stop|restart|reload|force-reload|condrestart|try-restart|status}

웹 서버(다음 중 하나):

/etc/init.d/httpd
Usage: httpd {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}

$ /etc/init.d/nginx
Usage: nginx {start|stop|restart|reload|force-reload|status|configtest}

영속 데이터베이스:

$ /etc/init.d/postgresql
Usage: /etc/init.d/postgresql {start|stop|restart|reload|force-reload|status} [version ..]

서비스 로그 위치#

GitLab(Puma 및 Sidekiq 로그 포함):

  • /home/git/gitlab/log/에는 보통 application.log, production.log, sidekiq.log, puma.stdout.log, git_json.log, puma.stderr.log가 있습니다.

GitLab Shell:

  • /home/git/gitlab-shell/gitlab-shell.log

SSH:

  • /var/log/auth.log 인증 로그(Ubuntu 기준).

  • /var/log/secure 인증 로그(RHEL 기준).

NGINX:

  • /var/log/nginx/에 오류 및 접근 로그가 있습니다.

Apache httpd:

  • Apache 로그 설명.

  • /var/log/apache2/에 오류 및 출력 로그가 있습니다(Ubuntu 기준).

  • /var/log/httpd/에 오류 및 출력 로그가 있습니다(RHEL 기준).

Redis:

  • /var/log/redis/redis.log에 있으며, 로테이션된 로그도 여기에 있습니다.

PostgreSQL:

  • /var/log/postgresql/*

GitLab 특정 설정 파일#

GitLab의 설정 파일은 /home/git/gitlab/config/*에 위치합니다. 일반적으로 참조되는 설정 파일은 다음과 같습니다:

  • gitlab.yml: GitLab Rails 설정

  • puma.rb: Puma 웹 서버 설정

  • database.yml: 데이터베이스 연결 설정

GitLab Shell의 설정 파일은 /home/git/gitlab-shell/config.yml에 있습니다.

GitLab Rails에 새 설정 추가하기#

gitlab.yml에 포함되어야 하는 설정은 다음과 관련된 것들입니다:

  • 여러 서비스에 걸쳐 애플리케이션이 어떻게 연결되는지. 예: Gitaly 주소, Redis 주소, Postgres 주소, Consul 주소.

  • 분산 추적(Distributed Tracing) 설정 및 일부 관측 가능성(observability) 설정. 예: 히스토그램 버킷 경계.

  • Postgres 연결이 설정되기 이전에 Rails 초기화 중에 설정되어야 하는 것들.

그 외의 많은 설정은 ApplicationSetting의 앱 자체에 두는 것이 더 적합합니다. UI에서 설정을 관리하는 것이 설정 파일을 직접 관리하는 것보다 일반적으로 더 나은 사용자 경험을 제공합니다. 개발 비용 측면에서 gitlab.yml 수정이 더 빠른 반복처럼 보일 수 있지만, 아래의 모든 배포 방법을 고려하면 좋지 않은 트레이드오프일 수 있습니다.

gitlab.yml에 설정을 추가할 때:

유지보수 작업#

GitLab은 버전 정보를 확인하고 애플리케이션 내에서 설정이 올바르게 구성되었는지 빠르게 점검할 수 있는 Rake 태스크를 제공합니다. 유지보수 Rake 태스크를 참조하세요. 간단히 정리하면 다음을 실행하세요:

sudo -i -u git
cd gitlab
bundle exec rake gitlab:env:info RAILS_ENV=production
bundle exec rake gitlab:check RAILS_ENV=production

sudo -i -u git 또는 sudo su - git을 사용하여 git 사용자로 로그인하는 것을 권장합니다. GitLab에서 제공하는 sudo 명령은 Ubuntu에서는 동작하지만 RHEL에서는 항상 동작하지 않을 수 있습니다.

GitLab.com#

GitLab.com 아키텍처는 참고를 위해 상세히 설명되어 있지만, 이 아키텍처는 수백만 명의 사용자가 있을 때만 유용합니다.

AI 아키텍처#

AI 네이티브 기능을 활성화하기 위한 SaaS 모델 게이트웨이가 제공됩니다.