GitLab 容器镜像库的架构

GitLab 镜像库是用户用来存储他们自己的 Docker 镜像的地方。由于镜像库是面向客户端的,这意味着我们直接在 Web 服务器(或负载均衡器,简称 LB)上公开它。

GitLab Registry diagram

上图描述的流程:

  1. 用户在他们的客户端上运行 docker login registry.gitlab.example。 通过端口 443 访问 Web 服务器(或 LB)。
  2. Web 服务器连接到 Registry 后端池(默认使用端口 5000)。由于用户没有提供有效的令牌,镜像库返回 401 HTTP 代码和 URL(来自注册表配置的token_realm)从哪里获取。这指向 GitLab API。
  3. Docker 客户端然后连接到 GitLab API 并获取令牌。
  4. API 使用镜像库密钥对令牌进行签名,并将其交给 Docker 客户端
  5. Docker 客户端现在使用从 API 收到的令牌再次登录。它现在可以推送和拉取 Docker 镜像。

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

GitLab 和 Registry 之间的通信

Registry 无法在内部对用户进行身份验证,因此它依赖 GitLab 来验证凭据。Registry 和 GitLab 之间的连接是 TLS 加密的。GitLab 使用密钥对令牌进行签名,而 Registry 使用证书来验证签名。默认情况下会为所有安装实例生成自签名证书密钥对,可以根据需要覆盖。

GitLab 使用 Registry 私钥与 Registry 交互。当 Registry 请求发出时,会生成一个新的短期(10 分钟)命名空间受限令牌并使用私钥进行签名。然后,镜像库验证签名是否与其配置中指定的注册表证书匹配,并允许操作。GitLab 后台作业处理(通过 Sidekiq)也与 Registry 交互。这些作业直接与 Registry 对话以处理镜像删除。

配置 GitLab 和 Registry 在不同的节点上运行

默认情况下,包假定两个服务都在同一节点上运行。 为了让 GitLab 和 Registry 在单独的节点上运行,需要对 Registry 和 GitLab 进行单独配置。

配置 Registry

下面您将了解应该在 /etc/gitlab/gitlab.rb 中设置的配置选项,以便 Registry 与 GitLab 分开运行:

  • registry['registry_http_addr'],默认以编程方式设置。需要通过 Web 服务器(或 LB)访问。
  • registry['token_realm'],默认以编程方式设置。指定用于执行身份验证的端点,通常是 GitLab URL。此端点需要用户可以访问。
  • registry['http_secret'], 随机字符串。用于对状态进行签名的随机数据,可以与客户端一起存储以防止篡改。
  • registry['internal_key'],默认自动生成。GitLab 用于对令牌进行签名的密钥的内容。它们的密钥是在 Registry 服务器上创建的,但不会在那里使用。
  • gitlab_rails['registry_key_path'],默认以编程方式设置。这是将 internal_key 内容写入磁盘的路径。
  • registry['internal_certificate'],默认自动生成。 GitLab 用于签署令牌的证书内容。 -registry['rootcertbundle'],默认以编程方式设置。证书路径,将 internal_certificate 内容写入磁盘的路径。 -registry['health_storagedriver_enabled'],默认以编程方式设置。配置是否启用对配置的存储驱动程序的健康检查。
  • gitlab_rails['registry_issuer']默认值。此设置需要在 Registry 和 GitLab 之间设置相同的值。

配置 GitLab

下面您将了解应该在 /etc/gitlab/gitlab.rb 中设置的配置选项,以便 Registry 与 GitLab 分开运行:

  • gitlab_rails['registry_enabled'],必须设置为 true。 此设置将向 GitLab 发出信号,表明它应该允许 Registry API 请求。
  • gitlab_rails['registry_api_url'],默认以编程方式设置。这是内部使用的镜像库 URL,用户不需要与之交互,而是 registry['registry_http_addr']
  • gitlab_rails['registry_host'],例如 registry.gitlab.example。没有 schema 的镜像库端点,显示给最终用户的地址。 -gitlab_rails['registry_port']。镜像库端点端口,对最终用户可见。
  • gitlab_rails['registry_issuer'] 必须与镜像库配置中的颁发者相匹配。
  • gitlab_rails['registry_key_path'],与镜像库端证书匹配的密钥的路径。
  • gitlab_rails['internal_key'],GitLab 用于签署令牌的密钥内容。