- 第一步:手动复制极狐GitLab 密钥值
- 第二步:手动复制主站点的 SSH 主机密钥
- 第三步:添加次要站点
- 第四步:(可选)使用自定义证书
- 第五步:启用通过 HTTP/HTTPS 和 SSH 的 Git 访问
- 第六步:验证次要站点的正常功能
- 故障排除
{{< details >}}
- Tier: 专业版, 旗舰版
- Offering: 私有化部署
{{< /details >}}
{{< alert type=”note” >}}
这是设置一个 次要 Geo 站点的最后一步。设置步骤必须遵循文档指南。要不然需要在进行之前完成所有先前的阶段。
{{< /alert >}}
配置一个次要站点的基本步骤是:
- 在主站点和次要站点之间复制所需配置。
- 在每个次要站点上配置一个跟踪数据库。
- 在每个次要站点上启动极狐GitLab。
本文档重点介绍第一项。建议您在测试/生产环境中执行这些步骤之前,先阅读所有步骤。
主站点和次要站点的先决条件:
{{< alert type=”note” >}}
不要为次要站点设置任何自定义身份验证。这由主站点处理。任何需要访问管理员区域的更改都需要在主站点中完成,因为次要站点是只读副本。
{{< /alert >}}
第一步:手动复制极狐GitLab 密钥值
极狐GitLab 将多个密钥值存储在 /etc/gitlab/gitlab-secrets.json
文件中,该文件在站点的所有节点上必须相同。在站点之间自动复制这些密钥之前,必须手动将它们复制到次要站点的所有节点。
-
SSH 到主站点的 Rails 节点,并执行以下命令:
sudo cat /etc/gitlab/gitlab-secrets.json
这将以 JSON 格式显示需要复制的密钥。
-
SSH 进入次要 Geo 站点上的每个节点并以
root
用户身份登录:sudo -i
-
备份任何现有密钥:
mv /etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab-secrets.json.`date +%F`
-
将
/etc/gitlab/gitlab-secrets.json
从主站点的 Rails 节点复制到次要站点的每个节点,或在节点之间复制并粘贴文件内容:sudo editor /etc/gitlab/gitlab-secrets.json # 粘贴您在主站点上运行的 `cat` 命令的输出 # 保存并退出
-
确保文件权限正确:
chown root:root /etc/gitlab/gitlab-secrets.json chmod 0600 /etc/gitlab/gitlab-secrets.json
-
为了使更改生效,重新配置次要站点的每个 Rails、Sidekiq 和 Gitaly 节点:
gitlab-ctl reconfigure gitlab-ctl restart
第二步:手动复制主站点的 SSH 主机密钥
极狐GitLab 与系统安装的 SSH 守护进程集成,指定一个用户(通常称为 git
),通过该用户处理所有访问请求。
在 灾难恢复 情况下,极狐GitLab 系统管理员将次要站点提升为主站点。主域的 DNS 记录也应该更新为指向新的主站点(之前是次要站点)。这样做可以避免更新 Git 远程和 API URL 的需要。
这导致所有 SSH 请求到新提升的主站点由于 SSH 主机密钥不匹配而失败。为防止这种情况,必须手动将主 SSH 主机密钥复制到次要站点。
SSH 主机密钥路径取决于使用的软件:
- 如果使用 OpenSSH,路径为
/etc/ssh
。 - 如果使用
gitlab-sshd
,路径为/var/opt/gitlab/gitlab-sshd
。
在以下步骤中,用您正在使用的路径替换 <ssh_host_key_path>
:
-
SSH 到次要站点的每个 Rails 节点并以
root
用户身份登录:sudo -i
-
备份任何现有的 SSH 主机密钥:
find <ssh_host_key_path> -iname 'ssh_host_*' -exec cp {} {}.backup.`date +%F` \;
-
从主站点复制 SSH 主机密钥:
如果可以通过 root 用户访问提供 SSH 流量的主站点上的一个节点(通常是主要的极狐GitLab Rails 应用程序节点):
# 从次要站点运行此命令,将 `<primary_site_fqdn>` 更改为服务器的 IP 或 FQDN scp root@<primary_node_fqdn>:<ssh_host_key_path>/ssh_host_*_key* <ssh_host_key_path>
如果只能通过具有
sudo
权限的用户访问:# 从主站点的节点运行此命令: sudo tar --transform 's/.*\///g' -zcvf ~/geo-host-key.tar.gz <ssh_host_key_path>/ssh_host_*_key* # 在次要站点的每个节点上运行此命令: scp <user_with_sudo>@<primary_site_fqdn>:geo-host-key.tar.gz . tar zxvf ~/geo-host-key.tar.gz -C <ssh_host_key_path>
-
在次要站点的每个 Rails 节点上,确保文件权限正确:
chown root:root <ssh_host_key_path>/ssh_host_*_key* chmod 0600 <ssh_host_key_path>/ssh_host_*_key
-
要验证密钥指纹是否匹配,请在每个站点的主节点和次要节点上执行以下命令:
for file in <ssh_host_key_path>/ssh_host_*_key; do ssh-keygen -lf $file; done
您应该得到类似于此的输出,并且它们在两个节点上应该相同:
1024 SHA256:FEZX2jQa2bcsd/fn/uxBzxhKdx4Imc4raXrHwsbtP0M root@serverhostname (DSA) 256 SHA256:uw98R35Uf+fYEQ/UnJD9Br4NXUFPv7JAUln5uHlgSeY root@serverhostname (ECDSA) 256 SHA256:sqOUWcraZQKd89y/QQv/iynPTOGQxcOTIXU/LsoPmnM root@serverhostname (ED25519) 2048 SHA256:qwa+rgir2Oy86QI+PZi/QVR+MSmrdrpsuH7YyKknC+s root@serverhostname (RSA)
-
验证您拥有现有私钥的正确公钥:
# 这将打印私钥的指纹: for file in <ssh_host_key_path>/ssh_host_*_key; do ssh-keygen -lf $file; done # 这将打印公钥的指纹: for file in <ssh_host_key_path>/ssh_host_*_key.pub; do ssh-keygen -lf $file; done
{{< alert type=”note” >}}
私钥和公钥命令的输出应生成相同的指纹。
{{< /alert >}}
-
在次要站点的每个 Rails 节点上,重新启动
sshd
或gitlab-sshd
服务:-
对于 OpenSSH:
# Debian 或 Ubuntu 安装 sudo service ssh reload # CentOS 安装 sudo service sshd reload
-
对于
gitlab-sshd
:sudo gitlab-ctl restart gitlab-sshd
-
-
验证 SSH 是否仍然正常工作。
在新的终端中 SSH 到您的极狐GitLab 次要服务器。如果无法连接,请根据前面的步骤验证权限是否正确。
第三步:添加次要站点
-
SSH 到次要站点的每个 Rails 和 Sidekiq 节点并以 root 身份登录:
sudo -i
-
编辑
/etc/gitlab/gitlab.rb
并为您的站点添加一个唯一名称。您将在接下来的步骤中需要此名称:## ## Geo 站点的唯一标识符。请参阅 ## https://gitlab.cn/docs/ee/administration/geo_sites.html#common-settings ## gitlab_rails['geo_node_name'] = '<site_name_here>'
-
为了使更改生效,重新配置次要站点的每个 Rails 和 Sidekiq 节点:
gitlab-ctl reconfigure
- 转到主节点极狐GitLab 实例:
- 在左侧边栏底部,选择 管理员。
- 在左侧边栏中,选择 Geo > 站点。
- 选择 添加站点。
- 在 名称 中,输入
/etc/gitlab/gitlab.rb
中gitlab_rails['geo_node_name']
的值。字符必须完全匹配。 - 在 外部 URL 中,输入
/etc/gitlab/gitlab.rb
中external_url
的值。值必须匹配,但如果一个以/
结尾而另一个不以/
结尾则无妨。 - 可选。在 内部 URL(可选) 中,为次要站点输入一个内部 URL。
- 可选。选择应由次要站点复制的群组或存储分片。留空以复制所有内容。有关更多信息,请参阅 选择性同步。
- 选择 保存更改 以添加次要站点。
-
SSH 到次要站点的每个 Rails 和 Sidekiq 节点并重新启动服务:
gitlab-ctl restart
通过运行以下命令检查您的 Geo 设置是否存在任何常见问题:
gitlab-rake gitlab:geo:check
如果任何检查失败,请检查 故障排除文档。
-
SSH 到主站点的 Rails 或 Sidekiq 服务器并以 root 登录以验证次要站点是否可访问或您的 Geo 设置是否存在任何常见问题:
gitlab-rake gitlab:geo:check
如果任何检查失败,请检查 故障排除文档。
在将次要站点添加到 Geo 管理页面并重新启动后,站点会自动开始从主站点复制缺失的数据,称为回填。同时,主站点开始通知每个次要站点任何更改,以便次要站点可以立即对这些通知采取行动。
确保次要站点正在运行并可访问。您可以使用与主站点相同的凭据登录次要站点。
第四步:(可选)使用自定义证书
如果以下情况,您可以安全地跳过此步骤:
- 您的主站点使用公共 CA 颁发的 HTTPS 证书。
- 您的主站点仅连接到使用 CA 颁发的(非自签名)HTTPS 证书的外部服务。
自定义或自签名证书用于入站连接
如果您的极狐GitLab Geo 主站点使用自定义或自签名证书来保护入站 HTTPS 连接,这可以是单域或多域证书。
根据证书类型安装正确的证书:
-
多域证书,包括主站点和次要站点域:在次要站点的所有 Rails、Sidekiq 和 Gitaly 节点上安装证书,路径为
/etc/gitlab/ssl
。 -
单域证书,证书特定于每个 Geo 站点域:为您的次要站点域生成有效证书,并在次要站点的所有 Rails、Sidekiq 和 Gitaly 节点上,按照这些说明安装,路径为
/etc/gitlab/ssl
。
连接到使用自定义证书的外部服务
自签名证书的副本需要添加到主站点的所有节点上需要访问服务的节点的信任存储中。
为了让次要站点能够访问相同的外部服务,必须将这些证书添加到次要站点的信任存储中。
如果您的主站点正在使用用于入站 HTTPS 连接的自定义或自签名证书,则需要将主站点的证书添加到次要站点的信任存储中:
-
SSH 到次要站点的每个 Rails、Sidekiq 和 Gitaly 节点并以 root 登录:
sudo -i
-
从主站点复制受信任的证书:
如果可以通过 root 用户访问提供 SSH 流量的主站点上的一个节点:
scp root@<primary_site_node_fqdn>:/etc/gitlab/trusted-certs/* /etc/gitlab/trusted-certs
如果只能通过具有 sudo 权限的用户访问:
# 从主站点的节点运行此命令: sudo tar --transform 's/.*\///g' -zcvf ~/geo-trusted-certs.tar.gz /etc/gitlab/trusted-certs/* # 在次要站点的每个节点上运行此命令: scp <user_with_sudo>@<primary_site_node_fqdn>:geo-trusted-certs.tar.gz . tar zxvf ~/geo-trusted-certs.tar.gz -C /etc/gitlab/trusted-certs
-
重新配置次要站点中每个更新的 Rails、Sidekiq 和 Gitaly 节点:
sudo gitlab-ctl reconfigure
第五步:启用通过 HTTP/HTTPS 和 SSH 的 Git 访问
Geo 通过 HTTP/HTTPS 同步仓库,因此需要启用此克隆方法。默认情况下启用此功能,但如果将现有站点转换为 Geo,则应检查:
在主站点上:
- 在左侧边栏底部,选择 管理员。
- 选择 设置 > 常规。
- 展开 可见性和访问控制。
- 如果使用 Git over SSH,则:
- 确保“启用的 Git 访问协议”设置为“同时使用 SSH 和 HTTP(S)”。
- 按照步骤配置数据库中的快速 SSH 密钥查找在所有主站点和次要站点上。
- 如果不使用 Git over SSH,则将“启用的 Git 访问协议”设置为“仅 HTTP(S)”。
第六步:验证次要站点的正常功能
您可以使用与主站点相同的凭据登录次要站点。登录后:
- 在左侧边栏底部,选择 管理员。
- 选择 Geo > 站点。
- 验证其是否正确识别为次要 Geo 站点,并且 Geo 是否已启用。
初始复制可能需要一些时间。站点或“回填”的状态可能仍在进行中。您可以在浏览器中从主站点的 Geo 站点仪表板监控每个 Geo 站点的同步过程。
如果您的安装无法正常工作,请检查故障排除文档。
仪表板中可能出现的两个最明显的问题是:
- 数据库复制工作不正常。
- 实例到实例的通知不起作用。在这种情况下,可能是以下之一:
- 您正在使用自定义证书或自定义 CA(请参阅故障排除文档)。
- 实例被防火墙阻止(检查防火墙规则)。
禁用次要站点会停止同步过程。
如果在主站点上为多个存储库分片自定义了存储库存储,则必须在每个次要站点上复制相同的配置。
将用户指向使用 Geo 站点指南。
当前,同步的内容包括:
- Git 仓库。
- Wikis。
- LFS 对象。
- 议题、合并请求、代码片段和评论附件。
- 用户、群组和项目头像。
故障排除
请参阅故障排除文档。