GitLab 容器镜像库的架构
GitLab 镜像库是用户用来存储他们自己的 Docker 镜像的地方。由于镜像库是面向客户端的,这意味着我们直接在 Web 服务器(或负载均衡器,简称 LB)上公开它。
上图描述的流程:
- 用户在他们的客户端上运行
docker login registry.gitlab.example
。 通过端口 443 访问 Web 服务器(或 LB)。 - Web 服务器连接到 Registry 后端池(默认使用端口 5000)。由于用户没有提供有效的令牌,镜像库返回 401 HTTP 代码和 URL(来自注册表配置的
token_realm
)从哪里获取。这指向 GitLab API。 - Docker 客户端然后连接到 GitLab API 并获取令牌。
- API 使用镜像库密钥对令牌进行签名,并将其交给 Docker 客户端
- 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 用于签署令牌的密钥内容。