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))"

浙公网安备 33010602011771号