如何删除超过一个月的被驱逐 Pod

问题描述 投票:0回答:2

我尝试从所有命名空间中删除超过 30 天的 Kubernetes 驱逐 Pod,但该命令抛出错误:

Error from server(NotFound): pods (xxxxxxxxxxxxx) not found

命令:

kubectl delete pod $(kubectl get pods --all-namespaces  | grep Evicted | sed 's#d$##' | awk '$6 > 30 {print $2}')"

有什么想法吗?

kubernetes kubectl kubernetes-pod
2个回答
2
投票

这假设使用 GNU coreutils 版本的

date
和类似 bourne 的 shell:

单行:

onemonthago=$(date -u -d '-1 month' +"%FT%TZ"); kubectl get pod --field-selector='status.phase=Failed' -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,STATUS:.status.reason,STARTTIME:.status.startTime -A | while read ns pod status starttime; do if [ "$status" = "Evicted" ]; then if [ "$starttime" \< "$onemonthago" ]; then kubectl -n $ns delete pod $pod --wait=false; fi; fi; done

更易读的格式:

onemonthago=$(date -u -d '-1 month' +"%FT%TZ"); 
kubectl get pod --field-selector='status.phase=Failed' -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,STATUS:.status.reason,STARTTIME:.status.startTime -A | while read ns pod status starttime; do 
    if [ "$status" = "Evicted" ]; then 
        if [ "$starttime" \< "$onemonthago" ]; then 
            kubectl -n $ns delete pod $pod --wait=false; 
        fi; 
    fi; 
done

详情:

onemonthago=$(date -u -d '-1 month' +"%FT%TZ");
以与 kubectl 返回的格式相同的格式获取截止时间并将其存储在 shell 变量中。

kubectl 然后获取所有失败的 Pod 并输出我们需要执行进一步步骤的列。

然后它通过管道传输到 while 循环,将字段读入 shell 变量中。

if
语句然后检查 Pod 是否被逐出或因其他原因而失败(
status.reason
字段不支持
--field-selector
)以及它是否已存在超过一个月。如果符合该条件,则会将其删除。

(有可能对其进行优化,以收集命名空间中所有 pod 的列表,并使用 xargs 将其一次性传递给最少数量的 kubectl)(这两种检查可以在 shell 中或在 AWK 中组合使用)(用精心设计的 AWK 脚本替换整个 while 可能会产生最佳性能(收集每个命名空间要删除的 pos 列表,并从

END
模式运行/输出删除命令)


0
投票

我认为这是因为当您列出 pod 时,您列出了所有 pod 并删除了所有这些

但是命令

kubectl delete pod
未获取从中删除特定 Pod 的命名空间

kubectl delete pod $(kubectl get pods --all-namespaces  | grep Evicted | awk '$6 > 30 {print $2}') -n $(kubectl get pods --all-namespaces  | grep Evicted | awk '$6 > 30 {print $1}')

也许你可以尝试类似的方法或更好地简化它。

© www.soinside.com 2019 - 2024. All rights reserved.