我尝试从所有命名空间中删除超过 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}')"
有什么想法吗?
这假设使用 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
模式运行/输出删除命令)
我认为这是因为当您列出 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}')
也许你可以尝试类似的方法或更好地简化它。