Kubernetes:如何根据年龄/创作时间删除POD

dan*_*982 4 kubernetes minikube

是否可以根据创建时间或年龄删除kubernetes中的POD?

示例:我想删除所有早于1天的POD。这些POD是孤立的,因此不会创建新的POD。

dan*_*982 12

此命令将删除所有早于一天的POD:

kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}} {{.metadata.creationTimestamp}}{{"\n"}}{{end}}' | awk '$2 <= "'$(date -d 'yesterday' -Ins --utc | sed 's/+0000/Z/')'" { print $1 }' | xargs --no-run-if-empty kubectl delete pod
Run Code Online (Sandbox Code Playgroud)

此命令将删除所有早于4小时的POD:

kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}} {{.metadata.creationTimestamp}}{{"\n"}}{{end}}' | awk '$2 <= "'$(date -d'now-4 hours' -Ins --utc | sed 's/+0000/Z/')'" { print $1 }' | xargs --no-run-if-empty kubectl delete pod
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答!一些观察:首先,这需要 GNU `date`,因此,例如,如果您在 alpine 容器中运行它,除非您安装该版本的 `date`,否则它将失败。我的 kubectl 版本输出的是 `+00:00` 而不是 `+0000`。此外,纳秒似乎没有必要。 (3认同)
  • 上述命令需要 GNU 版本的 xargs 和 date,它们可以从 HomeBrew 分别作为 gxargs 和 gdate 安装在 macOS 上。`brew 安装 findutils coreutils` (2认同)
  • @MichaelButler 请参阅下面 SQLesion 的[答案](/sf/answers/4653580781/)。主要是在 macOS 上使用 `gdate`,这是 `date` 的 GNU 版本。 (2认同)

sho*_*ing 6

我们只能awk通过[0-9]+d直接在AGE($ 5,第5列)列上进行正则表达式,然后打印相应的NAME($ 1,第一列)列来实现此目的

kubectl delete pod $(kubectl get pod | awk 'match($5,/[0-9]+d/) {print $1}')
Run Code Online (Sandbox Code Playgroud)

首先测试以查看匹配的内容:

kubectl get pod | awk 'match($5,/[0-9]+d/) {print $0}'
Run Code Online (Sandbox Code Playgroud)

$0 表示所有列


Cin*_*ndy 5

您可以添加一个活性探针来跟踪 pod 的存活时间,并在它超过某个时间段时将其杀死。或者你可以安排一个CronJob

  • 对于活性探测,您可以在参数中添加 `/bin/sh -c "touch /tmp/healthy; sleep [time you want the container to alive]; rm -rf /tmp/healthy; sleep 600"`。时间到了,我会杀死旧容器并重新启动一个新容器。 (2认同)