kubernetes 如何在一个至少一天的时间内获得失败的Pod

vsdwdz23  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(2)|浏览(127)

我正试图制作一个Bash脚本,它可以缩减所有失败Pod的部署(即,至少有一个容器处于“等待”状态的Pod),时间超过一天。
似乎没有一个明显的kubectl命令来获取所有失败的Pod。解决方案here是查找失败Pod的部分答案,但它不会找到具有一个失败Container和一个或多个健康Container的Pod。
this question的解决方案确实解决了如何找到超过一天的Pod,但它没有过滤失败的Pod。
我怎样才能在一个存储空间中获得至少一天前的所有失败Pod?

sg24os4d

sg24os4d1#

我们可以使用-o go-template选项来指定我们想要的字段,然后使用awk根据时间戳字段和.state.waiting.reason字段进行过滤:

kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}} {{.metadata.creationTimestamp}} {{range .status.containerStatuses}}{{.state.waiting.reason}} {{end}}{{"\n"}}{{end}}'\
                | awk -vFPAT='([^[:space:]]*)|(<[^<]+>)' \
                '$2 <= "'$(date -d 'yesterday' -Ins --utc| sed 's/+0000/Z/')'" \
                && ($3 != "<no value>" || ($4 != "<no value>" && $4 != "")) {print $1}'

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

twh00eeo

twh00eeo2#

**1.**检查以下返回的pod是否正确:
注意事项

  • 状态.相位值,更多值请参考此处。
  • 在Kubernetes中没有简单的方法,这就是为什么使用awk,匹配后的第一个值($1)意味着一天。

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。

相关问题