吊舱处于终止状态

我试图删除一个有12个豆荚的ReplicationController,我可以看到一些豆荚卡在Terminating状态。

我的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
375796 次浏览

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

kubectl delete pod NAME --grace-period=0

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

可以使用以下命令强制删除POD。

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

强制删除pod:

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

--force标志是强制的。

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

"finalizers": [
"foregroundDeletion"
]

如果--grace-period=0不工作,那么你可以这样做:

kubectl delete pods <pod> --grace-period=0 --force

我最近在删除rook ceph命名空间时偶然发现了这个问题——它卡在了终止状态。

唯一有帮助的是通过使用curl直接调用k8s api来删除kubernetes终结器,正如在这里所建议的那样。

  • kubectl get namespace rook-ceph -o json > tmp.json
  • 删除tmp.json中的kubernetes终结器(留下空数组"finalizers": [])
  • 在另一个终端运行kubectl proxy进行身份验证,然后运行curl请求到返回端口
  • curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json 127.0.0.1:8001/k8s/clusters/c-mzplp/api/v1/namespaces/rook-ceph/finalize
  • 命名空间消失了

详细的rook ceph teardown 在这里

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

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

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

我发现这个命令更直接:

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

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

在我的例子中,--force选项不太管用。我还能看到豆荚!它卡在终止/未知模式。跑步之后

kubectl -n redis delete pods <pod> --grace-period=0 --force

我跑

kubectl -n redis patch pod <pod> -p '{"metadata":{"finalizers":null}}'

最初的问题是“这个问题的原因是什么?”,答案在https://github.com/kubernetes/kubernetes/issues/51835 &https://github.com/kubernetes/kubernetes/issues/65569,看到https://www.bountysource.com/issues/33241128-unable-to-remove-a-stopped-container-device-or-resource-busy

这是由于码头挂载泄漏到其他命名空间造成的。

您可以登录到pod主机进行调查。

minikube ssh
docker container ps | grep <id>
docker container stop <id>

我不建议强制删除pod,除非容器已经退出。

  1. 验证kubelet日志,看看是什么原因导致的问题"journalctl -u kubelet"
  2. 检查docker日志:journalctl -u docker.service
  3. 检查吊舱的卷挂载点是否仍然存在,是否有人持有锁。
  4. 检查主机内存或磁盘是否不足
在做强制删除之前,我会先做一些检查。 1- node state:获取你的节点正在运行的节点名,你可以通过以下命令看到:

"kubectl -n YOUR_NAMESPACE describe pod YOUR_PODNAME"

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

kubectl describe node NODE_NAME

检查“条件”;如果你看到任何奇怪的东西,就去现场。 如果这是好的,那么你可以移动到步骤,redo:

"kubectl -n YOUR_NAMESPACE describe pod YOUR_PODNAME"

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

你可以使用awk:

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

please try below command: Kubectl补丁pod -p '{"metadata":{"finalizer ":null}}'

.

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

  • k get pod -o wide→这将显示哪个Node正在运行pod
  • k get nodes→检查节点状态…我得到它NotReady

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

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

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

发生这种情况的一个原因可能是关闭一个节点(而不耗尽它)。在这种情况下修复是再次打开节点;那么终止应该成功。

强制删除命名空间中的所有pod:

kubectl delete pods --all -n <namespace> --grace-period 0 --force

下面的命令与awkxargs可以与--grace-period=0 --force一起使用来删除所有状态的Pods。

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

我使用这个命令删除pods

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

但当我试着运行另一个豆荚时,它不工作,它被卡在“待处理”中。状态,看起来节点本身被卡住了。

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

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

我在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 -来执行它。 : < / p >

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 -

我的豆荚卡在“终止”,即使在我试图重新启动docker &重新启动服务器。解决后编辑pod &删除'finalizer'下面的项目

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