一、三份脚本的职责拆分

1.1 GitLab 备份脚本

kk=$(kubectl get pod -A | grep gitlab | head -n 1 | awk '{print $1,$2}')
dt=$(date +'%Y%m%d_%H%M')
backup_dir=/apps/scripts/gitlab_backup/$dt
kubectl exec -it -n $kk -- gitlab-ctl stop puma
kubectl exec -it -n $kk -- gitlab-rake gitlab:backup:create
kubectl cp -n $kk:/etc/gitlab $backup_dir
kubectl cp -n $kk:/var/opt/gitlab/backups/ $backup_dir

1.2 MySQL 备份脚本

mysql_user="root"
mysql_password="<your-password>"
backup_dir=/apps/scripts/mysql_backup/$dt

kubectl exec -it -n $kk -- mysqldump \
  -u${mysql_user} -p${mysql_password} \
  --set-gtid-purged=OFF --triggers --routines --events \
  --single-transaction --databases <db-list> \
  > ${backup_dir}/mysql_backup_${dt}.sql

1.3 PostgreSQL 备份脚本

kk=$(kubectl get pod -A | grep postgres | awk '{print $1,$2}')
ll=$(kubectl get pod -A | grep postgres | awk '{print $1,$2}' | sed 's/ /\//g')
dt=$(date +'%Y%m%d')
backup_dir=/apps/scripts/pg_backup/$dt

kubectl exec -it -n $kk -- su - postgres -c "/usr/bin/pg_dumpall -h 127.0.0.1 -p 5432 > /tmp/all_databases-$dt.sql"
kubectl cp $ll:/tmp/all_databases-$dt.sql $backup_dir/pgsql_backup_$dt.sql

二、三份脚本的共同模式

2.1 共同的技术路线

  • 先通过 kubectl get pod -A 动态发现目标 Pod。
  • 按日期创建备份目录。
  • 在容器内部执行原生备份命令。
  • 通过 kubectl cp 或重定向把结果保存到宿主机。
  • 追加日志并清理历史备份。

2.2 共同适合补充的能力

  • 错误重试。
  • 备份文件压缩。
  • 备份结果通知。
  • 恢复演练说明。

三、完整脚本

以下为本文对应的完整脚本,便于直接复制复用。

3.1 gitlab_backup.sh

#!/bin/bash
set -u
set -e

kk=`sudo kubectl get pod -A | grep gitlab | head -n 1 | awk '{print $1,$2}'`
dt=`date +'%Y%m%d_%H%M'`
backup_dir=/apps/scripts/gitlab_backup/$dt
if [ ! -d $backup_dir ]
then
    mkdir -p $backup_dir
fi
kubectl exec -it -n $kk -- gitlab-ctl stop puma
kubectl exec -it -n $kk -- gitlab-ctl stop sidekiq
kubectl exec -it -n $kk -- gitlab-rake gitlab:backup:create
kubectl cp -n $kk:/etc/gitlab $backup_dir
kubectl cp -n $kk:/var/opt/gitlab/backups/ $backup_dir
sudo kubectl exec -it -n $kk -- sh -c "rm -f /var/opt/gitlab/backups/*.tar"
kubectl exec -it -n $kk -- gitlab-ctl start puma
kubectl exec -it -n $kk -- gitlab-ctl start sidekiq

3.2 mysql_backup.sh

#!/bin/bash
set -u
set -e

kk=`sudo kubectl get pod -A|grep mysql-master| awk '{print $1,$2}'`
dt=`date +'%Y%m%d_%H%M'`
mysql_user="root"
mysql_password="59mkkVCrMj7T0lnS"
mysql_host="127.0.0.1"
mysql_port="3306"
backup_dir=/apps/scripts/mysql_backup/$dt
if [ ! -d $backup_dir ]
then
    mkdir -p $backup_dir
fi
sudo kubectl exec -it -n $kk mysqldump -- mysql -e "show databases;" -u$mysql_user -p$mysql_password| grep -Ev "Database|information_schema|performance_schema|mysql|sys|----" | awk '{print $2}'|xargs sudo kubectl exec -it -n $kk --  mysqldump -u$mysql_user -p$mysql_password --set-gtid-purged=OFF --triggers --routines --events --source-data=1 -R -E --single-transaction --databases > $backup_dir/mysql_backup_$dt.sql
if [ $? -eq 0 ];then
  echo "备份成功" >> $backup_dir/mysql_bak.log
else
  echo "备份失败" >> $backup_dir/mysql_bak.log
fi
echo "Backup Succeed Date:" $(date +"%Y-%m-%d %H:%M:%S") >> $backup_dir/mysql_bak.log
find $backup_dir -mtime +7 -type f -name '*.sql' -exec rm -rf {} \;

3.3 pg_backup.sh

#!/bin/bash
set -u
set -e

kk=`sudo kubectl get pod -A | grep postgres | awk '{print $1,$2}'`
ll=`sudo kubectl get pod -A | grep postgres | awk '{print $1,$2}' |  sed 's/ /\//g'`
dt=`date +'%Y%m%d'`
pgsql_user="postgres"
pgsql_host="127.0.0.1"
pgsql_port="5432"
backup_dir=/apps/scripts/pg_backup/$dt
if [ ! -d $backup_dir ]
then
    mkdir -p $backup_dir
fi
sudo kubectl exec -it -n $kk -- su - postgres -c "/usr/bin/pg_dumpall -h 127.0.0.1 -p 5432 > /tmp/all_databases-$dt.sql"
sudo kubectl cp  $ll:/tmp/all_databases-$dt.sql  $backup_dir/pgsql_backup_$dt.sql
sudo kubectl exec -it -n $kk -- rm -f /tmp/all_databases-$dt.sql 
if [ $? -eq 0 ];then
    echo "pg备份成功" >> $backup_dir/pgsql_bak.log
  else
    echo "pg备份失败" >> $backup_dir/pgsql_bak.log
fi
echo "Backup Succeed Date:" $(date +"%Y-%m-%d %H:%M:%S") >> $backup_dir/pgsql_bak.log
find $backup_dir -mtime +7 -type f -name '*.sql' -exec rm -rf {} \;