GitLabコンテナレジストリのアーキテクチャ

GitLab レジストリは、ユーザーが自分の Docker イメージを保存するために使うものです。 そのため、レジストリはクライアント向きで、ウェブサーバー(またはロードバランサー、略して LB)上に直接公開します。

GitLab Registry diagram

上の図で説明した流れ:

  1. ユーザーは自分のクライアント上でdocker login registry.gitlab.example 、ポート443でウェブサーバー(またはLB)にアクセスします。
  2. Web サーバーはレジストリのバックエンドプールに接続します (デフォルトではポート 5000 を使用)。 ユーザーが有効なトークンを提供していないため、レジストリは 401 HTTP コードとトークンを取得するための URL (token_realm from Registry configuration) を返します。 これは GitLab API を指しています。
  3. そしてDockerクライアントはGitLab APIに接続し、トークンを取得します。
  4. APIはトークンをレジストリキーで署名し、Dockerクライアントに渡します。
  5. DockerクライアントはAPIから受け取ったトークンで再度ログインし、Dockerイメージをプッシュしたりプルしたりできるようになりました。

参照https://docs.docker.com/registry/spec/auth/token/

GitLabとレジストリ間の通信

レジストリには内部でユーザーを認証する方法がないため、GitLabに認証情報の検証を依存しています。 レジストリとGitLabの接続はTLSで暗号化されています。 鍵はGitLabがトークンに署名するために使用し、証明書はレジストリが署名を検証するために使用します。 デフォルトでは、すべてのインストールに対して自己署名証明書の鍵ペアが生成されます。 これは必要に応じて上書きすることができます。

GitLabはレジストリの秘密鍵を使ってレジストリとのやり取りを行います。 レジストリのリクエストが発信されると、新しい短命(10分)の名前空間限定トークンが生成され、秘密鍵で署名されます。 レジストリはその署名が設定で指定されたレジストリ証明書と一致することを確認し、オペレーションを許可します。 GitLabのバックグラウンドジョブ処理(Sidekiqを通して)もレジストリとのやり取りを行います。 これらのジョブはイメージの削除を処理するためにレジストリと直接やり取りを行います。

GitLab とレジストリを別々のノードで実行するように設定します。

GitLabとレジストリを別々のノードで動作させるには、レジストリとGitLabで別々の設定が必要です。

レジストリの設定

以下は、GitLabとは別にレジストリを実行するために、/etc/gitlab/gitlab.rbで設定すべき設定オプションです:

  • registry['registry_http_addr']ウェブサーバ(またはLB)から到達可能ある必要があります。
  • registry['token_realm']認証に使うエンドポイントを指定します。 通常は GitLab の URL を使います。 このエンドポイントには、ユーザが到達できる必要があります。
  • registry['http_secret']ランダム文字列。 状態に署名するために使用されるランダムなデータで、改ざんから保護するためにクライアントに保存されることがあります。
  • registry['internal_key']GitLabがトークンに署名するために使用するキーの内容。 これらのキーはレジストリサーバー上に作成されますが、そこでは使用されません。
  • gitlab_rails['registry_key_path']これはinternal_key の内容がディスクに書き込まれるパスです。
  • registry['internal_certificate']GitLabがトークンに署名するために使用する証明書の内容。
  • registry['rootcertbundle']証明書へのパスinternal_certificateの内容がディスクに書き込まれるパスです。
  • registry['health_storagedriver_enabled']構成されたストレージドライバのヘルスチェックを有効にするかどうかを構成します。
  • gitlab_rails['registry_issuer']この設定はレジストリとGitLabで同じにする必要があります。

GitLab の設定

GitLabをレジストリから切り離して実行するために、/etc/gitlab/gitlab.rbで設定するオプションを以下に示します:

  • gitlab_rails['registry_enabled']trueこの設定は、レジストリ API リクエストを許可するように GitLab に通知します。
  • gitlab_rails['registry_api_url']これは内部で使用されるレジストリURLで、ユーザが操作する必要はありません。registry['registry_http_addr'] with scheme.
  • gitlab_rails['registry_host']registry.gitlab.exampleレジストリのエンドポイントで、エンドユーザーに表示されるアドレスです。
  • gitlab_rails['registry_port']エンドユーザーから見えるレジストリエンドポイントポート。
  • gitlab_rails['registry_issuer'] はレジストリ設定の発行者と一致しなければなりません。
  • gitlab_rails['registry_key_path']レジストリ側の証明書と一致する鍵へのパス。
  • gitlab_rails['internal_key']GitLab がトークンに署名するために使用するキーの内容。