セカンダリサイトのコンテナレジストリ

セカンダリGeo サイトに、プライマリGeo サイトのものと同じコンテナ レジストリをセットアップできます。

note
コンテナ レジストリのレプリケーションはディザスタリカバリ目的でのみ使用します。セカンダリからコンテナレジストリデータを引き出すことはお勧めしません。将来的に実装する機能案については、Geoを参照してください:詳しくは、セカンダリサイトからの読み取り要求を提供することによるコンテナイメージの高速化を参照してください。

サポートされるコンテナレジストリ

Geo は以下のタイプのコンテナ レジストリをサポートしています:

サポートされるイメージ形式

Geo では、以下のコンテナ・イメージ・フォーマットをサポートしています:

さらに、GeoはBuildKitキャッシュイメージもサポートしています。

対応ストレージ

Docker

サポートされているレジストリ・ストレージ・ドライバの詳細については、Dockerレジストリ・ストレージ・ドライバを参照してください。

レジストリをデプロイする際のロードバランシングの考慮点、GitLab統合コンテナレジストリのストレージドライバの設定方法をお読みください。

OCIアーティファクトをサポートするレジストリ

以下のレジストリがOCIアーティファクトをサポートしています:

  • CNCF ディストリビューション - ローカル/オフライン検証
  • Azureコンテナレジストリ(ACR)
  • Amazon Elasticコンテナレジストリ(ECR)
  • Googleアーティファクトレジストリ(GAR)
  • GitHub Packages コンテナレジストリ(GHCR)
  • バンドルバー

詳細については、OCIディストリビューション仕様を参照してください。

コンテナレジストリのレプリケーション設定

ストレージに依存しないレプリケーションを有効にすることで、クラウドまたはローカルストレージに使用できます。新しいイメージがプライマリサイトにプッシュされるたびに、各セカンダリサイトはそれを自分のコンテナリポジトリにプルします。

コンテナレジストリのレプリケーションを設定するには、以下の手順に従います:

  1. プライマリ・サイトを設定します。
  2. セカンダリ・サイトを設定します。
  3. コンテナレジストリのレプリケーションを確認します。

プライマリサイトの設定

次の手順を実行する前に、プライマリサイトでコンテナレジストリが設定され、動作していることを確認してください。

新しいコンテナイメージをレプリケートできるようにするには、Container レジストリからプライマリサイトにプッシュごとに通知イベントを送信する必要があります。コンテナレジストリとプライマリ上のウェブノード間で共有されるトークンを使用して、通信をよりセキュアにします。

  1. GitLabプライマリサーバにSSHでログインし、rootでログインします(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
    <example.com> をプライマリ・サイトの/etc/gitlab/gitlab.rb ファイルで定義されているexternal_url に置き換え、<replace_with_a_secret_token> を大文字と小文字を区別する英数字で始まる文字列に置き換えます。で生成できます。< /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のみ。各Webノードで/etc/gitlab/gitlab.rb を編集します:

    registry['notification_secret'] = '<replace_with_a_secret_token_generated_above>'
    
  4. 先ほど更新した各ノードを再設定します:

    gitlab-ctl reconfigure
    

セカンダリサイトの設定

次の手順を実行する前に、セカンダリサイトでコンテナレジストリが設定され、動作していることを確認してください。

以下の手順は、レプリケートされたコンテナイメージを確認する予定の各セカンダリサイトで実行する必要があります。

セカンダリサイトが プライマリサイトのコンテナレジストリとセキュアに通信できるようにする必要があるため、すべてのサイトに対して単一のキーペアを用意する必要があります。セカンダリサイトはこのキーを使用して、プライマリサイトのコンテナレジストリにアクセスするためのプル専用の短命JWTを生成します。

セカンダリサイトの各アプリケーションとSidekiqノードについて:

  1. ノードにSSH接続し、root ユーザーとしてログインします:

    sudo -i
    
  2. /var/opt/gitlab/gitlab-rails/etc/gitlab-registry.keyプライマリからノードにコピーします。

  3. /etc/gitlab/gitlab.rb を編集し、追加してください:

    gitlab_rails['geo_registry_replication_enabled'] = true
       
    # Primary registry's hostname and port, it will be used by
    # the secondary node to directly communicate to primary registry
    gitlab_rails['geo_registry_replication_primary_api_url'] = 'https://primary.example.com:5050/'
    
  4. 変更を有効にするには、ノードを再設定してください:

    gitlab-ctl reconfigure
    

レプリケーションの確認

セカンダリサイトでコンテナレジストリのレプリケーションが機能していることを確認します:

  1. 左のサイドバーで、Search を選択するか、次のページに進んでください。
  2. Admin Areaを選択します。
  3. 左サイドバーで、Geo > Nodesを選択します。最初のレプリケーション(”backfill”)はおそらくまだ進行中です。

ブラウザでプライマリサイトの Geo ノードダッシュボードから各 Geo サイトの同期プロセスを監視できます。