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

u5rb5r59  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(2)|浏览(132)

我试图从所有命名空间中删除超过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}')"

有什么想法吗?

cwtwac6a

cwtwac6a1#

这假设date的GNU coreutils版本和一个类似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是否被逐出或由于其他原因失败(--field-selector不支持status.reason字段),以及它是否超过一个月。如果它符合该条件,则将其删除。
(It可能可以优化它,以收集命名空间中所有pod的列表,并一次性使用xargs将其传递给最小数量的kubectl)(两种检查可以合并,或者在shell中,或者在AWK中)(用一个精心设计的AWK脚本替换整个while可能会产生最佳性能(收集每个名称空间要删除的pos列表,并运行/从END模式输出删除命令)

xjreopfe

xjreopfe2#

我认为这是由于当你列出了你列出所有的吊舱和删除所有这些吊舱
但命令
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}')

也许你可以试着用更好的方法简化它。

相关问题