前言

Gitlab目前还不支持自定备份配置,当我们使用传统的apt、yum等方式安装Gitlab后,一般都是通过shell脚本+crontab来自动备份了。但是当Gitlab容器化以后这种传统的方式就不太适合了。这里记录一下通过Kubernetes原生的CronJob来自动备份。

开始之前

在开始之前需要有一套Kubernetes集群

创建ConfigMap

创建好集群后,可以将kubeconfig文件写入到 ConfigMap 中,默认kubeconfig生成在$HOME/.kube/config。 我这里HOME目录默认就是/root/。下面开始创建ConfigMap。

1
2
$ kubectl create configmap kubeconfig \
--from-file=/root/.kube/config

创建CronJob

上面之所以要先创建ConfigMap就是因为这里需要引用。否则在POD中无法执行kubectl命令的。下面再来创建CronJob。

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
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: gitlab-backup-schedule
spec:
schedule: "0 1 * * *"
successfulJobsHistoryLimit: 0
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
spec:
volumes:
- name: config
configMap:
name: kubeconfig
containers:
- name: gitlab-backup
image: lachlanevenson/k8s-kubectl:v1.10.11
volumeMounts:
- name: config
mountPath: /etc/kubeconfig
command:
- /bin/sh
- -c
- pod_name=$(kubectl get pods -l app=git-gitlab-ce -o jsonpath='{.items[*].metadata.name}' --kubeconfig=/etc/kubeconfig/config);
kubectl get po/$pod_name --kubeconfig=/etc/kubeconfig/config;
kubectl --kubeconfig=/etc/kubeconfig/config exec $pod_name -- gitlab-rake gitlab:backup:create
restartPolicy: OnFailure

这里设置了每天晚上1点开始备份,需要注意的是这里获取pod_name变量,是根据kubectl命令通过标签app=git-gitlab-ce来过滤的,这里需要根据实际的情况来。

最后

执行完上面的Job后,当达到定时的时间就会在Gitlab的备份目录中查看到备份的文件,默认Gitlab备份目录是在/var/opt/gitlab/backups