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

相关推荐
张洛闻Eren1 小时前
云原生k8s【第二课】:K8s 部署与架构
云原生·架构·kubernetes
翼龙云_cloud1 小时前
腾讯云国际代理商:CDB数据库自动备份和异地灾备配置 从快照到跨区域恢复
运维·数据库·云计算·腾讯云
日常筹谋记2 小时前
西门子 G120XA 变频器在数据中心冷却水泵系统的应用与数字化运维价值
运维
北城笑笑2 小时前
Server 18 ,Nginx + Vite 前端部署排错实战:从 `/api/gpt/chat` 404 到 9012 后端服务的完整定位过程
linux·运维·前端·nginx·ubuntu·vue
Elastic 中国社区官方博客2 小时前
Elasticsearch:什么是向量数据库?
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎·ai
江湖有缘2 小时前
从零搭建私有云相册:使用 Docker 一键部署 Damselfly全攻略
运维·docker·容器
NJCloud2 小时前
ELK企业级日志分析平台(四)——基于 ELFK + Kafka 的日志采集与传输平台部署实践
linux·运维·分布式·elk·kafka
lisanmengmeng2 小时前
搭建elk环境并接入frostmourne,实现监控报警效果(一)
运维·elk·jenkins
王志来137944730082 小时前
聚焦五大核心场景:工控服务器机箱平台的垂直深耕之路
运维·服务器·python