gitlab之Gitaly 集群搭建

本文介绍极狐GitLab集群的部署配置,包括准备阶段所需的节点配置,如PostgreSQL数据库节点、Praefect节点、Gitaly节点和GitLab服务器。详细说明了数据库PostgreSQL部署、Praefect节点和Gitaly的部署配置,以及GitLab的配置步骤,还给出了部署集群参考连接。

准备阶段

你需要配置的清单

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节点上:

  1. 通过编辑/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

  1. 编辑配置文件/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 节点都可以共享相同的配置。 
  1. 保存配置并重新配置

    gitlab-ctl reconfigure
  2. 拷贝Praefect节点上的/etc/gitlab/gitlab-secrets.json文件到每个Gitaly节点相同路径上。

    scp /etc/gitlab/gitlab-secrets.json ip:/etc/gitlab/  
  3. 重启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

  1. 最后登录Gitlab进行验证看看一切是否顺利

部署集群参考的连接

[分享]为Omnibus Gitlab配置独立的Gitaly集群 - 技术分享 - 极狐GitLab论坛_GitLab论坛_GitLab社区_Gitlab官方论坛-GitLab中文官方论坛

配置 Gitaly 集群 | 极狐GitLab

Gitaly 和 Gitaly 集群 | 极狐GitLab

搭建 GitLab 高可用集群通常涉及多个组件的冗余设计和负载均衡,以确保 GitLab 服务的高可用性和可扩展性。以下是实现 GitLab 高可用集群的关键步骤和架构设计: ### 1. 架构设计概述 GitLab 高可用集群通常包括以下核心组件: - **GitLab 应用节点**:运行 GitLab 应用服务,包括前端、后端、数据库、Redis、对象存储等。 - **数据库集群**:使用主从复制或集群数据库(如 PostgreSQL 集群或 MySQL Galera Cluster)确保数据库的高可用性。 - **共享存储**:使用 NFS 或对象存储(如 MinIO、AWS S3)来共享 GitLab 的仓库数据、附件、备份等。 - **负载均衡器**:通过 Nginx、HAProxy 或云服务(如 AWS ELB)来分发流量到多个 GitLab 节点。 - **Redis 集群**:用于缓存和消息队列,支持高可用 Redis 集群或 Redis Sentinel。 - **Keepalived(可选)**:用于实现 VIP(虚拟 IP)的故障转移,提升集群的可用性。 ### 2. 安装与配置 GitLab 节点 使用 GitLab Omnibus 包部署多个 GitLab 应用节点,确保所有节点指向相同的共享存储、数据库和 Redis 服务。例如: ```bash # 安装 GitLab Omnibus 包 sudo apt-get install gitlab-ce # 配置 GitLab 使用共享存储 gitlab_rails['shared_path'] = "/mnt/nfs/gitlab/shared" gitlab_rails['uploads_directory'] = "/mnt/nfs/gitlab/uploads" gitlab_rails['backup_path'] = "/mnt/nfs/gitlab/backups" ``` ### 3. 数据库高可用配置 配置 PostgreSQL 或 MySQL 集群,确保数据库的高可用性。例如,使用 Patroni 和 etcd 实现 PostgreSQL 高可用集群。 ### 4. Redis 高可用配置 使用 Redis Sentinel 或 Redis Cluster 实现 Redis 的高可用性,确保缓存和队列服务不会成为单点故障。 ### 5. 共享存储配置 使用 NFS 或对象存储来共享 GitLab 的数据目录。例如,配置 NFS 共享: ```bash # 在 NFS 服务器上创建共享目录 sudo mkdir -p /mnt/nfs/gitlab sudo exportfs -o rw,sync,no_subtree_check 192.168.1.0/24:/mnt/nfs/gitlab # 在 GitLab 节点上挂载 NFS 共享目录 sudo mount 192.168.1.1:/mnt/nfs/gitlab /mnt/nfs/gitlab ``` ### 6. 负载均衡配置 使用 Nginx 或 HAProxy 配置负载均衡器,将流量分发到多个 GitLab 节点。例如,使用 Nginx 配置负载均衡: ```nginx upstream gitlab_servers { least_conn; server gitlab-node1 weight=3; server gitlab-node2; keepalive 32; } server { listen 80; server_name gitlab.example.com; location / { proxy_pass http://gitlab_servers; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ``` ### 7. Keepalived(可选) 通过 Keepalived 实现负载均衡器的高可用性,确保 VIP 的故障转移。例如,配置 Keepalived: ```bash vrrp_script chk_nginx { script "/etc/keepalived/check_nginx.sh" interval 2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 12345678 } virtual_ipaddress { 192.168.1.100 } track_script { chk_nginx } } ``` ### 8. GitLab Runner 高可用配置 GitLab Runner 可以以 Pod 形式运行在 Kubernetes 集群中,实现 CI/CD 的高可用性。通过 Kubernetes 的自动扩缩容和负载均衡机制,确保 CI/CD 任务的可靠执行。 ### 9. 监控与日志 使用 Prometheus、Grafana、ELK 等工具对 GitLab 集群进行监控和日志管理,确保能够及时发现和解决问题。 ### 10. 备份与恢复 定期备份 GitLab 数据,并测试恢复流程,确保在灾难发生时能够快速恢复服务。 通过以上步骤,可以实现 GitLab 高可用集群搭建,提升 GitLab 服务的稳定性和可靠性[^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米利都

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值