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

相关推荐
刚入门的大一新生21 小时前
Linux-进程控制
linux·运维·服务器·c++
上火的金鱼妹21 小时前
K8S基础组件作用和关系整理
linux·运维·服务器·kubernetes
Vcaker21 小时前
Linux学习25-harbor私有仓库部署
linux·运维·学习
醉颜凉21 小时前
网络安全必学:粘性MAC地址(Sticky MAC)原理与应用全解析
运维·服务器·网络·安全·web安全
不懂的浪漫1 天前
ToDesk 连接 Linux 后分辨率过低的解决方法
linux·运维·数据库
姚不倒1 天前
etcd 学习系列(七):排障指南 —— 常见问题与解决方案
运维·etcd
广州灵眸科技有限公司1 天前
从手动三步到上电即连:4G模组systemd开机自连方案
linux·运维·服务器·开发语言·网络·人工智能·php
Lear1 天前
Docker 私有仓库搭建与使用
运维·自动化运维
姚不倒1 天前
etcd 学习系列(一):从业务需求出发,理解 etcd 是什么
运维·数据库·etcd
迪康Defender1 天前
政企内网终端安全建设:资产‑管控‑防护‑审计闭环能力拆解
运维·网络·安全·web安全·终端安全管理