gitlab高可用部署方案

推荐配置

  • 预计支持 2000 左右用户
  • centos 7.8.2003
  • gitlab 13.1.4
  • postgresql 11
  • nfs v4
  • redis 5.0.9
  • ldap 2.4.44
Server NameCPU核心内存SSD 磁盘大小节点数
Gitlab Rails Server16 vCPU32G>= 200G2
NFS Server4 vCPU8G>= 1T1
PostGreSQL Server4 vCPU8G>= 300G1
Redis Server2 vCPU4G>= 200G1
OpenLDAP Server2 vCPU4G>= 100G1

Gitlab服务构成

|—|—| |gitlab-shell|用于处理Git命令和修改authorized keys列表| |gitlab-workhorse|轻量级的反向代理服务器| |logrotate|日志文件管理工具| |sidekiq|用于在后台执行队列任务(异步执行)| |postgresql|数据库| |redis|缓存数据库| |Nginx|前端web服务器| |NFS|文件共享存储|

初始化服务器

  • IP地址规划
    • 172.16.11.30 gitlab-1
    • 172.16.11.31 gitlab-2
    • 172.16.11.32 gitlab-db (nfs, postgresql, redis)
    • 172.16.11.33 gitlab-nginx (OpenLDAP)
  • disable firewalld selinux
  • 配置yum源,安装初始软件
    • /etc/yum.repos.d/gitlab-ce.repo
    • /etc/yum.repos.d/epel.repo
    • /etc/yum.repos.d/CentOS-Base.repo

配置ldap的yum源

# yum install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm


部署 Rails Server 1

安装初始化软件

# yum install curl policycoreutils-python openssh-server openssh-clients postfix
# sudo systemctl enable sshd
# sudo systemctl start sshd
# sudo systemctl enable postfix
# sudo systemctl start postfix

安装gitlab-ce

下载软件包 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
# yum localinstall -y gitlab-ce-13.1.4-ce.0.el7.x86_64.rpm

添加 /etc/gitlab/gitlab.rb 配置文件

  • cp /etc/gitlab/gitlab.rb{,.bak}
  • reset gitlab.rb 文件内容如下
[root@RJYF-GRS-01 ~]# egrep -v ^"$|#" /etc/gitlab/gitlab.rb
external_url 'https://git.cloud.com'
roles ['application_role']
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_default_can_create_group'] = false
gitlab_rails['gitlab_username_changing_enabled'] = false
gitlab_rails['ldap_enabled'] = true
gitlab_rails['prevent_ldap_sign_in'] = false
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
  main:
    label: 'CLOUD-AD'
    host: 'CLOUD-AD01.CLOUD.local'
    port: 389
    uid: 'sAMAccountName'
    bind_dn: 'CN=rjyf_svc,ou=CLOUD-User,OU=VMware-pool,DC=cloud,DC=local'
    password: 'CoDev$!2020'
    encryption: 'plain'
    verify_certificates: true
    smartcard_auth: false
    active_directory: true
    allow_username_or_email_login: true
    lowercase_usernames: false
    block_auto_created_users: false
    base: 'OU=集团,DC=cloud,DC=local'
    user_filter: ''
    attributes:
      username: ['cn']
      email: ['mail']
      name: 'displayName'
      first_name: 'name'
      last_name: 'sn'
EOS
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/var/opt/gitlab/gitlab_backup_data/backups"
gitlab_rails['backup_archive_permissions'] = 0644
gitlab_rails['backup_keep_time'] = 172800
gitlab_rails['shared_path'] = '/var/opt/gitlab/gitlab-rails/shared'
high_availability['mountpoint'] = ["/var/opt/gitlab/git-data", "/var/opt/gitlab/gitlab-rails/shared"]
gitlab_rails['uploads_directory'] = "/var/opt/gitlab/gitlab-rails/uploads"
gitlab_rails['db_adapter'] = "postgresql"
gitlab_rails['db_encoding'] = "unicode"
gitlab_rails['db_database'] = "gitlabhq_production"
gitlab_rails['db_username'] = "gitlab"
gitlab_rails['db_password'] = "git_lab_p2d"
gitlab_rails['db_host'] = "172.20.60.10"
gitlab_rails['db_port'] = 5432
gitlab_rails['redis_host'] = "172.20.60.11"
gitlab_rails['redis_port'] = 6379
puma['enable'] = true
puma['worker_timeout'] = 600
puma['worker_processes'] = 4
puma['min_threads'] = 8
puma['max_threads'] = 8
puma['per_worker_max_memory_mb'] = 850
gitlab_rails['env'] = {
   'GITLAB_RAILS_RACK_TIMEOUT' => 1200
 }
gitlab_shell['auth_file'] = "/var/opt/gitlab/.ssh/authorized_keys"
postgresql['enable'] = false
redis['enable'] = false
nginx['enable'] = true
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/_.cloud.com.ssl/STAR_cloud_com_integrated.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/_.cloud.com.ssl/STAR_cloud_com.key"
nginx['listen_addresses'] = ['*', '[::]']
gitlab_ci['builds_directory'] = '/var/opt/gitlab/gitlab-ci/builds'
[root@RJYF-GRS-01 ~]#
  • 微软 AD 认证。不能首次登陆,需要修改密码。
  • 前期测试使用OpenLDAP,等微软AD部署好了,切换到AD。
  • 部署 OpenLDAP Server 参考地址:https://www.openldap.org/doc/
  • 证书的⽂件的位置 /etc/gitlab/ssl/server.crt /etc/gitlab/ssl/server-key.key

启动gitlab服务

注意:
    在启动gitlab服务之前,需要完成NFS、PostgresqlDB、Redis的服务器部署。
# touch/etc/gitlab/skip-auto-reconfigure
# SKIP_POST_DEPLOYMENT_MIGRATIONS=truegitlab-ctlreconfigure
# gitlab-rakegitlab:env:info
# gitlab-rakegitlab:env:check
# gitlab-rakegitlab:ldap:check
# gitlab-ctlstart


部署 PostgreSQL Server

添加 pgsql yum 源

/etc/yum.repos.d/pgdg-redhat-all.repo

# wget  https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdgredhat-repo-latest.noarch.rpm
# yum install -y pgdg-redhat-repo-latest.noarch.rpm
# ls -l /etc/yum.repos.d/pgdg-redhat-all.repo

安装PostgreSQL 11

# yum install -y postgresql11-contrib postgresql11-server
# systemctl enable postgresql-11
# systemctl start postgresql-11

初始化数据库

/usr/pgsql-11/bin/postgresql-11-setup initdb

创建用户

# sudo -u postgres createuser -P -s -e gitlab
连续两次输入 nil 作为密码

配置文件目录

# ls -l /var/lib/pgsql/11/data

添加授权

# vim /var/lib/pgsql/11/data/pg_hba.conf

在最后一行添加授权策略
host    all     all             0.0.0.0/0                 md5

修改监听地址

# vim /var/lib/pgsql/11/data/postgresql.conf
listen_addresses = '*'

重启pgsql 服务

# systemctl restart postgresql-11


部署 NFS Server

安装软件

# yum install -y nfs-utils

创建目录

# mkdir -pv /data/nfs; chmod 777 /data/nfs

添加配置文件

# vim /etc/exports
/data/nfs 172.16.11.0/24(rw,sync,no_root_squash)

生效配置文件

# exportfs -arv
# showmount -e
# systemctl restart nfs
# systemctl enable nfs

在nfs上创建目录

# mkdir -pv /data/nfs/gitlab/.ssh
# mkdir -pv /data/nfs/gitlab/gitlab-rails/uploads
# mkdir -pv /data/nfs/gitlab/gitlab-rails/shared
# mkdir -pv /data/nfs/gitlab/gitlab-ci/builds
# mkdir -pv /data/nfs/gitlab/git-data

在 gitlab-1 和 gitlab-2 上创建挂载目录

# mkdir -pv /var/opt/gitlab/.ssh
# mkdir -pv /var/opt/gitlab/gitlab-rails/uploads
# mkdir -pv /var/opt/gitlab/gitlab-rails/shared
# mkdir -pv /var/opt/gitlab/gitlab-ci/builds
# mkdir -pv /var/opt/gitlab/git-data

nfs 挂载

在 gitlab-1 和 gitlab-2 上的 /etc/fstab 中添加 nfs 配置如下行

10.1.0.1:/var/opt/gitlab/.ssh /var/opt/gitlab/.ssh nfs4 defaults,vers=4.1,hard,rsize=1048576,wsize=1048576,noatime,nofail,lookupcache=positive 0 2
10.1.0.1:/var/opt/gitlab/gitlab-rails/uploads /var/opt/gitlab/gitlab-rails/uploads nfs4 defaults,vers=4.1,hard,rsize=1048576,wsize=1048576,noatime,nofail,lookupcache=positive 0 2
10.1.0.1:/var/opt/gitlab/gitlab-rails/shared /var/opt/gitlab/gitlab-rails/shared nfs4 defaults,vers=4.1,hard,rsize=1048576,wsize=1048576,noatime,nofail,lookupcache=positive 0 2
10.1.0.1:/var/opt/gitlab/gitlab-ci/builds /var/opt/gitlab/gitlab-ci/builds nfs4 defaults,vers=4.1,hard,rsize=1048576,wsize=1048576,noatime,nofail,lookupcache=positive 0 2
10.1.0.1:/var/opt/gitlab/git-data /var/opt/gitlab/git-data nfs4 defaults,vers=4.1,hard,rsize=1048576,wsize=1048576,noatime,nofail,lookupcache=positive 0 2

mount -a


部署 Redis Server

下载 redis 源码包

wget http://download.redis.io/releases/redis-6.0.6.tar.gz

安装redis

解决环境依赖
# yum -y install gcc gcc-c++ kernel-devel

升级gcc
# yum -y install centos-release-scl
# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils

永久⽣效
# echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile

临时⽣效
# scl enable devtoolset-9 bash

验证版本
# gcc --version

解压源码⽂件
# tar -xf redis-6.0.6.tar.gz -C /usr/local

制作软连并部署⼆进制⽂件
# ln -sv redis-6.0.6/ redis
# cp /usr/local/redis/src/redis-server /usr/local/bin/
# cp /usr/local/redis/src/redis-cli /usr/local/bin/

创建 /etc/redis/redis.conf 配置⽂件
# mkdir /etc/redis
# cp /usr/local/redis/redis.conf /etc/redis/

创建 rdb ⽂件夹
# mkdir /var/lib/redis/

设置 /etc/redis/redis.conf ⽂件
bind 0.0.0.0
daemonize yes
dbfilename gitlab-dump.rdb
dir /var/lib/redis/

创建开机启动脚本

# vim /usr/lib/systemd/system/redis.service
[Unit] 
Description=Redis Server 
After=network.target 
After=network-online.target 
Wants=network-online.target 
[Service] 
Type=forking 
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf 
ExecStop=/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown 
[Install] 
WantedBy=multi-user.target

设置开机启动

# systemctl enable redis
# systemc start redis

测试redis

[root@RJYF-RS-01 ~]# redis-cli  
127.0.0.1:6379> info
...
查看redis info信息


部署 Rails server 2

安装软件

# yum install gitlab-ce-13.1.4-ce.0.el7.x86_64.rpm

从gitlab-1 server上copy配置文件

# scp /etc/gitlab/gitlab.rb gitlab-2:/etc/gitlab/
# scp /etc/gitlab/gitlab-secrets.json gitlab-2:/etc/gitlab/

第二台文件示例

[root@RJYF-GRS-02 ~]# egrep -v ^"$|#" /etc/gitlab/gitlab.rb
external_url 'https://git.cloud.com'
roles ['application_role']
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_default_can_create_group'] = false
gitlab_rails['gitlab_username_changing_enabled'] = false
gitlab_rails['ldap_enabled'] = true
gitlab_rails['prevent_ldap_sign_in'] = false
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
  main:
    label: 'CLOUD-AD'
    host: 'CLOUD-AD01.CLOUD.local'
    port: 389
    uid: 'sAMAccountName'
    bind_dn: 'CN=rjyf_svc,ou=CLOUD-User,OU=VMware-pool,DC=cloud,DC=local'
    password: 'CoDev$!2020'
    encryption: 'plain'
    verify_certificates: true
    smartcard_auth: false
    active_directory: true
    allow_username_or_email_login: true
    lowercase_usernames: false
    block_auto_created_users: false
    base: 'OU=集团,DC=cloud,DC=local'
    user_filter: ''
    attributes:
      username: ['cn']
      email: ['mail']
      name: 'displayName'
      first_name: 'name'
      last_name: 'sn'
EOS
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/var/opt/gitlab/gitlab_backup_data/backups"
gitlab_rails['backup_archive_permissions'] = 0644
gitlab_rails['backup_keep_time'] = 172800
gitlab_rails['shared_path'] = '/var/opt/gitlab/gitlab-rails/shared'
high_availability['mountpoint'] = ["/var/opt/gitlab/git-data", "/var/opt/gitlab/gitlab-rails/shared"]
gitlab_rails['uploads_directory'] = "/var/opt/gitlab/gitlab-rails/uploads"
gitlab_rails['db_adapter'] = "postgresql"
gitlab_rails['db_encoding'] = "unicode"
gitlab_rails['db_database'] = "gitlabhq_production"
gitlab_rails['db_username'] = "gitlab"
gitlab_rails['db_password'] = "git_lab_p2d"
gitlab_rails['db_host'] = "172.20.60.10"
gitlab_rails['db_port'] = 5432
gitlab_rails['redis_host'] = "172.20.60.11"
gitlab_rails['redis_port'] = 6379
puma['enable'] = true
puma['worker_timeout'] = 600
puma['worker_processes'] = 4
puma['min_threads'] = 8
puma['max_threads'] = 8
puma['per_worker_max_memory_mb'] = 850
gitlab_rails['env'] = {
   'GITLAB_RAILS_RACK_TIMEOUT' => 1200
 }
gitlab_shell['auth_file'] = "/var/opt/gitlab/.ssh/authorized_keys"
postgresql['enable'] = false
redis['enable'] = false
nginx['enable'] = true
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/_.cloud.com.ssl/STAR_cloud_com_integrated.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/_.cloud.com.ssl/STAR_cloud_com.key"
nginx['listen_addresses'] = ['*', '[::]']
gitlab_ci['builds_directory'] = '/var/opt/gitlab/gitlab-ci/builds'
[root@RJYF-GRS-02 ~]#

启动 gitlab 服务

# touch /etc/gitlab/skip-auto-reconfigure
# SKIP_POST_DEPLOYMENT_MIGRATIONS=true gitlab-ctl reconfigure
# gitlab-ctl start

至此两台master、redis、nfs、postgresql已经部署完成。



配置前端代理使用haproxy

https://docs.gitlab.com/ee/administration/high_availability/load_balancer.html
# yum install haproxy

配置相同的sshd 秘钥

# scp /etc/ssh/ssh_host_* gitlab-2:/etc/ssh/

haproxy 配置文件

[root@RJYF-HP-01 ~]# cat /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats
defaults
    mode                    tcp
    log                     global
    option                  httplog
    option                  dontlognull
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 4000

# enable gitlab 80
frontend  gitlab_http *:80
    option              tcplog
    default_backend     backend_gitlab_http
backend backend_gitlab_http
    balance     source
    option      tcp-check
    option      httpchk GET /-/readiness?all=1
    http-check  expect status 200
    default-server inter 5s fall 3 rise 2
    server      backend_gitlab_http_server1 172.20.60.7:80 check port 80
    server      backend_gitlab_http_server2 172.20.60.8:80 check port 80

# enable gitlab 443
frontend  gitlab_https *:443
    option              tcplog
    default_backend     backend_gitlab_https
backend backend_gitlab_https
    balance     source
    option      httpchk GET /-/readiness?all=1
    http-check  expect status 200
    default-server inter 5s fall 3 rise 2
    server      backend_gitlab_https_server1 172.20.60.7:443 check port 80
    server      backend_gitlab_https_server2 172.20.60.8:443 check port 80

# enable gitlab 22
frontend  gitlab_ssh *:22
    option              tcplog
    default_backend     backend_gitlab_ssh
backend backend_gitlab_ssh
    balance     source
    option      tcp-check
    option      httpchk GET /-/readiness?all=1
    http-check  expect status 200
    default-server inter 5s fall 3 rise 2
    server      backend_gitlab_ssh_server1 172.20.60.7:22 check port 80
    server      backend_gitlab_ssh_server2 172.20.60.8:22 check port 80

[root@RJYF-HP-01 ~]#

信任自签名证书

# git config --global http.sslVerify false