在Kubernetes中强制删除逐出/终止的Pod

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

在这个简短的教程中,我们将研究如何删除Kubernetes集群中被驱逐或者终止的Pod。在驱逐和终止状态下找到某些豆荚的原因有很多。为了驱逐,通常是由于工作节点中的资源压力或者应用程序错误。终止可能是由于缩小应用程序规模或者部署了新的应用程序版本而导致旧Pod在此之后终止的结果。

在集群中每个节点中运行的kubelet服务负责Pod逐出。 Pod逐出的顺序为:尽力而为QoS类Burstablepods使用的资源多于其饥饿资源的请求; Burstablepods使用的资源少于其饥饿资源的请求。

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

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

在Kubernetes中强制删除逐出/终止的Pod

我们可以通过多种方式删除这些窗格。

使用kubectl和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

确认在这种状态下是否还有Evicted。

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

从所有命名空间中删除处于ImagePullBackOff状态的所有容器Bonus:

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

从所有命名空间中删除处于ImagePullBackOff或者ErrImagePull状态的所有容器Bonus:

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

然后使用以下命令删除Evicted 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