强制删除kubernetes中的驱逐/终止Pods

时间:2020-02-23 14:30:24  来源:igfitidea点击:

在此简短的教程中,我们将研究如何在Kubernetes集群中删除被驱逐或者终止的POD。
有很多原因,你会发现一些被驱逐和终止状态的Pods。
为了驱逐,通常是工人节点或者应用程序错误的资源压力的结果。
终止可能是缩小应用程序或者部署后终止旧POD的应用程序的新版本。

在群集中的每个节点中运行的kubelet服务负责POD驱逐。
PODS驱逐的顺序是:最佳努力 - QoS类QoSburstable Pods使用更多资源而不是Starved Resource.Burstable Pods的要求,而不是其饥饿资源的要求。

我们可以通过运行以下命令获取终止或者驱逐状态的命名空间中的POD列表:

kubectl get pods -n namespace | egrep -i 'Terminated|Evicted'

强制删除kubernetes中的驱逐/终止Pods

我们可以以各种方式删除这些POD。

使用kbectl和bash本机命令

这些是Bash命令,通过过滤,我们将运行以强制删除位于被驱逐或者终止状态的命名空间中的POD。

# Define namespace
namespace="mynamespace"
# Get all pods in Terminated/Evicted State
epods=$(kubectl get pods -n ${namespace} | egrep -i 'Terminated|Evicted' | awk '{print  }')
# Force deletion of the pods
for i in ${epods[@]}; do
  kubectl delete pod --force=true --wait=false --grace-period=0 $i -n ${namespace}
done

确认是否存在此状态仍然存在POD。

kubectl get pods -n ${namespace} | egrep -i 'Terminated|Evicted'

从所有名称空间中删除所有被驱散和终止的POD:

kubectl get pods --all-namespaces | egrep -i  'Evicted|Terminated' | awk '{print  " --namespace=" }' | xargs kubectl delete pod --force=true --wait=false --grace-period=0

从所有名称空间中删除imagePullbullbuld状态中的所有容器 - 奖金:

kubectl get pods --all-namespaces | grep 'ImagePullBackOff' | awk '{print  " --namespace=" }' | xargs kubectl delete pod

从所有命名空间中删除imagePullbullbull或者errimagepull状态的所有容器 - 奖金:

kubectl get pods --all-namespaces | grep -E 'ImagePullBackOff|ErrImagePull|Evicted' | awk '{print  " --namespace=" }' | xargs kubectl delete pod

使用kubectl过滤器和jq

我们还可以将kubectl命令输出和管道过滤到JQ以获取特定列。

首次安装JQ命令:

--- Ubuntu/Debian --
$sudo apt update && sudo apt install jq
--- CentOS/Fedora --
$sudo yum -y install epel-release
$sudo yum -y install jq
--- RHEL --
wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 -O jq
chmod +x jq
sudo mv jq /usr/local/bin

然后用命令删除驱逐的Pods:

kubectl get pods --all-namespaces -o json | jq '.items[] | select(.status.reason!=null) | select(.status.reason | contains("Evicted")) | "kubectl delete pods \(.metadata.name) -n \(.metadata.namespace)"' | xargs -n 1 bash -c