我试图删除一个有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

当前回答

我的pod卡在“终止”中,即使在我尝试重新启动docker和重新启动服务器之后。在编辑pod并删除'finalizer'下面的项目后解决

$ kubectl -n mynamespace edit pod/my-pod-name

其他回答

对我来说,我不喜欢变通。所以有几个步骤:

k get pod -o wide ->这会显示哪个Node正在运行pod k get nodes ->检查节点状态…我明白了

我修复了这个节点。对于我的情况,它只是重新启动kubelet:

ssh that-node ->运行swapoff -a && systemctl restart kubelet(或systemctl restart k3s,如果k3s |或systemctl restart crio,在其他情况下,如OCP 4。X (k8s <1.23))

现在删除豆荚应该工作而不强迫可怜豆荚。

实用的答案——你可以通过运行:

kubectl delete pod NAME --grace-period=0

历史答案——在1.1版本中有一个问题,有时如果pod的节点被不干净地从集群中移除,则它们会处于终止状态。

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

终止豆荚的通常方法是:

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初始化。

以下命令与awk和xargs可以使用——grace-period=0——force删除所有处于终止状态的pod。

kubectl get pods|grep -i terminating | awk '{print $1}' | xargs kubectl delete --grace-period=0 --force pod

我发现这个命令更直接:

for p in $(kubectl get pods | grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force;done

它将删除默认命名空间中处于终止状态的所有pod。