GitLab 部署运维踩坑记
前言
公司自建GitLab
作为代码托管平台, 在自己接手之前,GitLab
已经在当时很新,但现在看来很旧,BUG
很多,性能很慢的版本上已经运行了3年多,加上机房又是本地自建,缺乏专业机房的稳定性,自己一直想着升级和迁移,初来乍到,一腔热血,啥也不会, 不迁移、不升级,也能跑,也能用,1年,两年,N年,要一直这样吗? 事总要去做,问题总要去解决,或许这就是存在的价值。
迁移首先要保证数据不丢,因为这关系公司宝贵的数字资产, 登录管理员账号查看,400+ 项目,吓一跳,在经过一段时间踩坑折腾之后, 感觉也就那么回事,迁移了,升级了,之前没有的很多工作都做了,比如:容灾,写写文章记录下, 这里引用李宗盛歌曲《山丘》的一句歌词:就算终于忘了,也值了。
部署方式
首先要讲的就是如何安装部署,部署方式很多,走,去 官方瞅瞅 ,瞅到了嘛,很多, 其中官方推荐使用Linux
软件包方式,因为Linux
安装安装更快、升级更容易,并且包含其他方法所没有的增强可靠性的功能, 这里我只写我 目前 使用的方式,在阿里云托管的Kubernetes
上部署Docker
镜像整包。 可能大家会有疑问, 用了Kubernetes
为什么不使用helm
方式来部署?主要是组件太多, 虽然可以选择启用禁用,升级维护上还是有点麻烦,学习成本也挺高,不如整包来的方便,但后期肯定会使用Helm
方式来部署。
废话不多说,直接来部署文件吧,反正大家只要有Kubernetes
基础都能看懂,简单地很~
首先需要创建
PersistentVolumeClaim
用于持久化数据。1
2
3
4
5
6
7
8
9
10
11
12
13
# 数据文件
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gitlab
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 150Gi
storageClassName: alicloud-nas-subpath-quota执行
kubectl carete -f pvc.yml -n <namespace>
编写
Deployment
部署文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 部署k8s
apiVersion: apps/v1
kind: Deployment
metadata:
name: gitlab
labels:
app: gitlab
spec:
replicas: 1
strategy:
type: RollingUpdate
template:
metadata:
name: gitlab
labels:
app: gitlab
spec:
containers:
- name: gitlab
image: gitlab/gitlab-ce:14.0.5-ce.0
imagePullPolicy: IfNotPresent
# 卷挂载
volumeMounts:
# 数据文件
- mountPath: /var/opt/gitlab
name: gitlab-volume
subPath: data
# 备份文件
- mountPath: /var/opt/gitlab/backups
name: gitlab-volume
subPath: backups
# 配置文件
- mountPath: /etc/gitlab
name: gitlab-volume
subPath: config
# 日志文件
- mountPath: /var/log/gitlab
name: gitlab-volume
subPath: logs
- mountPath: /etc/localtime
name: localtime
restartPolicy: Always
# 卷
volumes:
# data
- name: gitlab-volume
persistentVolumeClaim:
claimName: gitlab
- name: localtime
hostPath:
path: /etc/localtime
selector:
matchLabels:
app: gitlab执行
kubectl carete -f deployment.yml -n <namespace>
创建
Service
服务,这里我创建的类型是ClusterIP
,并通过自建的APISIX
云原生网关将服务映射到了外部,大家可以创建适合自己的Service
服务方式,比如LoadBalance
、NodePort
这里就不多说了。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建service
apiVersion: v1
kind: Service
metadata:
labels:
app: gitlab
name: gitlab
namespace: gitlab
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: gitlab
sessionAffinity: None
type: ClusterIP执行
kubectl carete -f service.yml -n <namespace>
接下来就等待,容器运行起来后,内部需要执行漫长的操作,刷新浏览器页面等待就好了,安装成功之后,你将会看到登录页面,初始用户名为 root
密码需要进入容器内部的/etc/gitlab/initial_root_password
文件中查找。 登录进去可以进行设置密码,配置语言,等个性化操作,没啥好写的,大家自己摸索即可。
完成安装之后,我们需要进行一些配置更改,比如设置电子邮件服务器,容器使用官方的
Omnibus GitLab
包,因此所有配置都在唯一的配置文件中完成/etc/gitlab/gitlab.rb
,配置太多了,我把配置地址贴出来,大家有需要去里面寻找吧。
迁移之路
迁移之路是个痛苦惊险,又刺激的过程,用了个很笨的办法,五一假期前一天下午,将公司gitalb
容器停掉,找到数据持久化位置,通过SFTP
上传到了新环境配置的对应数据位置,耗费了很久时间,数据当时大约在48G 左右,漫长痛苦的等待,在下班的时候,将新环境的gitalb
启起来,过程漫长,数据未丢。
通过SFTP
方式比较笨,时间比较长,最简单的方式就是通过gitalb
备份,然后在新位置进行相同版本还原。下面将讲备份和还原。
注意:新环境用的gitalb版本和老环境gitalb版本是一致的。不要想着将老版本数据放到新版本里面跑,这是一件很幼稚的事。
升级迭代
版本升级,这个很刺激,坑很多,我当时是从10.1.3
版本升级上的13
的最新版本,目前最新的是14
系列,公司gitalb
版本始终紧紧跟随潮流,跟哥哥们吹牛逼说,只要我在一天,公司Gitlab
就永远不会是老版本,没办法,谁让我太喜欢进步了呢。
啥也别说了,直接上文档吧,看看官方文档的升级步骤和注意事项。如果你的版本幅度太大,啥也别说了,直接看特定版本升级和升级路径吧。
在这里,感觉能给大家分享的,就是看我列出来的官方文档,毕竟我复制翻译一份放到这里意义不大,因为文章不能像官方文档一样实时更新,升级的时候别慌,先备份,再升级,下面来讲备份了。
防患未然
防患未然,居安思危呗,就是备份恢复,又是简单地一批,贴官方文档了。
备份
备份存档保存在文件中
backup_path
指定的位置,文件名是[TIMESTAMP]_gitlab_backup.tar
,其中TIMESTAMP
标识每个备份的创建时间,以及GitLab
版本。如果您需要恢复GitLab
并且有多个备份可用,则需要时间戳。例如,如果备份名称为1493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar
,则时间戳为1493107454_2018_04_25_10.6.4-ce
。Gitalb
备份包括以下数据- Database
- Attachments
- Git repositories data
- CI/CD job output logs
- CI/CD job artifacts
- LFS objects
- Container Registry images
- GitLab Pages content
- Snippets
- Group wikis
备份不包括以下数据
GitLab 不备份任何配置文件、SSL 证书或系统文件
- 由于我是基于
Docker
镜像整包部署的,所以,我需要进入容器内部,执行命令sudo gitlab-backup create
命令,接下来就是等待了。数据量多时间就久了。
执行备份
进入容器内部执行 gitlab-backup create
即可。
存储配置文件
GitLab
提供的备份 Rake 任务不会存储配置文件。需要手动进行备份,进入/etc/gitlab/config
下目录,把数据备份一下即可。
备份上传远程云存储
将备份上传到云厂商存储,这个功能很好了,具体文档。GitLab
为 AWS
、Google
、OpenStack Swift
、Rackspace
和 Aliyun
导入云驱动程序。本地驱动程序 也可用。
我这里用的是fog-aliyun,将备份数据上传到阿里云OSS,修改/etc/gitlab/config/gitlab.rb
配置,直接上配置内容吧。
1 | gitlab_rails['backup_upload_connection'] = { |
配置上以后,进入容器内部,执行gitlab-ctl reconfigure
重新配置即可,每次在执行备份任务结束后,都会自动进行上传操作。
备份文件生命周期
为防止定期备份使用所有磁盘空间,我们需要为备份设置有限的生命周期。下次运行备份任务时,backup_keep_time
会修剪早于 的备份。此配置选项仅管理本地文件。GitLab 不会修剪存储在第三方对象存储中的旧文件, 因为用户可能没有列出和删除文件的权限。建议为对象存储配置适当的保留策略。
编辑
/etc/gitlab/gitlab.rb
:1
2## Limit backup lifetime to 7 days - 604800 seconds
gitlab_rails['backup_keep_time'] = 604800进入容器内部执行
gitlab-ctl reconfigure
重新配置 GitLab 以使更改生效。
恢复
恢复还是比较简单的,执行几个命令,先贴官方文档吧,恢复有很多种方式,不同安装方式恢复方式也有些出入,这里只写Docker
方式的。
注意:只能将备份恢复到完全相同的GitLab版本和类型 (CE/EE)。
如果备份与当前安装的版本不同,则必须 在恢复备份之前 降级 GitLab 安装。
1 | Stop the processes that are connected to the database |
执行命令,经过漫长等待,恢复执行完毕后,将备份的配置文件还原到相应位置,重启即可。
GitLab 部署运维踩坑记