我正试图制作一个Bash脚本,它可以缩减所有失败Pod的部署(即,至少有一个容器处于“等待”状态的Pod),时间超过一天。
似乎没有一个明显的kubectl
命令来获取所有失败的Pod。解决方案here是查找失败Pod的部分答案,但它不会找到具有一个失败Container和一个或多个健康Container的Pod。
this question的解决方案确实解决了如何找到超过一天的Pod,但它没有过滤失败的Pod。
我怎样才能在一个存储空间中获得至少一天前的所有失败Pod?
我正试图制作一个Bash脚本,它可以缩减所有失败Pod的部署(即,至少有一个容器处于“等待”状态的Pod),时间超过一天。
似乎没有一个明显的kubectl
命令来获取所有失败的Pod。解决方案here是查找失败Pod的部分答案,但它不会找到具有一个失败Container和一个或多个健康Container的Pod。
this question的解决方案确实解决了如何找到超过一天的Pod,但它没有过滤失败的Pod。
我怎样才能在一个存储空间中获得至少一天前的所有失败Pod?
2条答案
按热度按时间sg24os4d1#
我们可以使用
-o go-template
选项来指定我们想要的字段,然后使用awk
根据时间戳字段和.state.waiting.reason
字段进行过滤:awk -vFPAT='([^[:space:]]*)|(<[^<]+>)'
告诉awk将任何没有空格的字段解释为字段,或任何以<
开始,没有另一个<
,并以>
结束的字段。这允许awk正确解释容器的<no value>
的.state.waiting.reason
。'$2 <= "'$(date -d 'yesterday' -Ins --utc| sed 's/+0000/Z/')'"
是从this中窃取的,并告诉awk过滤超过24小时的creationTimestamps。($3 != "<no value>" || ($4 != "<no value>" && $4 != ""))
告诉awk过滤Pod,其中 * 要么 * 第一个Container的等待状态不是<no value>
*,要么 * 第二个Container的等待状态既不是<no value>
也不是空的。注意这里假设集群中每个Pod最多有两个Container;如果有三个容器Pod,我们可以很容易地添加一个|| ($5 != "<no value>" && $5 != "")
。此命令将捕获给定存储空间中所有超过24小时且至少有一个Container处于CrashLoopBackOff、Init:ContainerStatusUnknown或ImagePullBackOff状态的Pod-即至少有一个Container的状态为
waiting
。twh00eeo2#
**1.**检查以下返回的pod是否正确:
注意事项:
kubectl get pods --field-selector=status.phase=Failed --sort-by=.metadata.creationTimestamp| awk 'match($1,/[6-9]d| [0-9][0-9]d| [0-9][0-9][0-9]d/){打印$0}'
**2.**确认后第一步运行kubectl delete:
kubectl delete pod $(kubectl get pods --field-selector=status.phase=Failed --sort-by=.metadata.creationTimestamp| awk 'match($1,/[6-9]d| [0-9][0-9]d| [0-9][0-9][0-9]d/){print $0 <$')
如果你不在默认的命名空间中(pod所在的地方),只需要在两条语句中传递命名空间标志和name。