- Create a new namespace for the backup system - Implement a cron job for scheduled backups - Add a daemon set to handle backup tasks across nodes - Introduce necessary service accounts, roles, and role bindings - Include environment variable handling and configuration via secrets and config maps - Ensure triggering and execution workflow for backups is efficient This commit establishes a new backup system that utilizes both a cron job and a daemon set to automate backups. It organizes the configurations and credentials needed for S3-compatible storage, allowing for seamless backup management across the specified nodes in the Kubernetes cluster.
81 lines
2.8 KiB
YAML
81 lines
2.8 KiB
YAML
apiVersion: v1
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: backup-script
|
|
namespace: backup-system
|
|
data:
|
|
backup.sh: |
|
|
#!/bin/bash
|
|
set -e
|
|
|
|
# 获取环境变量
|
|
MINIO_ENDPOINT="${MINIO_ENDPOINT}"
|
|
MINIO_ACCESS_KEY="${MINIO_ACCESS_KEY}"
|
|
MINIO_SECRET_KEY="${MINIO_SECRET_KEY}"
|
|
MINIO_BUCKET="${MINIO_BUCKET}"
|
|
MINIO_SUBPATH="${MINIO_SUBPATH:-backups}"
|
|
BACKUPS_TO_KEEP="${BACKUPS_TO_KEEP:-7}"
|
|
|
|
# 获取主机名
|
|
HOSTNAME=$(hostname)
|
|
|
|
# 检查 /data/local-csi 路径是否存在
|
|
if [ ! -d "/data/local-csi" ]; then
|
|
echo "目录 /data/local-csi 不存在,退出备份"
|
|
exit 0
|
|
fi
|
|
|
|
# 检查目录下是否有至少一个子目录
|
|
DIR_COUNT=$(find /data/local-csi -mindepth 1 -maxdepth 1 -type d | wc -l)
|
|
if [ "$DIR_COUNT" -eq 0 ]; then
|
|
echo "目录 /data/local-csi 中没有子目录,退出备份"
|
|
exit 0
|
|
fi
|
|
|
|
# 配置 MinIO 客户端
|
|
mc alias set local-minio $MINIO_ENDPOINT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY
|
|
|
|
# 遍历所有目录
|
|
find /data/local-csi -mindepth 1 -maxdepth 1 -type d | while read dir; do
|
|
DIR_NAME=$(basename "$dir")
|
|
TIMESTAMP=$(date +%Y-%m-%d-%H-%M-%S)
|
|
BACKUP_NAME="backup-${DIR_NAME}-${TIMESTAMP}.tar.gz"
|
|
BACKUP_PATH="/tmp/${BACKUP_NAME}"
|
|
|
|
echo "正在备份目录: $dir"
|
|
|
|
# 创建备份压缩包
|
|
tar -czf "$BACKUP_PATH" -C "/data/local-csi" "$DIR_NAME"
|
|
|
|
# 上传到 MinIO
|
|
BACKUP_TARGET_PATH="${MINIO_SUBPATH}/${HOSTNAME}/${DIR_NAME}/"
|
|
echo "上传备份 $BACKUP_PATH 到 MinIO 路径: $BACKUP_TARGET_PATH"
|
|
|
|
# 确保目标目录存在
|
|
mc ls "local-minio/${MINIO_BUCKET}/${BACKUP_TARGET_PATH}" > /dev/null 2>&1 || \
|
|
mc mb -p "local-minio/${MINIO_BUCKET}/${BACKUP_TARGET_PATH}"
|
|
|
|
# 上传备份文件
|
|
mc cp "$BACKUP_PATH" "local-minio/${MINIO_BUCKET}/${BACKUP_TARGET_PATH}${BACKUP_NAME}"
|
|
|
|
# 删除本地临时备份
|
|
rm "$BACKUP_PATH"
|
|
|
|
# 清理旧备份
|
|
echo "清理旧备份,保留最新的 $BACKUPS_TO_KEEP 个文件"
|
|
BACKUP_COUNT=$(mc ls "local-minio/${MINIO_BUCKET}/${BACKUP_TARGET_PATH}" | wc -l)
|
|
if [ "$BACKUP_COUNT" -gt "$BACKUPS_TO_KEEP" ]; then
|
|
# 列出备份并按时间排序,删除最老的备份
|
|
mc ls --json "local-minio/${MINIO_BUCKET}/${BACKUP_TARGET_PATH}" | \
|
|
jq -r '. | select(.type=="file") | [.key, .lastModified] | @tsv' | \
|
|
sort -k2 | head -n $(($BACKUP_COUNT - $BACKUPS_TO_KEEP)) | \
|
|
while read file_info; do
|
|
FILE=$(echo "$file_info" | cut -f1)
|
|
echo "删除旧备份: $FILE"
|
|
mc rm "local-minio/${MINIO_BUCKET}/${BACKUP_TARGET_PATH}${FILE}"
|
|
done
|
|
fi
|
|
done
|
|
|
|
echo "备份完成"
|