etcd备份脚本
K8S的数据信息存储到etcd键值对数据库中,当创建了非常多的应用的时候,k8s数据安全性变得尤为重要。这里我采取的是每日对etcd进行快照备份
#!/bin/bashsource /etc/profile
export ETCDCTL_API=3
export ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt
export ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crt
export ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.key
export ETCDCTL_ENDPOINTS="https://192.168.12.210:2379"# 备份保存目录
BACKUP_DIR="/backup/k8s-etcd"# 日志文件目录
LOG_DIR="/backup/k8s-etcd/log"# 构建备份文件名
BACKUP_FILE="$BACKUP_DIR/$(hostname)-etcd_$(date +%Y%m%d-%H%M%S).db"# 最多保留几天的备份
DAYS_TO_KEEP=7# 生成日志文件名
LOG_FILE="$LOG_DIR/k8s-etcd-backup-$(date +%Y%m%d-%H%M%S).log"# 远端备份服务器地址
REMOTE_HOST="1.1.1.1"
REMOTE_DIR="/backup/lvwo-dev-k8s_etcd"
REMOTE_PATH="$REMOTE_HOST:$REMOTE_DIR"# 创建必要的目录(判断是否存在)
check_dirs() {if [ ! -d "$BACKUP_DIR" ]; thenmkdir -p "$BACKUP_DIR"fiif [ ! -d "$LOG_DIR" ]; thenmkdir -p "$LOG_DIR"fi
}# 记录日志函数
log() {local timestamp=$(date +"%Y-%m-%d %H:%M:%S")echo "[$timestamp] $1" >> "$LOG_FILE"
}# 备份函数
etcd_data_backup() {log "开始 etcd 备份..."etcdctl snapshot save "$BACKUP_FILE" >> "$LOG_FILE" 2>&1if [ $? -eq 0 ]; thenlog "etcd 快照已保存至: $BACKUP_FILE"elselog "etcd 快照失败"exit 1fi
}# 把备份好的数据放到其他服务器
save_data_to_remote() {log "准备把备份数据存入其他服务器..."scp "$BACKUP_FILE" "root@$REMOTE_PATH" >> "$LOG_FILE" 2>&1if [ $? -eq 0 ]; thenlog "$BACKUP_FILE 成功存入其他服务器"elselog "$BACKUP_FILE 存入其他服务器失败"exit 1fi
}# 删除旧备份
cleanup() {log "正在清理 $DAYS_TO_KEEP 天前的旧备份..."# 本地清理find "$BACKUP_DIR" -type f -mtime +$DAYS_TO_KEEP -delete >> "$LOG_FILE" 2>&1# 远程清理ssh "$REMOTE_HOST" "find $REMOTE_DIR -type f -mtime +$DAYS_TO_KEEP -delete" >> "$LOG_FILE" 2>&1log "旧备份清理完成"
}# 主流程
check_dirs
etcd_data_backup
save_data_to_remote
cleanup
log "etcd 备份任务完成"
备份效果
当前数据目录情况:
其他服务器的备份情况: