一、三份脚本的职责拆分¶
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 {} \;