GitLab在docker和Kubernetes之间折腾

作者: ygqygq2 分类: 系统/运维 发布时间: 2018-12-14 18:21

GitLab在docker和Kubernetes之间折腾

@

1. 概述

最近用上了Kubernetes,刚好又要求Gitlab AutoDev配合Kubernetes,所以将旧的Gitlab升级下,并迁移成了helm版本。
但是在使用过程中,发现并不如docker版本稳定,特别是pod在重新分配后,在节点上pull image失败问题,即使配置了镜像加速,虽然有办法解决(我是多个节点去pull,某个成功后,tag,push到私有仓库,再到pod分配节点pull,tag)。
另外,helm版本的gitlab组件全部分离,相互依赖,非常复杂。在不熟悉gitlab内部原理和通信的情况下,排查问题非常困难。
于是,又将helm版本迁移到docker版本,反而是遇到了坑。本想放弃迁移回docker版本,谁想在2018年12月11日,git突然push失败了,而且问题排查半天,也没发现有用的信息。转而解决在docker版本下恢复helm版本的gitlab数据对象存储问题,好在解决了,虽然也有些问题,至少能用了。

2. Gitlab从docker迁移到Kubernetes

Gitlab docker: GitLab-CE 9.5.4
Gitlab Kubernetes: GitLab-CE 11.4.3

2.1 备份恢复过程

进入gitlab docker:

执行备份:

helm安装gitlab:

将备份文件拷出来,并同步到Kubernetes master节点:

进入Kubernetes上的gitlab task-runner pod中:

执行恢复:

2.2 恢复失败解决

恢复中断:

Gitlab上有issue说明,但是当前官方版本还没有修复。
https://gitlab.com/charts/gitlab/issues/705
https://github.com/kubernetes/enhancements/issues/361

我们按他的想法,给task-runner添加持久化存储。

pvc.yaml

kubectl apply -f pvc.yaml

kubectl edit deploy gitlab-task-runner -n devops

找到相关地方,添加挂载点和存储点:

待POD重新启来,再将备份文件拷进去,重新恢复:

恢复后,登录系统,发现仓库为空。

尝试将目录repositories同步过去恢复。

docker目录为/var/opt/gitlab/git-data/repositories
k8s里目录为/home/git/repositories

恢复后数据可用。

3. Gitlab从Kubernetes迁移到docker

Gitlab docker: GitLab-CE 11.5.2
Gitlab chart: 1.3.2 GitLab-CE 11.5.2

3.1 备份恢复过程

因为有好几G的数据量了,为了加快备份速度,不备份repositories,而是手动打包repositories。

kubectl exec <task-runner pod name> -i /bin/bash backup-utility --skip repositories

备份好的文件类似下面文件名:
1544529772_2018_12_11_11.5.2_gitlab_backup.tar

提前安装docker版gitlab,当时我装的时候版本为11.5.2。

因为恢复过程中,它会寻找/data/gitlab/data/backups/目录下的备份打包文件,因此,我们可以手动准备已经解压好的备份文件,然后打包一个小文件为1544529772_2018_12_11_11.5.2_gitlab_backup.tar以减少恢复过程中的解压时间(特别对于多次恢复)。

恢复命令:
docker exec -it gitlab gitlab-rake gitlab:backup:restore

直接将备份恢复后,在页面上随便都会报500错误,日志提示'Object Storage is not enabled',需要按下文开启lfs功能再恢复数据。

###3.2 500错误
* 情况一:

上文提到的'Object Storage is not enabled'gitlab.rb需要开启lfs功能。

恢复备份数据后,gitlab的docker中执行以下命令迁移数据至对象存储:

然后再将repositories覆盖到/data/gitlab/data/git-data/repositories/,并进gitlab docker把目录属主改为git。
在gitlab UI界面,部分项目可能提示为空项目,可以用高权限的维护者,把仓库pull下来,修改下,再push,即可解决项目为空问题。

  • 情况二:
    有可能为DB数据关系错误,需要升级数据库关系

输入以下指令查看数据升级状态

gitlab-rake db:migrate:status

果然发现有一些显示为Down,显示为Up即表示正常同,再执行数据库关系升级

gitlab-rake db:migrate

执行完成再重复重建、重启命令,问题解决。

4. helm版本问题记录

最后,记录下helm版本,push失败问题。日后再研究。

参考资料:
[1] https://docs.gitlab.com/omnibus/README.html
[2] https://docs.gitlab.com/ce/raketasks/backup_restore.html
[3] https://docs.gitlab.com/omnibus/settings/backups.html
[4] https://docs.gitlab.com/ce/workflow/lfs/lfs_administration.html
[5] https://docs.gitlab.com/ce/administration/uploads.html
[6] https://docs.gitlab.com/ce/administration/raketasks/check.html

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据