我试图删除一个有12个pod的ReplicationController,我可以看到一些pod卡在终止状态。

我的Kubernetes集群由一个控制平面节点和三个安装在Ubuntu虚拟机上的工作节点组成。

这个问题的原因是什么?

NAME        READY     STATUS        RESTARTS   AGE
pod-186o2   1/1       Terminating   0          2h
pod-4b6qc   1/1       Terminating   0          2h
pod-8xl86   1/1       Terminating   0          1h
pod-d6htc   1/1       Terminating   0          1h
pod-vlzov   1/1       Terminating   0          1h

当前回答

我使用这个命令删除pods

kubectl delete pod --grace-period=0 --force --namespace <NAMESPACE> <PODNAME>

但是当我尝试运行另一个pod时,它没有工作,它被卡在“Pending”状态,它看起来像节点本身被卡住了。

对我来说,解决方案是重新创建节点。我只是去了GKE控制台,从集群中删除了节点,所以GKE开始了另一个。

从那以后,一切又开始正常工作了。

其他回答

我最近在释放集群中的资源时偶然发现了这一点。下面是删除它们的命令。

kubectl get pods --all-namespaces | grep Terminating | while read line; do
  pod_name=$(echo $line | awk '{print $2}' ) \
  name_space=$(echo $line | awk '{print $1}' ); \
  kubectl delete pods $pod_name -n $name_space --grace-period=0 --force
done

希望这能帮助到读到这篇文章的人

你可以使用awk:

kubectl get pods --all-namespaces | awk '{if ($4=="Terminating") print "oc delete pod " $2 " -n " $1 " --force --grace-period=0 ";}' | sh

我将尝试最广泛的答案,因为上面没有一个是错误的,但它们并不适用于所有情况。

终止豆荚的通常方法是:

kubectl delete pod -n ${namespace} ${pod} --grace-period=0 

但您可能需要删除可能会阻止POD停止使用的终结器:

kubectl -n ${namespace} patch pod ${pod} -p '{"metadata":{"finalizers":null}}'

如果这些都不起作用,你可以用etcdctl从etcd中删除pod:

# Define variables
ETCDCTL_API=3
certs-path=${HOME}/.certs/e
etcd-cert-path=${certs-path}/etcd.crt
etcd-key-path=${certs-path}/etcd.key
etcd-cacert-path=${certs-path}/etcd.ca
etcd-endpoints=https://127.0.0.1:2379
namespace=myns
pod=mypod

# Call etcdctl to remove the pod
etcdctl del \
--endpoints=${etcd-endpoints}\
--cert ${etcd-cert-path} \
--key ${etcd-client-key}\
--cacert ${etcd-cacert-path} \
--prefix \
/registry/pods/${namespace}/${pod} 

这最后的情况下应该被用作最后的资源,在我的情况下,我结束不得不这样做,因为死锁阻止calico在节点中启动,由于Pods处于终止状态。在calico完成之前,这些pod不会被移除,但它们保留了足够的CPU以避免calico或任何其他pod初始化。

在做强制删除之前,我会先做一些检查。 1- node state:获取节点正在运行的节点名,可以使用以下命令查看:

"kubectl -n YOUR_NAMESPACE describe pod YOUR_PODNAME"

在“Node”标签下,您将看到节点名称。 你可以这样做:

kubectl describe node NODE_NAME

如果您看到任何奇怪的东西,请检查“条件”字段。 如果这是好的,那么你可以移动到步骤,重做:

"kubectl -n YOUR_NAMESPACE describe pod YOUR_PODNAME"

检查它挂起的原因,你可以在“事件”部分找到这个。 我这么说是因为在强制删除pod之前,您可能需要采取初步的操作,强制删除pod只删除pod本身,而不删除底层资源(例如,一个卡住的docker容器)。

从资源(pod,deployment,ds等)中删除终结器块

"finalizers": [
  "foregroundDeletion"
]