我试图删除一个有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
在做强制删除之前,我会先做一些检查。
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容器)。
我在Kubernetes生产集群中遇到了同样的问题。
一个吊舱被困在终止阶段一段时间:
pod-issuing mypod-issuing-0 1/1 Terminating 0 27h
我尝试使用命令检查日志和事件:
kubectl describe pod mypod-issuing-0 --namespace pod-issuing
kubectl logs mypod-issuing-0 --namespace pod-issuing
但没有人可以看到
我是如何解决的:
我运行下面的命令来强制删除pod:
kubectl delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE>
这将立即删除pod并开始创建一个新的pod。然而,当创建另一个pod时,我遇到了下面的错误:
无法挂载或挂载卷:unmounted volumes=[data], unattach volumes=[data mypod- issue -token-5swgg aws-iam-token]:超时等待条件
我不得不等待7到10分钟,使卷从我删除的上一个pod中分离出来,以便它可以用于我正在创建的新pod。
Go模板可以在没有awk的情况下工作,对我来说,它可以在没有-grace-period=0 -force的情况下工作,但是,如果你喜欢的话,可以添加它
这将输出删除终止pods的命令。
kubectl get pods --all-namespaces -otemplate='{{ range .items }}{{ if eq .status.reason "Terminated" }}{{printf "kubectl delete pod -n %v %v\n" .metadata.namespace .metadata.name}}{{end}}{{end}}'
如果您对输出感到满意,可以添加| sh -来执行它。
遵循:
kubectl get pods --all-namespaces -otemplate='{{ range .items }}{{ if eq .status.reason "Terminated" }}{{printf "kubectl delete pod -n %v %v\n" .metadata.namespace .metadata.name}}{{end}}{{end}}' |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初始化。