吊舱处于终止状态


244

我尝试删除ReplicationController具有12个吊舱的,我可以看到某些吊舱处于卡住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

调度程序和控制器管理器是否正在运行?
Antoine Cotten

Answers:


471

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

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

3
这是我在1.2.4上的解决方案。整夜都在
停下

6
就我而言,我必须再添加一个选项:--force对豆荚进行处理。
宝马

17
我是在集群中执行此操作的,并且pod似乎已删除,但是当我检查节点时,其容器仍在运行。我最终在节点本身上重新启动了Docker。github.com/kubernetes/kubernetes/issues/25456请注意,不要用此命令隐藏系统性问题。
mqsoh

4
@mqsoh:强制删除只是将其从api服务器存储(etcd)中删除,实际删除的资源可能会无限期地运行。

8
“警告:立即删除不会等待正在运行的资源已终止的确认。该资源可能会无限期地继续在群集上运行。”哪些资源?
阿克瑟伊,

57

强制删除窗格:

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

--force标志是强制性的。


41
但是对我来说,真正的问题是“为什么我们必须首先诉诸于此?” 在其他正常操作条件下,什么原因导致吊舱陷入卡住状态?
neverfox17年

2
好吧,我举一个例子,我们有一个java容器,它可以正常关闭,但是会垃圾回收自己,以至于无法对信号做出反应。
奥雷利亚'18

1
提供名称空间是一件好事,否则在多名称空间环境中将找不到您的pod,默认情况下,它会在kube-system名称空间中查找。
Daniel AndreiMincă18年

要强制立即删除在namesapce所有吊舱ktl get pods -o custom-columns=:metadata.name | xargs kubectl delete pod --force --grace-period=0
deepdive

21

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

"finalizers": [
  "foregroundDeletion"
]

1
永久卷在此之后被删除。它到底是做什么的?
raiyan

卡在终止状态的豆荚立即被移除。
Kuberchaun

这是唯一在delete -grace-period=0 --force没有修复时为我修复卡住的豆荚的东西。不过,我也希望能详细说明它的确切功能。
valorl

本页介绍了foregroundDeletion。它是一个元数据值,指示对象正在删除中。kubernetes.io/docs/concepts/workloads/controllers/…–
肖恩·基恩

14

实用的答案-您始终可以通过运行以下命令删除终止的pod:

kubectl delete pod NAME --grace-period=0

历史答案-版本1.1中存在一个问题,如果荚的节点被不干净地从集群中删除,则有时荚会陷入终止状态。


1
我想这就是问题所在。我关闭了一个minion vm的电源,而没有从节点中删除它。这是可以接受的行为吗?或者是否有修复程序可以从kubernetes中删除这些吊舱?
Dimuthu '16

是的,直到版本1.2出现时,解决方法是删除pod。
亚历克斯·罗宾逊

36
您可以随时通过kubectl delete pod NAME --grace-period=0
Clayton

3
该医生说,当运行kubectl delete ...一个SIG_TERM请求将被发送到容器。但是,如果在宽限期之后容器仍在运行,该怎么办?我有一堆豆荚Terminating,有些用go编写,有些用nodejs编写。复制
控制器

4
kubectl delete pod PODNAME --grace-period=0按照克莱顿的建议为我工作。
Yogesh Jilhawar '16

13

我发现此命令更简单:

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

它将删除默认名称空间中处于“终止”状态的所有Pod。


1
如果您想在其他名称空间上运行它,例如kube-systemfor p in $(kubectl get pods -n kube-system| grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force -n kube-system;done
acrogenesis

8

就我而言,该--force选项不太奏效。我仍然可以看到吊舱!它停留在终止/未知模式下。所以跑步后

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

我跑了

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

2
在执行此操作之前,值得阅读kubernetes.io/docs/concepts/workloads/controllers/…了解什么是终结器。此外,查看被卡住的特定终结器可能会提示其被卡住的原因以及是否可以安全绕过...
贝尼·切尔尼亚夫斯基-帕斯金

5

如果--grace-period=0不起作用,则可以执行以下操作:

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

在某些情况下,此功能似乎有效,但实际上并未删除。它可能与kubelet失去pod的状态而无法获取状态从而离开它的问题有关(例如github.com/kubernetes/kubernetes/issues/51835)。到目前为止,我还没有找到清除它的方法。
cgseller

3

我最近在删除rook ceph名称空间时偶然发现了这一点-它陷入了终止状态。

这有助于通过直接调用API K8S与卷曲终结去除kubernetes所建议的唯一的事情在这里

  • kubectl get namespace rook-ceph -o json > tmp.json
  • 删除tmp.json(保留空数组"finalizers": [])中的kubernetes终结器
  • 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
  • 命名空间不见了

详细的菜鸟ceph拆卸这里


3

最初的问题是“ 此问题的原因可能是什么? ”,答案在https://github.com/kubernetes/kubernetes/issues/51835https://github.com/kubernetes/kubernetes/issues中讨论/ 65569,请参阅https://www.bountysource.com/issues/33241128-unable-to-remove-a-stopped-container-device-or-resource-busy

这是由docker mount泄漏到其他名称空间引起的。

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

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

我简直不敢相信这是最不受欢迎的答案,也没有任何评论。尽管所有其他答案都解决了解决问题或解决问题的方法,但OP明确要求首先解决该问题的原因。
MisterStrickland

0

我最近偶然发现了这一点,以释放集群中的资源。这是删除所有命令的命令。

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

希望这对阅读本文的人有所帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.