Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1760289
  • 博文数量: 150
  • 博客积分: 660
  • 博客等级: 上士
  • 技术积分: 2480
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-08 11:39
文章分类

全部博文(150)

文章存档

2019年(4)

2018年(36)

2017年(53)

2016年(7)

2015年(3)

2014年(3)

2013年(27)

2012年(2)

2011年(1)

2006年(1)

2005年(13)

分类: 系统运维

2017-07-07 15:08:44

gitlab在 docker swarm集群的运行配置实践

需求说明

一直用的gitolite缺少web管理界面,也没有代码review功能,计划用gitlab统一来做代码库的管理、代码review等工作

设计及说明

要求

可用性

达到99.9%以上,满足公司内部使用的要求

易用性

有图形界面,可以做代码review

性价比

技术难度和实施难度和团队技术相适应;
最好还能提升效率和降低成本

方案特点

决定选用docker swarm集群和ceph集群的结合来配置gitlab容器,有以下特点:

分布式系统设计

  • docker swarm集群和ceph集群都是分布式系统,如果低于半数的节点失效仍可保证服务处于可用状态 软硬件冗余 每个系统至少3台以上主机、存储至少2份以上 故障恢复 docker swarm集群负责 gitlab stack容器的故障恢复,恢复时间为秒级

稳定性

  • docker和ceph集群在公司内部稳定运行半年以上的时间,并且相关的技术积累已经超过两年,通过实践检验其软件方面的稳定性达到4个9没有问题;
  • docker集群manager角色采用3台主机,在硬件失效1台的情况下,可以保障集群以后任务的正常运行,因此硬件也完全可以满足可靠性4个9的要求;
  • ceph集群的monitor角色有3台主机,osd角色有4台主机、mds角色有2台主机做主备,存储设置为保留2份,因此硬件也完全可以满足可靠性4个9的要求;

提升效率

  • 采用docker容器技术可以有效提高硬件服务器的使用效率,随着效率的提供相对应就是成本会逐步降低;

技术细节说明

容器

  • nginx+gitlab容器,后期可以拆分开

    容器监听80和22端口,映射到属主机的7080和2022端口(因是内部系统,前端还有个nginx进行反向代理)

  • redis容器

    作为gitlab缓存

  • postgresql容器

    gitlab数据库

容器源及私有仓库

  • 采用 docker hub上的 sameersbn/gitlab作为源映像
  • 容器仓库使用harbor(内部使用)

网络

overlay网络可以跨越主机解决容器的通讯,在docker swarm集群内模拟一个私有网络供gitlab stack容器使用

内部负载

3个容器只各启动1个实例,运行状态由docker swarm集群负责监控,如果挂掉集群负责重启

存储

gitab需要存储挂载到属主机目录,属主机上被挂载的存储由ceph集群提供

日志相关

存储挂载到属主机目录,属主机上被挂载的存储由ceph集群提供

实施过程

1、环境准备

2、下载gitlab映像并上传到内部仓库

 docker pull sameersbn/gitlab:9.3.4
   docker pull sameersbn/postgresql
   docker pull sameersbn/redis:latest
   docker tag         sameersbn/gitlab:9.3.4  reg.goluk.cn/gitlab/gitlab:latest
   docker push reg.goluk.cn/gitlab/gitlab:latest
   docker tag sameersbn/redis reg.goluk.cn/gitlab/redis
   docker push reg.goluk.cn/gitlab/redis
   docker tag sameersbn/postgresql reg.goluk.cn/gitlab/postgresql
   docker push reg.goluk.cn/gitlab/postgresql

3、创建存储目录

mkdir -p /mnt/cephfs/app/gitlab
cd /mnt/cephfs/app/gitlab
mkdir  git logs postgresql redis  #分别存放 gitlab、日志、数据库、缓存数据

4、创建gitlab.yml及简要说明

  • 域名及主机名

GITLAB_HOST=gitlab.corp.goluk.cn 可以通过域名访问gitlab

  • 端口

GITLAB_PORT=80 默认为80,如果非默认的话,会有在连接中显示自定义端口

GITLAB_SSH_PORT=2022 为了不和属主机上的22端口冲突,修改为2022

  • 数据库设置(postgresql)
DB_HOST=postgres
DB_USER=gitlab
DB_PASS=mobnote
  • key设置

自定义gitlab需要用到的keys,字符内容需自定义,注意长度要求

 GITLAB_SECRETS_DB_KEY_BASE=  需要32以上字符
 GITLAB_SECRETS_SECRET_KEY_BASE=  需要64以上字符
 GITLAB_SECRETS_OTP_KEY_BASE=       需要64以上字符
  • 时区设置

GITLAB_TIMEZONE=Beijing

  • 管理员密码设置

密码需要设置方便首次登陆

GITLAB_ROOT_PASSWORD=yourpassword

  • redis连接设置
REDIS_HOST=redis
REDIS_PORT=6379
  • 邮件设置

    发送邮件用的用户名密码服务器等设置,注意要自己的。

SMTP_USER=opsbot@goluk.com
SMTP_PASS=your_self_password
SMTP_HOST=smtp.exmail.qq.com
SMTP_PORT=465
SMTP_TLS=true

5、完整版的docker stack yml文件

version: '3'
services:
  postgres:
    image: reg.goluk.cn/gitlab/postgresql
    environment:
      - TZ=Asia/Shanghai
      - DB_NAME=gitlabhq_production
      - DB_USER=gitlab
      - DB_PASS=yourpassword
      - DB_EXTENSION=pg_trgm
    volumes:
      - /mnt/cephfs/app/gitlab/postgresql:/var/lib/postgresql
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
  redis:
    image: reg.goluk.cn/gitlab/redis
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /mnt/cephfs/app/gitlab/redis:/var/lib/redis
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
  gitlab:
    image: reg.goluk.cn/gitlab/gitlab
    environment:
      - TZ=Asia/Shanghai
      - GITLAB_HOST=gitlab.corp.goluk.cn
      - GITLAB_PORT=80
      - GITLAB_SSH_PORT=2022
      - DB_HOST=postgres
      - DB_USER=gitlab
      - DB_PASS=mobnote
      - GITLAB_SECRETS_DB_KEY_BASE=must_be_32
      - GITLAB_SECRETS_SECRET_KEY_BASE=must_be_64           
      - GITLAB_SECRETS_OTP_KEY_BASE=must_be_64
      - GITLAB_TIMEZONE=Beijing
      - GITLAB_ROOT_PASSWORD=mobnote@168
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - SMTP_USER=opsbot@goluk.com
      - SMTP_PASS=!YBWMsD&%97uEZqT
      - SMTP_HOST=smtp.exmail.qq.com
      - SMTP_PORT=465
      - SMTP_TLS=true

    volumes:
      - /mnt/cephfs/app/gitlab/data:/root/.ssh
      - /mnt/cephfs/app/gitlab/git:/home/git/data
      - /mnt/cephfs/app/gitlab/logs:/var/log/gitlab
    ports:
      - 7080:80
      - 2022:22
    depends_on:
      - postgresql
      - redis
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure

6、docker stack 运行

  • 开始运行 gitlab stack

docker stack deploy -c gitlab.yml gitlab 首次运行准备时间较长,约15分钟,系统可以通过http访问。

  • 查看stack

docker stack ps gitlab

ID                  NAME                IMAGE                                   NODE                DESIRED STATE       CURRENT STATE          ERROR               PORTS
7jmw5g8h8t2x        gitlab_gitlab.1     reg.goluk.cn/gitlab/gitlab:latest       swarm3              Running             Running 21 hours ago
agbye91jcqif        gitlab_redis.1      reg.goluk.cn/gitlab/redis:latest        swarm2              Running             Running 21 hours ago
pav06a4kc5so        gitlab_postgres.1   reg.goluk.cn/gitlab/postgresql:latest   swarm3              Running             Running 21 hours ago
  • 查看日志(首次运行)

docker service logs gitlab_gitlab docker stack发布的服务名为stack名字_yml文件定义的服务名

  • 停止stack

docker stack rm gitlab

7、登录测试

浏览器访问 输入默认用户名root和设置的密码即可登录系统

参考致谢

阅读(2230) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~