准备阶段
你需要配置的清单
Gitaly 实现了客户端-服务器架构:
Gitaly 仅管理极狐GitLab 的 Git 仓库访问。其他类型的极狐GitLab 数据不能使用 Gitaly 访问。
极狐GitLab 通过配置的仓库存储访问仓库。每个新仓库都根据它们的配置权重存储在其中一个仓库存储中。每个仓库存储:
-
1 PostgreSQL数据库 节点:10.10.0.66
-
至少 1 个 Praefect 节点(需要较少的存储空间):10.10.0.92
-
3 个 Gitaly 节点(高 CPU、高内存、快速存储)
-
gitaly-1:10.10.0.67
-
gitaly-2:10.10.0.93
-
gitaly-3:10.10.0.68
-
-
1 个 GitLab 服务器:10.10.0.91
-
Gitaly 提供对 Git 仓库的高级 RPC 访问。极狐GitLab 使用它来读取和写入 Git 数据。
Gitaly 存在于每个极狐GitLab 安装实例中,并协调 Git 仓库的存储和检索。Gitaly 是:
- 在单个 Omnibus GitLab 实例上运行的后台服务。
- 根据扩展和可用性要求,分离到自己的实例并配置为完整的集群配置。
- Gitaly 服务器是运行 Gitaly 本身的任何节点。
- Gitaly 客户端是运行向 Gitaly 服务器发出请求的进程的任何节点。Gitaly 客户端也称为 Gitaly 消费者,包括:
- Rails 应用
- Shell
- Workhorse
- Elasticsearch Indexer
- 使用存储路径直接访问仓库的 Gitaly 存储,其中每个仓库都存储在单个 Gitaly 节点上。所有请求都路由到此节点。
- Gitaly 集群提供的一个虚拟存储,每个仓库可以存储在多个 Gitaly 节点上以实现容错。在 Gitaly 集群中:
- 读取请求分布在多个 Gitaly 节点之间,可以提高性能。
- 写请求被广播到仓库副本。
-
注意Praefect 节点和3 个 Gitaly 节点都要安装gitlab(安装ce版本和gitlab-jh版本都可以) 还有这些服务器的时间必须一致不然会搭建失败
ntpdate ntp1.aliyun.com #同步时间命令
数据库PostgreSQL部署 10.10.0.66
docker pull postgres docker run -d --name postgres --restart always -e POSTGRES_PASSWORD='admin' -e POSTGRES_USER='admin' -e ALLOW_IP_RANGE=0.0.0.0/0 -v /data/postgres/data:/var/lib/postgresql -p 5432:5432 -d postgres #########解释 -name : 自定义容器名称 -e POSTGRES_PASSWORD: Postgresql数据库密码 -e POSTGRES_USER: Postgresql数据库账号 -e ALLOW_IP_RANGE=0.0.0.0/0,这个表示允许所有ip访问,如果不加,则非本机 ip 访问不了。 -v : 本地文件系统目录:容器内目录 -p: 映射端口,宿主机端口:容器端口
查看Postgresql容器状态
[root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES de5b3c8570a9 postgres "docker-entrypoint.s…" 6 minutes ago Up 6 minutes 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp postgres
psql客户端连接
#进入容器 docker exec -it de5b3c8570a9 bash #然后登录数据库 psql -h127.0.0.1 -p 5432 -Uadmin -W Password: psql (13.9, server 15.1 (Debian 15.1-1.pgdg110+1)) WARNING: psql major version 13, server major version 15. Some psql features might not work. Type "help" for help. admin=# ##########
创建一个新用户praefect
供 Praefect 使用
CREATE ROLE praefect WITH LOGIN PASSWORD 'PRAEFECT_SQL_PASSWORD'; ##PRAEFECT_SQL_PASSWORD:Praefect 使用此密码连接到 PostgreSQL。 #创建一个praefect_production新数据库由praefect用户拥有。 CREATE DATABASE praefect_production WITH OWNER praefect ENCODING UTF8;
部署配置Praefect 节点
在Praefect节点上:
-
通过编辑/etc/gitlab/gitlab.rb
# Disable all other services on the Praefect node gitaly['enable'] = false postgresql['enable'] = false redis['enable'] = false nginx['enable'] = false puma['enable'] = false sidekiq['enable'] = false gitlab_workhorse['enable'] = false prometheus['enable'] = false alertmanager['enable'] = false grafana['enable'] = false gitlab_exporter['enable'] = false gitlab_kas['enable'] = false # Praefect Configuration praefect['enable'] = true praefect['listen_addr'] = '0.0.0.0:2305' # praefect监听端口 praefect['auto_migrate'] = true praefect['database_sslmode'] = 'disable' gitlab_rails['rake_cache_clear'] = false gitlab_rails['auto_migrate'] = false praefect['auth_token'] = 'PRAEFECT_EXTERNAL_TOKEN' # Praefect集群上的存储库只能由携带此令牌的 Gitaly 客户端访问 praefect['prometheus_listen_addr'] = '0.0.0.0:9652' # 配置普罗米修斯 #连接数据库PostgreSQL praefect['database_host'] = '10.10.0.66' praefect['database_port'] = 5432 praefect['database_user'] = 'praefect' praefect['database_password'] = 'praefect6' praefect['database_dbname'] = 'praefect_production' praefect['database_direct_host'] = '10.10.0.66' praefect['database_direct_port'] = 5432 #配置虚拟存储 PRAEFECT_INTERNAL_TOKEN:Praefect 在与集群中的 Gitaly 节点通信时使用的密码 praefect['virtual_storages'] = { 'default' => { 'nodes' => { 'gitaly-1' => { 'address' => 'tcp://10.10.0.67:8075', 'token' => 'PRAEFECT_INTERNAL_TOKEN' }, 'gitaly-2' => { 'address' => 'tcp://10.10.0.93:8075', 'token' => 'PRAEFECT_INTERNAL_TOKEN' }, 'gitaly-3' => { 'address' => 'tcp://10.10.0.68:8075', 'token' => 'PRAEFECT_INTERNAL_TOKEN' }, } } }
2.保存配置文件,并重新配置
gitlab-ctl reconfigure
注意:将praefect[‘auto_migrate’]的值从false改为true为确保数据库仅在重新配置期间运行migrate,而不是在升级时,请配置:
sudo touch /etc/gitlab/skip-auto-reconfigure
然后运行:
gitlab-ctl reconfigure
请重启Praefect
gitlab-ctl restart praefect
验证 Praefect 是否可以访问 PostgreSQL
sudo -u git /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml sql-ping #输出这个 praefect sql-ping: OK 说明成功
部署配置Gitaly
-
编辑配置文件/etc/gitlab/gitlab.rb
PRAEFECT_INTERNAL_TOKEN
:Praefect 在与集群中的 Gitaly 节点通信时使用的密码,用于 Praefect 集群内的复制流量
# external_url 'http://gitlab.example.com' # 此配置需要注释 postgresql['enable'] = false redis['enable'] = false nginx['enable'] = false grafana['enable'] = false puma['enable'] = false sidekiq['enable'] = false gitlab_workhorse['enable'] = false prometheus_monitoring['enable'] = false gitlab_kas['enable'] = false # Enable only the Gitaly service gitaly['enable'] = true # Enable Prometheus if needed prometheus['enable'] = true # Disable database migrations to prevent database connections during 'gitlab-ctl reconfigure' gitlab_rails['auto_migrate'] = false gitaly['listen_addr'] = '10.10.0.67:8075' # 配置gitaly监听端口 gitaly['prometheus_listen_addr'] = '10.10.0.67:9236' gitaly['auth_token'] = 'PRAEFECT_INTERNAL_TOKEN' gitlab_rails['internal_api_url'] = 'http://10.10.0.91' #配置git仓库数据库存储位置 git_data_dirs({ "gitaly-1" => { "path" => "/var/opt/gitlab/git-data" }, "gitaly-2" => { "path" => "/var/opt/gitlab/git-data" }, "gitaly-3" => { "path" => "/var/opt/gitlab/git-data" } }) ################################################################################################################################ #注意其他两台只需该ip地址即可填写自己本机ip gitaly['listen_addr'] = '本机ip:8075' # 配置gitaly监听端口 gitaly['prometheus_listen_addr'] = '本机ip:9236' internal_api_url,这是git push操作依赖的配置。 gitlab_rails['internal_api_url'] = 'http://10.10.0.91' 填写gilab那台的ip地址 #官网对git_data_dirs配置解释 与其为每个 Gitaly 节点单独配置 git_data_dirs,通常更容易在每个 Gitaly 节点上包含所有 Gitaly 节点的配置。这是支持的,因为 Praefect virtual_storages 配置将每个存储名称(例如 gitaly-1)映射到特定节点,并相应地路由请求。这意味着您的 fleet 中的每个 Gitaly 节点都可以共享相同的配置。
-
保存配置并重新配置
gitlab-ctl reconfigure
-
拷贝Praefect节点上的/etc/gitlab/gitlab-secrets.json文件到每个Gitaly节点相同路径上。
scp /etc/gitlab/gitlab-secrets.json ip:/etc/gitlab/
-
重启gitaly
gitlab-ctl restart gitaly
必须为每个 Gitaly 节点完成上述步骤!
连接到praefect集群并运行检查程序就是再praefect节点服务器上执行
sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml dial-nodes
如上说明成功
配置Gitlab
1.编辑配置文件/etc/gitlab/gitlab.rb
PRAEFECT_EXTERNAL_TOKEN
: Praefect 集群上的存储库只能由此密码的 Gitaly 客户端访问
external_url 'http://10.10.0.91' gitaly['enable'] = false git_data_dirs({ "default" => { "gitaly_address" => "tcp://10.10.0.92:2305", "gitaly_token" => 'PRAEFECT_EXTERNAL_TOKEN' } }) prometheus['scrape_configs'] = [ { 'job_name' => 'praefect', 'static_configs' => [ 'targets' => [ '10.10.0.92:9652', # praefect-1 ] ] }, { 'job_name' => 'praefect-gitaly', 'static_configs' => [ 'targets' => [ '10.10.0.67:9236', # gitaly-1 '10.10.0.93:9236', # gitaly-2 '10.10.0.68:9236', # gitaly-3 ] ] } ] #时区设置 gitlab_rails['time_zone'] = 'Asia/Shanghai' #开启gitlab ssh端口 gitlab_rails['gitlab_shell_ssh_port'] = 22
2.拷贝Praefect节点上的/etc/gitlab/gitlab-secrets.json文件到Gitlab节点相同路径上。
scp /etc/gitlab/gitlab-secrets.json ip:/etc/gitlab/
3.在每个Gitaly节点上验证Git Hooks对Gitlab可达,在每个Gitaly节点上运行
-
对于 GitLab 15.3 及更高版本,运行
sudo /opt/gitlab/embedded/bin/gitaly check /var/opt/gitlab/gitaly/config.toml
. -
对于 GitLab 15.2 及更早版本,运行
sudo /opt/gitlab/embedded/bin/gitaly-hooks check /var/opt/gitlab/gitaly/config.toml
.
4.验证 GitLab 是否可以到达 Praefect:
gitlab-rake gitlab:gitaly:check
-
最后登录Gitlab进行验证看看一切是否顺利
部署集群参考的连接
[分享]为Omnibus Gitlab配置独立的Gitaly集群 - 技术分享 - 极狐GitLab论坛_GitLab论坛_GitLab社区_Gitlab官方论坛-GitLab中文官方论坛