如何在900秒内检查K8s命名空间中非Running/Completed状态Pod并修复脚本退出问题
Kubernetes Pod状态检查脚本修复
原脚本的核心问题是循环次数固定(最多11次,仅等待110秒),完全达不到需求中900秒的超时要求,同时退出逻辑依赖循环结束后的状态变量,无法正确处理超时场景。以下是修复后的脚本:
#!/bin/bash # 检查参数是否传入 if [[ -z "$1" ]]; then echo "用法: $0 <命名空间>" exit 1 fi NAMESPACE="$1" STARTTIME=$(date +%s) TIMEOUT=900 status=false while true; do # 用kubectl的jsonpath精准过滤非Running/Completed状态的Pod,排除Evicted状态 NON_NORMAL_PODS=$(kubectl get pods -n "$NAMESPACE" -o jsonpath='{range .items[?(@.status.phase!="Running" && @.status.phase!="Completed" && @.status.phase!="Evicted")]}{.metadata.name}{"\t"}{.status.phase}{"\n"}{end}') if [[ -n "$NON_NORMAL_PODS" ]]; then echo "[$(date +%Y_%m_%d-%H:%M:%S)] 命名空间 $NAMESPACE 中存在异常状态Pod:" echo "$NON_NORMAL_PODS" # 计算已用时间 ELAPSED=$(( $(date +%s) - STARTTIME )) echo "已耗时 $ELAPSED 秒,剩余等待时间 $(( TIMEOUT - ELAPSED )) 秒" # 检查是否超时 if [[ $ELAPSED -ge $TIMEOUT ]]; then echo "[$(date +%Y_%m_%d-%H:%M:%S)] 等待超时!仍有 $(echo "$NON_NORMAL_PODS" | wc -l) 个Pod未进入正常状态" exit 1 fi sleep 10 status=false else echo "[$(date +%Y_%m_%d-%H:%M:%S)] 命名空间 $NAMESPACE 所有Pod状态正常:" kubectl get pods -n "$NAMESPACE" ELAPSED=$(( $(date +%s) - STARTTIME )) echo "任务完成,耗时 $ELAPSED 秒" echo "部署成功" status=true break fi done
主要改动说明
- 超时逻辑修正:将固定次数循环改为基于时间的
while true循环,每次检查已用时间是否超过900秒,确保满足超时需求 - 精准状态过滤:使用kubectl的
jsonpath直接筛选非Running/Completed/Evicted状态的Pod,避免原脚本中grep表头的不可靠问题 - 参数校验:增加命名空间参数的检查,避免无参数运行时出错
- 日志优化:统一时间戳格式,输出剩余等待时间,提升可读性
- 退出逻辑简化:超时后直接在循环内退出,无需依赖外部状态变量判断
内容的提问来源于stack exchange,提问作者bessey
相关产品推荐
相关产品推荐

