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

相关推荐
网硕互联的小客服7 分钟前
Linux服务器磁盘应该如何合理分区?
linux·运维·服务器
楚识科技22 分钟前
合同比对全流程自动化:OCR识别+差异比对+法律风险字段抽取实战指南
运维·自动化·ocr
代码方舟35 分钟前
零信任架构实战:基于天远人企关联构建自动化供应链金融网关
运维·人工智能·架构·自动化
贵沫末2 小时前
Ubuntu——常用软件安装
linux·运维·ubuntu
Doraemomo2 小时前
Linux内核驱动开发——中断与定时器
linux·运维·驱动开发
2301_808414382 小时前
Linux中动静态库的理解
linux·运维·服务器
分布式存储与RustFS3 小时前
模型 checkpoint 放对象存储:分片上传、断点续传与残留清理
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
一条破秋裤4 小时前
Linux 线程创建:pthread_create 与基本回收
java·linux·运维
FED_AF6 小时前
Linux运维“邪修”功法之通配符
linux·运维
YOLO数据集集合6 小时前
风机叶片表面损伤检测数据集 | 风机叶片 表面损伤 污渍检测 无人机巡检 风电运维9119期
运维·人工智能·计算机视觉·目标跟踪·无人机·智慧城市·电力巡检