보조 사이트용 컨테이너 레지스트리

Tier: Premium, Ultimate Offering: Self-Managed형

primary Geo 사이트의 컨테이너 레지스트리를 복제하는 보조 Geo 사이트에 컨테이너 레지스트리를 설정할 수 있습니다.

note
컨테이너 레지스트리 복제는 재해 복구 목적으로만 사용됩니다. 우리는 보조에서 컨테이너 레지스트리 데이터를 가져 오는 것을 권장하지 않습니다. 미래에 이를 구현하기 위한 기능 제안은 자세한 내용은 Geo: Accelerate container images by serving read request from secondary site를 참조하십시오. 당신이나 귀하의 GitLab 대표는 이 기능에 투표하여 귀하의 관심을 등록할 것을 권장합니다.

지원되는 컨테이너 레지스트리

Geo는 다음 유형의 컨테이너 레지스트리를 지원합니다:

지원되는 이미지 형식

다음 컨테이너 이미지 형식이 Geo에서 지원됩니다:

또한 Geo는 BuildKit cache images도 지원합니다.

지원되는 스토리지

Docker

지원되는 레지스트리 스토리지 드라이버에 대한 자세한 내용은 Docker registry storage drivers를 참조하십시오.

Registry를 배포할 때 Load balancing considerations 및 GitLab 통합 container registry용 스토리지 드라이버 설정 방법을 확인하십시오.

OCI 아티팩트를 지원하는 레지스트리

다음 레지스트리에서는 OCI 아티팩트를 지원합니다:

  • CNCF Distribution - local/offline verification
  • Azure Container Registry (ACR)
  • Amazon Elastic Container Registry (ECR)
  • Google Artifact Registry (GAR)
  • GitHub Packages container registry (GHCR)
  • Bundle Bar

자세한 내용은 OCI Distribution Specification을 참조하십시오.

컨테이너 레지스트리 복제 구성

리포지터리에 대한 복제를 활성화하여 클라우드 또는 로컬 리포지터리에 사용할 수 있도록 설정할 수 있습니다. primary 사이트에 새 이미지가 푸시 되면 각 secondary 사이트가 그것을 자체 컨테이너 리포지터리로 가져옵니다.

컨테이너 레지스트리 복제를 구성하려면:

  1. primary 사이트 구성.
  2. secondary 사이트 구성.
  3. 컨테이너 레지스트리 복제 확인.

primary 사이트 구성

다음 단계를 진행하기 전에 primary 사이트에서 컨테이너 레지스트리가 설정되어 작동하는지 확인하십시오.

새 컨테이너 이미지를 복제하려면 컨테이너 레지스트리가 모든 푸시에 대한 알림 이벤트를 primary 사이트로 보내야 합니다. primary 사이트의 컨테이너 레지스트리와 웹 노드간에 공유 된 토큰을 사용하여 보안을 더 강화합니다.

  1. GitLab primary 서버에 SSH로 로그인하고 루트로 로그인합니다 (GitLab HA의 경우, 레지스트리 노드만 필요합니다):

    sudo -i
    
  2. /etc/gitlab/gitlab.rb를 편집합니다:

    registry['notifications'] = [
      {
        'name' => 'geo_event',
        'url' => 'https://<example.com>/api/v4/container_registry_event/events',
        'timeout' => '500ms',
        'threshold' => 5,
        'backoff' => '1s',
        'headers' => {
          'Authorization' => ['<replace_with_a_secret_token>']
        }
      }
    ]
    
    note
    '을 **primary** 사이트의 `/etc/gitlab/gitlab.rb` 파일에 정의된 `external_url`로 교체하고, ''을 문자로 시작하는 대소문자 알파벳 문자열로 교체합니다. 이 명령을 사용하여 생성할 수 있습니다. `< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c 32 | sed "s/^[0-9]*//"; echo`
    note
    GitLab과 통합되지 않은 외부 레지스트리를 사용하는 경우 /etc/gitlab/gitlab.rb 파일에서 registry['notification_secret']를 지정하기만 하면 됩니다.
  3. GitLab HA의 경우에만, 모든 웹 노드의 /etc/gitlab/gitlab.rb를 편집합니다:

    registry['notification_secret'] = '<replace_with_a_secret_token_generated_above>'
    
  4. 방금 업데이트한 각 노드를 다시 구성합니다:

    gitlab-ctl reconfigure
    

secondary 사이트 구성

다음 단계를 진행하기 전에 secondary 사이트에서 컨테이너 레지스트리가 설정되어 작동하는지 확인하십시오.

컨테이너 이미지를 복제하려면 secondary 사이트가 primary 사이트의 컨테이너 레지스트리와 안전하게 통신할 수 있어야 합니다. 이를 위해 모든 사이트에 대해 하나의 키 쌍을 갖고 있어야 합니다. secondary 사이트는 이 키를 사용하여 primary 사이트 컨테이너 레지스트리에 액세스할 수 있도록 pull-only-capable한 짧은 수명의 JWT를 생성합니다.

secondary 사이트의 애플리케이션 및 Sidekiq 노드에서 다음을 수행합니다:

  1. 노드에 SSH로 로그인하고 루트 사용자로 로그인합니다:

    sudo -i
    
  2. primary에서 /var/opt/gitlab/gitlab-rails/etc/gitlab-registry.key를 노드로 복사합니다.

  3. /etc/gitlab/gitlab.rb를 편집하고 다음을 추가합니다:

    gitlab_rails['geo_registry_replication_enabled'] = true
       
    # Primary 레지스트리의 호스트 이름 및 포트, 보조 노드가 직접 Primary 레지스트리와 통신하는 데 사용됩니다
    gitlab_rails['geo_registry_replication_primary_api_url'] = 'https://primary.example.com:5050/'
    
  4. 변경 사항이 적용되도록 노드를 다시 구성합니다:

    gitlab-ctl reconfigure
    

복제 확인

컨테이너 레지스트리 복제가 작동하는지 확인하려면 secondary 사이트에서 다음을 수행합니다:

  1. 왼쪽 사이드바에서 맨 아래에서 관리 영역을 선택합니다.
  2. Geo > 노드를 선택합니다. 초기 복제 또는 “백필”이 아직 진행 중일 것입니다.

모든 Geo 사이트에서 primary 사이트의 Geo Nodes 대시 보드에서 동기화 프로세스를 모니터링할 수 있습니다.

문제 해결

컨테이너 레지스트리 복제가 활성화되었는지 확인

이는 Rails 콘솔을 사용하여 확인할 수 있습니다:

Geo::ContainerRepositoryRegistry.replication_enabled?

컨테이너 레지스트리 알림 이벤트가 누락된 경우

  1. primary 사이트의 컨테이너 레지스트리에 이미지를 푸시하면 컨테이너 레지스트리 알림이 트리거되어야 합니다.
  2. primary 사이트의 컨테이너 레지스트리가 https://<example.com>/api/v4/container_registry_event/events의 주소에서 primary 사이트 API를 호출합니다.
  3. primary 사이트는 geo_events 테이블에 replicable_name: 'container_repository', model_record_id: <컨테이너 레지스트리의 ID>로 레코드를 삽입합니다.
  4. 레코드는 PostgreSQL에 의해 secondary 사이트의 데이터베이스로 복제됩니다.
  5. Geo Log Cursor 서비스는 새 이벤트를 처리하고 Sidekiq 작업 Geo::EventWorker를 대기열에 넣습니다.

이것이 정상적으로 작동하는지 확인하려면 primary 사이트의 레지스트리에 이미지를 푸시하고 Rails 콘솔에서 다음 명령을 실행하여 알림이 수신되고 이벤트로 처리되었는지 확인할 수 있습니다:

Geo::Event.where(replicable_name: 'container_repository')

레지스트리 이벤트 로그 응답 상태 401 Unauthorized이(가) 수락되지 않았습니다

401 Unauthorized 오류는 기본 사이트의 컨테이너 레지스트리 알림이 Rails 애플리케이션에 의해 수락되지 않아 GitLab에게 무언가가 푸시되었음을 알리지 못하게 하는 것을 나타냅니다.

이 문제를 해결하려면 레지스트리 알림과 함께 전송되는 권한 부여 헤더가 기본 사이트에서 구성된 것과 일치하는지 확인하십시오. 이는 단계 기본 사이트 구성 과정에서 수행되어야 합니다.

레지스트리 오류: trusted issuer에서 토큰: "<token>"

컨테이너 이미지를 복제하기 위해 Sidekiq는 컨테이너 레지스트리로의 자신을 인증하기 위해 JWT를 사용합니다. Geo 복제는 컨테이너 레지스트리 구성이 올바르게 완료되었음을 전제로 합니다.

양쪽 사이트가 동일한 서명 키 쌍을 공유하도록 하고, 보조 사이트 구성 아래 지시된 대로 두 개 사이트의 컨테이너 레지스트리와 기본 사이트 및 보조 사이트가 동일한 토큰 발급자를 사용하도록 구성되었는지 확인하십시오.

멀티노드 배포 시, Sidekiq 노드에 구성된 발급자가 레지스트리에 구성된 값과 일치하는지 확인하십시오.

매뉴얼으로 컨테이너 레지스트리 동기화 이벤트를 트리거합니다

문제 해결을 위해 컨테이너 레지스트리 복제 프로세스를 수동으로 트리거할 수 있습니다:

  1. 왼쪽 사이드바에서 가장 아래쪽에서 관리 영역(Admin Area)을 선택합니다.
  2. Geo > 사이트를 선택합니다.
  3. 보조 사이트복제 세부정보(Replication Details)에서 컨테이너 리포지터리(Container Repositories)를 선택합니다.
  4. 한 줄에 대해 다시 동기화(Resync)를 선택하거나 모두 다시 동기화(Resync all)를 선택합니다.

또한 보조 사이트의 Rails 콘솔에서 다음 명령을 실행하여 매뉴얼으로 다시 동기화를 트리거할 수 있습니다:

registry = Geo::ContainerRepositoryRegistry.first # Geo 레지스트리 항목 선택
registry.replicator.resync # 컨테이너 리포지터리를 다시 동기화합니다
pp registry.reload # 복제 상태 필드를 확인합니다

#<Geo::ContainerRepositoryRegistry:0x00007f54c2a36060
 id: 1,
 container_repository_id: 1,
 state: "2",
 retry_count: 0,
 last_sync_failure: nil,
 retry_at: nil,
 last_synced_at: Thu, 28 Sep 2023 19:38:05.823680000 UTC +00:00,
 created_at: Mon, 11 Sep 2023 15:38:06.262490000 UTC +00:00>

state 필드는 동기화 상태를 나타냅니다:

  • "0": 동기화 대기 중 (대개 동기화가 한 번도 수행되지 않은 것을 의미)
  • "1": 동기화 시작됨 (동기화 작업이 현재 실행 중임을 나타냄)
  • "2": 성공적으로 동기화됨
  • "3": 동기화에 실패함