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_CACERTETCDCTL_CERTETCDCTL_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==================================== 操作执行完毕 ===================================="

 

posted @ 2026-03-30 17:47  一窗明月半帘风  阅读(6)  评论(0)    收藏  举报