如何确保Kubernetes Deployment的Pod全部缩容至零及脚本检查方法
在Shell脚本中验证Kubernetes Deployment缩容至0副本的方法
以下是两种可靠的实现方案,均包含超时逻辑避免脚本无限挂起:
方案1:直接检查Deployment的可用副本数
通过提取Deployment状态字段来判断缩容是否完成,比解析文本输出更稳定:
# 配置参数 DEPLOYMENT_NAME="openet-k6" NAMESPACE="default" # 非默认命名空间时修改此处 TIMEOUT=300 # 超时时间(秒) INTERVAL=5 # 检查间隔(秒) START_TIME=$(date +%s) while true; do # 获取可用副本数,处理字段为空或命令执行失败的情况 AVAILABLE_REPLICAS=$(kubectl get deployment $DEPLOYMENT_NAME -n $NAMESPACE -o jsonpath='{.status.availableReplicas}' 2>/dev/null || echo 0) AVAILABLE_REPLICAS=${AVAILABLE_REPLICAS:-0} if [ "$AVAILABLE_REPLICAS" -eq 0 ]; then echo "Deployment $DEPLOYMENT_NAME 已成功缩容至0副本" exit 0 fi # 检查超时 CURRENT_TIME=$(date +%s) ELAPSED_TIME=$((CURRENT_TIME - START_TIME)) if [ "$ELAPSED_TIME" -ge "$TIMEOUT" ]; then echo "超时:Deployment $DEPLOYMENT_NAME 未能在$TIMEOUT秒内完成缩容" exit 1 fi echo "等待缩容中,当前可用副本数:$AVAILABLE_REPLICAS,已等待$ELAPSED_TIME秒..." sleep $INTERVAL done
方案2:检查对应标签的Pod数量
直接统计属于该Deployment的活跃Pod数量,适合需要确认Pod完全终止的场景:
# 配置参数 DEPLOYMENT_NAME="openet-k6" NAMESPACE="default" TIMEOUT=300 INTERVAL=5 # 获取Deployment的标签选择器 SELECTOR=$(kubectl get deployment $DEPLOYMENT_NAME -n $NAMESPACE -o jsonpath='{.spec.selector.matchLabels}' | tr '=' ',' | tr ' ' ',') START_TIME=$(date +%s) while true; do # 统计匹配标签的活跃Pod数量 POD_COUNT=$(kubectl get pods -n $NAMESPACE -l $SELECTOR --no-headers 2>/dev/null | wc -l) if [ "$POD_COUNT" -eq 0 ]; then echo "Deployment $DEPLOYMENT_NAME 对应的Pod已全部终止,缩容完成" exit 0 fi # 检查超时 CURRENT_TIME=$(date +%s) ELAPSED_TIME=$((CURRENT_TIME - START_TIME)) if [ "$ELAPSED_TIME" -ge "$TIMEOUT" ]; then echo "超时:未能在$TIMEOUT秒内终止所有Pod,当前剩余Pod数:$POD_COUNT" exit 1 fi echo "等待Pod终止中,当前剩余Pod数:$POD_COUNT,已等待$ELAPSED_TIME秒..." sleep $INTERVAL done
注意事项
- 若Deployment不在默认命名空间,必须正确设置
NAMESPACE参数 - 可根据集群性能调整
INTERVAL和TIMEOUT的值 - 如需更严谨的验证,可同时检查
readyReplicas字段是否为0
内容的提问来源于stack exchange,提问作者Starbucks Admin
相关产品推荐
相关产品推荐

