【发布时间】:2018-08-02 17:18:32
【问题描述】:
是否可以根据创建时间或年龄删除 kubernetes 中的 POD?
示例:我想删除所有超过 1 天的 POD。这些 POD 是孤立的,因此不会创建新的 POD。
【问题讨论】:
标签: minikube kubernetes
是否可以根据创建时间或年龄删除 kubernetes 中的 POD?
示例:我想删除所有超过 1 天的 POD。这些 POD 是孤立的,因此不会创建新的 POD。
【问题讨论】:
标签: minikube kubernetes
此命令将删除所有超过 1 天的 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
此命令将删除所有超过 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
【讨论】:
date,因此,如果您在 alpine 容器中运行它,除非您安装该版本的 date,否则它将失败。我的 kubectl 版本输出的是 +00:00 而不是 +0000。此外,似乎不需要纳秒。
brew install findutils coreutils
$2 <= "'$(date -d 'yesterday' -Ins --utc ?
gdate,这是date的GNU版本。
我们可以用awk 直接在AGE($5,第 5 列)列上执行正则表达式 [0-9]+d,然后打印相应的 NAME($1,第一列)列
kubectl delete pod $(kubectl get pod | awk 'match($5,/[0-9]+d/) {print $1}')
先测试看看有什么匹配的:
kubectl get pod | awk 'match($5,/[0-9]+d/) {print $0}'
$0 表示所有列
【讨论】:
$4 而不是 $5。答案的精神是正确的,但我很犹豫是否要编辑它,以防是我的错,而不是答案的
您可以添加 liveness probe 来跟踪 pod 的存活时间,并在它超过特定时间时将其杀死。或者您可以安排CronJob
【讨论】:
/bin/sh -c "touch /tmp/healthy; sleep [time you want the container to alive]; rm -rf /tmp/healthy; sleep 600"。时间到了我会杀死旧容器并重新启动一个新容器。
修改为在 mac 上工作:
# try the gnu versions: gxargs
brew install findutils coreutils
kubectl get pods -o go-template -n gui2 --template '{{range .items}}{{.metadata.name}} {{.metadata.creationTimestamp}}{{"\n"}}{{end}}' | awk '$2 <= "'$(gdate -d '21 days ago' -Ins --utc | sed 's/+0000/Z/')'" { print $1 }' | gxargs --no-run-if-empty kubectl delete pod
【讨论】:
这是使用kubectl、jq 和xargs 的替代答案。
它适用于我在 Mac 上的本地,但我也在运行 debian-slim 的 Kubernetes cronjob 中使用它,所以我认为它适用于 Mac 和 Linux。
时间以秒为单位设置(此处为 86400 秒为 1 天)。
kubectl get pod -o json | jq -r --argjson timestamp 86400 '.items[] | select (.metadata.creationTimestamp | sub("\\..*";"Z") | sub("\\s";"T") | fromdate < now - $timestamp).metadata.name' | xargs -r -L1 kubectl delete pod ;
【讨论】: