如何获取命名空间中已存在至少1天的故障Pod
获取命名空间中存在超1天的故障Pod并关联Deployment缩容
一、筛选符合条件的故障Pod
要同时满足「存在至少1天」和「至少一个容器处于Waiting状态」两个条件,可结合kubectl和jq工具实现精准筛选,命令如下:
kubectl get pods -n <你的命名空间> -o json | jq -r '.items[] | select(.status.containerStatuses[]? | .state.waiting != null) | select(.metadata.creationTimestamp | fromdateiso8601 < (now - 86400)) | .metadata.name'
命令说明:
.items[]:遍历所有Pod资源条目select(.status.containerStatuses[]? | .state.waiting != null):筛选出至少包含一个Waiting状态容器的Pod,[]?避免因Pod无容器状态数据导致的报错select(.metadata.creationTimestamp | fromdateiso8601 < (now - 86400)):筛选创建时间超过1天的Pod(86400秒为1天,可按需调整数值).metadata.name:输出符合条件的Pod名称
二、关联对应的Deployment并缩容
如果需要直接获取这些Pod所属的Deployment并批量缩容,可扩展命令提取Deployment名称,再编写脚本批量操作:
完整Bash脚本示例
#!/bin/bash # 替换为目标命名空间 TARGET_NAMESPACE="default" # 缩容后的副本数,按需调整 TARGET_REPLICAS=0 # 获取符合条件的唯一Deployment列表 TARGET_DEPLOYS=$(kubectl get pods -n $TARGET_NAMESPACE -o json | jq -r '.items[] | select(.status.containerStatuses[]? | .state.waiting != null) | select(.metadata.creationTimestamp | fromdateiso8601 < (now - 86400)) | .metadata.ownerReferences[]? | select(.kind == "Deployment") | .name' | sort | uniq) # 遍历执行缩容操作 for deploy in $TARGET_DEPLOYS; do echo "开始缩容Deployment: $deploy (命名空间: $TARGET_NAMESPACE) 至 $TARGET_REPLICAS 副本" kubectl scale deployment $deploy -n $TARGET_NAMESPACE --replicas=$TARGET_REPLICAS done
注意事项
- 确保集群节点或执行脚本的机器已安装
jq工具(可通过apt install jq或yum install jq安装) - 若需调整时间阈值,修改
now - 86400中的数值即可(如now - 172800代表2天) - 缩容前可先注释
kubectl scale命令,仅通过echo输出待操作的Deployment,确认无误后再执行实际缩容 - 若需处理StatefulSet等其他控制器,只需修改
select(.kind == "Deployment")中的kind值即可
内容的提问来源于stack exchange,提问作者wwillfred
相关产品推荐
相关产品推荐

