背景:通过cronjob的方式实现在k8s中,周期性的进行gitlab的数据备份。
一、数据备份
dockerfile
FROM ubuntu:20.04
# 安装必要的工具和依赖
RUN apt-get update && \
apt-get install -y curl wget vim unzip
# 安装 kubectl
COPY kubectl /bin
RUN chmod +x /bin/kubectl
gitlab-backup-cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: gitlab-backup
namespace: middleware
spec:
schedule: "0 19 * * *"
concurrencyPolicy: Allow
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
spec:
containers:
- name: gitlab-backup
image: registry.sensetime.com/middleware/gitlab-backup:v10.1
imagePullPolicy: IfNotPresent
command: ['bash', '-c']
args:
- |
bash /usr/local/bin/backup_gitlab.sh
volumeMounts:
- mountPath: /etc/localtime
name: localtime
- mountPath: /root/.kube/config
name: kubeconfig
- mountPath: /usr/local/bin/backup_gitlab.sh
name: backup-script
subPath: backup_gitlab.sh
volumes:
- hostPath:
path: /etc/localtime
type: ''
name: localtime
- hostPath:
path: /root/.kube/config
type: ''
name: kubeconfig
- configMap:
name: gitlab-backup-config
name: backup-script
restartPolicy: OnFailure
这里有个特别重要点!!!如果不明白你的cornjob就不会按照你想要的时间去运行
#UTC 和 CST 的关系
咋们的服务器都同步的是中国标准时间(CST),而容器里面的时间是世界标准时间(UTC),时差:CST 比 UTC 快 8 小时。所以在cronjob中配置的时间要比咋们的北京时间少8小时!!!!!
实际应用:
如果在 UTC 时间 15:00 执行的任务,在中国时间(CST)中,应该是 23:00。
gitlab-backup-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: gitlab-backup-config
namespace: middleware
data:
backup_gitlab.sh: |
#!/bin/bash
# 获取当前日期
current_date=$(date +"%Y_%m_%d")
# pod 所在的名称空间
namespace="middleware"
# 获取 gitlab 的 pod 名
pod_name=$(kubectl get pod -n $namespace | grep -v "NAME" | grep gitlab-ce | awk '{print $1}')
# 执行完整备份
echo "执行 $current_date 完整备份..."
kubectl exec $pod_name -n $namespace -- gitlab-rake gitlab:backup:create && echo "$current_date 备份成功"
#只保留3天的备份数据
echo "只保留3天的备份数据"
kubectl exec $pod_name -n $namespace -- find /var/opt/gitlab/backups/ -mtime +3 -exec rm -rf {} \; && echo "已清理3天之前的数据"
二、数据恢复
重新拉起一个新的gitlab的pod进行数据恢复
#确认pod名称
kubectl get pods -n middleware
#将备份文件拷贝到gitlab容器下/var/opt/gitlab/backups下
kubectl cp /root/$backup_file_name $namespace/$pod_name:/var/opt/gitlab/backups
#命令行执行备份恢复命令
kubectl exec -it $pod_name -n middleware gitlab-backup restore force=yes /var/opt/gitlab/backups/1714968034_2024_05_06_13.12.12_gitlab_backup.tar
三、备份命令对比总结
特性 | gitlab-rake gitlab:backup:create | gitlab-backup create |
---|---|---|
执行方式 | Rake 任务 | 独立命令 |
功能范围 | 仅支持备份 | 支持备份、恢复、检查、清理 |
操作复杂度 | 略高(需要理解 Rake 任务) | 简单直观 |
高级选项 | 支持过滤备份内容 | 支持保留时间、路径等 |
备份范围 | 备份核心数据 | 备份核心数据 |
使用场景 | 适合熟悉 Rake 任务的用户 | 适合大多数用户 |
GitLab 12.1 及以上版本:支持完整的 gitlab-backup
命令,包括创建、恢复、检查和清理备份。
如果你使用的是 GitLab 12.0 及以下版本,则不支持 gitlab-backup
命令,只能使用 gitlab-rake gitlab:backup:create
。
镜像包的位置:通过网盘分享的文件:gitlab-backup
链接: https://pan.baidu.com/s/1lgEKPJzxu8bt3NxGKlDkyQ?pwd=2025 提取码: 2025
–来自百度网盘超级会员v3的分享