【问题标题】:Kubernetes: How to delete PODs based on age/creation timeKubernetes:如何根据年龄/创建时间删除 POD
【发布时间】:2018-08-02 17:18:32
【问题描述】:

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

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

【问题讨论】:

    标签: minikube kubernetes


    【解决方案1】:

    此命令将删除所有超过 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
    

    【讨论】:

    • 感谢您的回答!几点观察:首先,这需要 GNU date,因此,如果您在 alpine 容器中运行它,除非您安装该版本的 date,否则它将失败。我的 kubectl 版本输出的是 +00:00 而不是 +0000。此外,似乎不需要纳秒。
    • 上述命令需要 GNU 版本的 xargs 和 date,可以在 macOS 上从 HomeBrew 分别安装为 gxargs 和 gdate。 brew install findutils coreutils
    • 感谢这个 sn-p!超级有帮助:)
    • 谁能解释这个比较是如何工作的/有效的$2 &lt;= "'$(date -d 'yesterday' -Ins --utc
    • @MichaelButler 请参阅 SQLesion 下面的the answer。最主要的是在macOS上使用gdate,这是date的GNU版本。
    【解决方案2】:

    我们可以用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 表示所有列

    【讨论】:

    • 对于 kubectl 1.18.15 上的我来说,要使用的正确列是 $4 而不是 $5。答案的精神是正确的,但我很犹豫是否要编辑它,以防是我的错,而不是答案的
    • 知道如何在 powershell 中执行此操作吗?
    • 我相信这对大多数人来说都很简单,但是如果你使用它们,不要忘记在“delete”和“get”语句中使用命名空间。
    【解决方案3】:

    您可以添加 liveness probe 来跟踪 pod 的存活时间,并在它超过特定时间时将其杀死。或者您可以安排CronJob

    【讨论】:

    • 对于liveness probe,可以在args中添加/bin/sh -c "touch /tmp/healthy; sleep [time you want the container to alive]; rm -rf /tmp/healthy; sleep 600"。时间到了我会杀死旧容器并重新启动一个新容器。
    • 嗨 Cindy,首先感谢您的回答,您的建议有效,但看起来 kubectl 重新启动了容器而不是删除 POD。
    • 我发现在 this one 这样的 cron 作业中实际从 dansl1982's answer 运行脚本很容易
    【解决方案4】:

    修改为在 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
    

    【讨论】:

      【解决方案5】:

      这是使用kubectljqxargs 的替代答案。

      它适用于我在 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 ;
      

      【讨论】:

        猜你喜欢
        • 2017-04-02
        • 2019-12-09
        • 2020-10-23
        • 2019-01-31
        • 1970-01-01
        • 2017-12-31
        • 2013-10-27
        • 1970-01-01
        • 2020-09-23
        相关资源
        最近更新 更多