etcd脚本
1. 常用
- 手动执行一次备份:
./etcd-ops.sh backup - 设置每日01:00定时备份:
./etcd-ops.sh crontab - 检查etcd集群健康:
./etcd-ops.sh health - 查询常用数据(命名空间、Pod等):
./etcd-ops.sh query - 清理7天前备份文件:
./etcd-ops.sh clean
2. 注意事项
- 脚本默认使用 kubeadm 证书路径,若为二进制部署,需修改脚本中
ETCDCTL_CACERT、ETCDCTL_CERT、ETCDCTL_KEY路径。 - 备份目录默认
/data/etcd/backup,可修改脚本中BACKUP_DIR变量自定义路径。 - 定时备份时间默认每日01:00,可修改
CRON_TIME变量(如"30 2 * * *"表示每日2:30备份)。 - 脚本执行无需停止业务Pod,备份为热备份,健康检查、数据查询不影响集群运行。
- 若执行报错,先检查环境变量配置,可手动执行
etcdctl endpoint health验证etcd连接是否正常。
3. 备份文件说明
备份文件命名格式:
snapshot-年月日-时分秒.db(如 snapshot-20260330-153000.db),存储在 BACKUP_DIR 目录下,可用于后续etcd恢复。#!/bin/bash ######################################################################### # 脚本名称:etcd-ops.sh # 功能描述:etcd 备份(手动+定时)、健康检查、常用数据查询 # 适配环境:kubeadm 部署 k8s、etcd v3、TLS 认证、多节点 etcd 集群 # 执行权限:root 用户 # 脚本参数: # backup - 手动执行一次 etcd 快照备份 # crontab - 设置每日定时备份 # health - 检查 etcd 集群健康状态 # query - 查询 etcd 常用数据(命名空间、Pod、集群信息) # clean - 清理 7 天前的备份文件 # 示例: # ./etcd-ops.sh backup # 手动备份 # ./etcd-ops.sh health # 健康检查 ######################################################################### # -------------------------- 基础配置(无需修改,kubeadm 默认路径)-------------------------- 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://127.0.0.1:2379 # 备份目录 BACKUP_DIR=/data/etcd/backup # 备份文件名格式(包含时间戳,避免覆盖) BACKUP_FILE=snapshot-$(date +%Y%m%d-%H%M%S).db # 定时备份时间 CRON_TIME="0 1 * * *" # -------------------------- 函数定义 -------------------------- # 1. 手动备份函数 etcd_backup() { echo "==================================== 开始执行 etcd 手动备份 ====================================" # 创建备份目录(不存在则创建) if [ ! -d "$BACKUP_DIR" ]; then mkdir -p $BACKUP_DIR echo "创建备份目录:$BACKUP_DIR" fi # 执行快照备份 echo "正在备份 etcd 数据,备份文件:$BACKUP_DIR/$BACKUP_FILE" etcdctl snapshot save $BACKUP_DIR/$BACKUP_FILE # 检查备份是否成功 if [ $? -eq 0 ]; then echo "✅ 备份成功!" # 查看备份信息 echo "------------------------------------ 备份文件信息 ------------------------------------" etcdctl snapshot status $BACKUP_DIR/$BACKUP_FILE -w table else echo "❌ 备份失败!请检查 etcd 连接或证书路径。" exit 1 fi } # 2. 定时备份(设置 crontab) etcd_crontab() { echo "==================================== 设置 etcd 定时备份 ====================================" # 拼接 crontab 命令(自动执行备份+清理过期文件) CRON_CMD="$CRON_TIME root /bin/bash $0 backup && /bin/bash $0 clean" # 检查是否已存在定时任务,避免重复添加 if crontab -l | grep -q "$CRON_CMD"; then echo "✅ 已存在定时备份任务,无需重复设置!" crontab -l | grep "$CRON_CMD" else # 添加定时任务 (crontab -l 2>/dev/null; echo "$CRON_CMD") | crontab - echo "✅ 定时备份任务设置成功!" echo "定时任务:$CRON_TIME 执行备份,并清理 7 天前备份文件" crontab -l | grep "$CRON_CMD" fi } # 3. 健康检查(集群状态、节点健康、版本信息) etcd_health() { echo "==================================== 执行 etcd 集群健康检查 ====================================" # 检查 endpoint 健康(集群所有节点) echo "------------------------------------ 集群节点健康状态 ------------------------------------" etcdctl endpoint health --cluster -w table # 查看集群成员信息 echo -e "\n------------------------------------ 集群成员列表 ------------------------------------" etcdctl member list -w table # 查看集群版本及状态 echo -e "\n------------------------------------ 集群版本及详细状态 ------------------------------------" etcdctl endpoint status --cluster -w table # 检查 etcd 连接是否正常 echo -e "\n------------------------------------ 连接测试 ------------------------------------" if etcdctl get / --prefix --keys-only --limit=1 >/dev/null 2>&1; then echo "✅ etcd 连接正常,可正常操作" else echo "❌ etcd 连接失败,请检查证书或 endpoint 配置" exit 1 fi } # 4. 常用数据查询(无需手动输入复杂命令) etcd_query() { echo "==================================== 执行 etcd 数据查询 ====================================" echo "1. 查看所有命名空间" etcdctl get /registry/namespaces/ --prefix --keys-only echo -e "\n2. 查看所有 Pod(默认所有命名空间)" etcdctl get /registry/pods/ --prefix --keys-only echo -e "\n3. 查看集群核心配置(kube-system 命名空间)" etcdctl get /registry/namespaces/kube-system --prefix --keys-only echo -e "\n4. 查看 etcd 集群修订版本" etcdctl endpoint status -w json | jq -r '.[0].revision' } # 5. 清理过期备份(保留最近7天) etcd_clean() { echo "==================================== 清理过期备份文件 ====================================" if [ ! -d "$BACKUP_DIR" ]; then echo "备份目录不存在,无需清理" exit 0 fi # 查找并删除7天前的备份文件 echo "正在清理 $BACKUP_DIR 下 7 天前的备份文件..." find $BACKUP_DIR -name "snapshot-*.db" -mtime +7 -delete if [ $? -eq 0 ]; then echo "✅ 清理完成!当前备份文件:" ls -l $BACKUP_DIR/snapshot-*.db else echo "❌ 清理失败,请检查备份目录权限" exit 1 fi } # -------------------------- 脚本入口(根据参数执行对应函数)-------------------------- if [ $# -eq 0 ]; then echo "❌ 请输入脚本参数!" echo "可用参数:backup(手动备份)、crontab(定时备份)、health(健康检查)、query(数据查询)、clean(清理备份)" echo "示例:./etcd-ops.sh backup" exit 1 fi case $1 in backup) etcd_backup ;; crontab) etcd_crontab ;; health) etcd_health ;; query) etcd_query ;; clean) etcd_clean ;; *) echo "❌ 无效参数!可用参数:backup、crontab、health、query、clean" exit 1 ;; esac echo -e "\n==================================== 操作执行完毕 ===================================="

浙公网安备 33010602011771号