#!/bin/bash
NAMESPACE="as_you_wish"
使用普通数组(索引从0开始)
GROUP_NAMES=("NACOSService" "MIDService" "APPService")
GROUP_SERVICES=(
"nacos"
"mid01 mid02"
"app01 app02 app03"
)
停止状态
STOPPED=("0" "0" "0")
获取某组剩余的 Pod 总数
get_remaining_pods() {
local services=$1
local total=0
for svc in $services; do
local count=(kubectl get pods -n NAMESPACE --no-headers 2>/dev/null | grep "^${svc}" | wc -l)
total=$((total + count))
done
echo $total
}
检查是否有 Pod(只要 Pod 还存在就算)
has_pods() {
local services=$1
local remaining=(get_remaining_pods "services")
$remaining -gt 0 && return 0 || return 1
}
停止资源
stop_resource() {
local name=$1
if kubectl get statefulset name -n NAMESPACE &>/dev/null; then
echo " StatefulSet $name"
kubectl scale statefulset name -n NAMESPACE --replicas=0
elif kubectl get deployment name -n NAMESPACE &>/dev/null; then
echo " Deployment $name"
kubectl scale deployment name -n NAMESPACE --replicas=0
fi
}
停止一组
stop_group() {
local idx=$1
local name={GROUP_NAMES\[idx]}
local services={GROUP_SERVICES\[idx]}
"${STOPPED\[$idx}" = "1" ] && { echo "$name 已经停止过了"; return 0; }
local initial_pods=(get_remaining_pods "services")
if $initial_pods -eq 0 ; then
echo "$name 已经没有 Pod 了"
STOPPED$idx=1
return 0
fi
echo ""
echo "停止 $name (当前 ${initial_pods} 个 Pod) ..."
并行停止所有资源
for svc in $services; do
stop_resource "$svc" &
done
wait
echo -n " 等待 Pod 终止"
等待所有 Pod 完全消失(包括 Terminating 状态)
while has_pods "$services"; do
local remaining=(get_remaining_pods "services")
echo -n " ${remaining}"
sleep 10
done
echo " 0 完成"
echo "$name 已完全停止"
STOPPED$idx=1
}
显示状态
show_status() {
echo ""
echo "========== 当前服务状态 =========="
for i in 0 1 2; do
if "${STOPPED\[$i}" = "1" ]; then
echo " {GROUP_NAMES\[i]}: 已停止"
else
local remaining=(get_remaining_pods "{GROUP_SERVICES$i}")
if $remaining -gt 0 ; then
echo " {GROUP_NAMES\[i]}: 运行中 ($remaining 个 Pod)"
else
echo " {GROUP_NAMES\[i]}: 已停止"
STOPPED$i=1
fi
fi
done
echo "=================================="
}
主菜单
while true; do
echo ""
echo "================================"
echo "1) 停止 ${GROUP_NAMES0}"
echo "2) 停止 ${GROUP_NAMES1}"
echo "3) 停止 ${GROUP_NAMES2}"
echo "4) 查看状态"
echo "5) 退出"
echo "================================"
read -p "请选择 1-5: " opt
case $opt in
1|2|3) stop_group $((opt-1)) ;;
-
show_status ;;
-
echo "退出程序"; exit 0 ;;
*) echo "无效选项,请重新输入" ;;
esac
done