You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 15:37:52