k8s集群启停etcd脚本(适用于ubuntu系统)

一半是AI写的,一半是自己改的,虚拟机反复开关机,不停止etcd的话容易有脏数据,每次关机前手动停止嫌麻烦,写个脚本省事一些。

启动etcd

root@k8s-master:~# cat post-startup.sh 
#!/bin/sh
set -e

ETCD_YAML="/etc/kubernetes/manifests/etcd.yaml"
# 恢复时从持久化目录 /etcdbackup/ 查找最新的备份文件
BACKUP_DIR="/etcdbackup"

# 1. 查找最新的备份文件
# 使用 'ls -t' 按时间排序,'head -n1' 获取最新的一个
BACKUP=$(ls -t "${BACKUP_DIR}/etcd.yaml."*.off 2>/dev/null | head -n1)

# 如果没有找到备份文件,说明上次关机没有执行脚本,或者已经恢复过了
[ -z "$BACKUP" ] && exit 0

echo "找到最新的 etcd 备份文件: $BACKUP"

# 2. 等待容器运行时 (Docker/Containerd) 启动
echo "等待容器运行时启动..."
while ! (systemctl is-active docker || systemctl is-active containerd); do
    sleep 2;
done
echo "容器运行时已启动。"

# 3. 恢复 etcd 静态 Pod 文件
mv "$BACKUP" "$ETCD_YAML"
echo "已将 etcd manifest 恢复到 $ETCD_YAML"

# 4. 等待控制平面 (API Server) 就绪
total=60; step=0; bar=40
echo "等待控制平面 (API Server) 就绪..."
while [ $step -lt $total ]; do
    # API Server 在 6443 上运行,这是检查它是否启动的可靠方法
    if curl -kfs https://localhost:6443/healthz >/dev/null; then break; fi
    
    pct=$((step*100/total))
    fill=$((step*bar/total))
    printf "\r[%-${bar}s] %3d%%" "$(printf '#%.0s' $(seq 1 $fill))" "$pct"
    step=$((step+1)); sleep 1
done

if [ $step -ge $total ]; then
    echo -e "\n警告: API Server 在 60 秒内未就绪。可能存在其他问题。"
fi

printf "\r[%s] 100%%  控制面已就绪\n" "$(printf '#%.0s' $(seq 1 $bar))"

关闭etcd脚本

root@k8s-master:~# cat pre-shutdown.sh 
#!/bin/sh
set -e

# --- 关键配置 ---
ETCD_YAML="/etc/kubernetes/manifests/etcd.yaml"
# 将备份目录改为持久化的 /etcdbackup/
BACKUP_DIR="/etcdbackup"
# 备份文件名格式: etcd.yaml.YYYY-MM-DD-HHMM.off
BACKUP_FILE="${BACKUP_DIR}/etcd.yaml.$(date +%F-%H%M).off"

# 1. 创建备份目录(如果不存在)
mkdir -p "$BACKUP_DIR"

# 2. 停止 etcd:将 etcd 的静态 Pod 文件移动到备份目录并重命名为 .off
if [ -f "$ETCD_YAML" ]; then
    # 移动文件并重命名,确保文件在持久化路径
    mv "$ETCD_YAML" "$BACKUP_FILE"
    echo "etcd static Pod manifest moved to $BACKUP_FILE"
fi

# 3. 等待 etcd 容器终止
total=30; step=0; bar=30
echo "等待 etcd 容器终止..."
while [ $step -lt $total ]; do
    # 检查 kubelet 是否已停止(如果系统关机较快,可能 crictl 无法调用)
    if ! systemctl is-active kubelet >/dev/null; then 
        echo -e "\nkubelet 服务可能已停止。跳过容器检查。"
        break
    fi
    
    # 检查 etcd 容器是否还在运行
    if ! crictl ps -name etcd -q | grep -q .; then break; fi

    pct=$((step*100/total))
    fill=$((step*bar/total))
    printf "\r[%-${bar}s] %3d%%" "$(printf '#%.0s' $(seq 1 $fill))" "$pct"
    step=$((step+1)); sleep 1
done
printf "\r[%s] 100%%  etcd 已停止\n" "$(printf '#%.0s' $(seq 1 $bar))"
posted @ 2025-11-17 23:31  程少亭  阅读(31)  评论(0)    收藏  举报