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 "备份完成"