k8s deployment或statefulset分组关停

#!/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)) ;;

  1. show_status ;;

  2. echo "退出程序"; exit 0 ;;

*) echo "无效选项,请重新输入" ;;

esac

done

相关推荐
非凡ghost5 小时前
视频剪辑不用等渲染,这款开源工具让切分合并秒级完成
运维·电脑·软件需求
FII工业富联科技服务7 小时前
Omniverse 数字孪生与柔性自动化,如何破解产能与交付、设备与空间的双重困境?
运维·自动化·devops
润滑卫士7 小时前
油液介电常数在线监测:测量原理与油液老化状态评估方法
运维
Rock Chin6978 小时前
把 n8n 接进 Slack:在对话里 @机器人 触发自动化工作流
运维·机器人·自动化
浩浩测试一下8 小时前
Linux 底层知识点 1
linux·运维·服务器
Eloudy8 小时前
全文 - IMEX 第01节 -IMEX overview
运维·服务器·网络
物联网软硬件开发-轨物科技9 小时前
【技术白皮书】光伏清检一体化机器人系统解决方案技术白皮书
大数据·运维·网络·人工智能·机器人
海宇数据9 小时前
零信任架构实战:基于海宇网上踪迹欺诈行为识别构建自动化信贷资信评估网关
运维·人工智能·架构·自动化
忆挽篱笙歌10 小时前
环境变量,本地变量
linux·运维·服务器
码间留白11 小时前
手把手把 GitHub 推上阿里云 ECS:Actions CI/CD 全链路避坑实录(折腾好几天,到 2 分钟见绿)
运维·阿里云·ci/cd·docker·devops·github actions