多节点 GitLab 的负载均衡器
- 版本:免费、高级、旗舰
- 产品:GitLab 自管版
在多节点 GitLab 配置中,您需要一个负载均衡器来将流量路由到应用服务器。关于使用哪种负载均衡器或具体配置的详细信息,超出了 GitLab 文档的范围。我们希望,如果您正在管理像 GitLab 这样的高可用(HA)系统,您应该已经选择了合适的负载均衡器。一些示例包括 HAProxy(开源)、F5 Big-IP LTM 和 Citrix NetScaler。本文档概述了与 GitLab 一起使用的端口和协议。
SSL
您希望在多节点环境中如何处理 SSL?有几种不同的选项:
- 每个应用节点终止 SSL
- 负载均衡器终止 SSL,并且负载均衡器与应用节点之间的通信是不安全的
- 负载均衡器终止 SSL,并且负载均衡器与应用节点之间的通信是安全的
应用节点终止 SSL
将您的负载均衡器配置为将 443 端口上的连接作为 ‘TCP’ 而不是 ‘HTTP(S)’ 协议传递。这样会将连接原封不动地传递给应用节点的 NGINX 服务。NGINX 持有 SSL 证书并在 443 端口上监听。
有关管理 SSL 证书和配置 NGINX 的详细信息,请参阅 HTTPS 文档。
负载均衡器终止 SSL(无后端 SSL)
将您的负载均衡器配置为使用 HTTP(S) 协议而不是 TCP。负载均衡器负责管理 SSL 证书和终止 SSL。
由于负载均衡器和 GitLab 之间的通信不安全,因此需要一些额外的配置。有关详细信息,请参阅 代理 SSL 文档。
负载均衡器终止 SSL(带后端 SSL)
将您的负载均衡器配置为使用 HTTP(S) 协议而不是 TCP。负载均衡器负责管理最终用户看到的 SSL 证书。
在此场景中,负载均衡器和 NGINX 之间的流量是安全的。无需为代理 SSL 添加配置,因为整个连接都是安全的。但是,必须向 GitLab 添加配置以配置 SSL 证书。有关管理 SSL 证书和配置 NGINX 的详细信息,请参阅 HTTPS 文档。
端口
基础端口
| 负载均衡器端口 | 后端端口 | 协议 |
|---|---|---|
| 80 | 80 | HTTP (1) |
| 443 | 443 | TCP 或 HTTPS (1) (2) |
| 22 | 22 | TCP |
- (1):Web 终端支持要求您的负载均衡器正确处理 WebSocket 连接。使用 HTTP 或 HTTPS 代理时,这意味着您的负载均衡器必须配置为传递
Connection和Upgrade逐跳(hop-by-hop)头。有关更多详细信息,请参阅 Web 终端 集成指南。 - (2):当为 443 端口使用 HTTPS 协议时,您必须向负载均衡器添加 SSL 证书。如果您希望在 GitLab 应用服务器上终止 SSL,请使用 TCP 协议。
GitLab Pages 端口
如果您使用支持自定义域的 GitLab Pages,则需要一些额外的端口配置。
GitLab Pages 需要一个独立的虚拟 IP 地址。配置 DNS,将 /etc/gitlab/gitlab.rb 中的 pages_external_url 指向新的虚拟 IP 地址。有关更多信息,请参阅 GitLab Pages 文档。
| 负载均衡器端口 | 后端端口 | 协议 |
|---|---|---|
| 80 | 可变 (1) | HTTP |
| 443 | 可变 (1) | TCP (2) |
- (1):GitLab Pages 的后端端口取决于
gitlab_pages['external_http']和gitlab_pages['external_https']设置。有关更多详细信息,请参阅 GitLab Pages 文档。 - (2):GitLab Pages 的 443 端口应始终使用 TCP 协议。用户可以为自定义域配置自定义 SSL,如果 SSL 在负载均衡器处终止,则无法实现这一点。
备用 SSH 端口
一些组织有禁止开放 SSH 端口 22 的策略。在这种情况下,配置一个备用的 SSH 主机名可能会有所帮助,该主机名允许用户在 443 端口上使用 SSH。与前面记录的其他 GitLab HTTP 配置相比,备用的 SSH 主机名需要一个独立的虚拟 IP 地址。
为备用的 SSH 主机名(例如 altssh.gitlab.example.com)配置 DNS。
| 负载均衡器端口 | 后端端口 | 协议 |
|---|---|---|
| 443 | 22 | TCP |
就绪检查
强烈建议多节点部署配置负载均衡器以使用 就绪检查,以确保节点准备好接受流量,然后再将流量路由到该节点。在使用 Puma 时尤其重要,因为在重启期间会有一个短暂的时期,Puma 不会接受请求。
在 GitLab 15.4 至 15.8 版本中,对就绪检查使用 all=1 参数可能会导致 Praefect 内存使用量增加 并导致内存错误。
故障排除
健康检查通过负载均衡器返回 408 HTTP 代码
如果您在 GitLab 15.0 或更高版本中使用 AWS Classic Load Balancer,则必须在 NGINX 中启用 AES256-GCM-SHA384 加密套件。有关更多信息,请参阅 NGINX 默认不再允许使用 AES256-GCM-SHA384 SSL 加密套件。
可以在 files/gitlab-cookbooks/gitlab/attributes/default.rb 文件中查看 GitLab 版本的默认加密套件,方法是选择与您的目标 GitLab 版本(例如 15.0.5+ee.0)相关联的 Git 标签。如果您的负载均衡器有要求,您可以为 NGINX 定义自定义 SSL 加密套件。
某些页面和链接被下载而不是在浏览器中渲染
某些 GitLab 功能需要使用 WebSockets。在某些场景下,如果您的负载均衡器未启用 WebSocket 支持,您可能会遇到某些链接或页面被下载而不是在浏览器中渲染的情况。下载的文件可能包含如下所示的内容:
One or more reserved bits are on: reserved1 = 1, reserved2 = 0, reserved3 = 0您的负载均衡器必须能够支持 HTTP WebSocket 请求。如果链接以这种方式被下载,请检查您的负载均衡器配置,并确保已启用 HTTP WebSocket 请求。