Pod陷入终止状态

Dim*_*thu 189 kubernetes

我厌倦了删除一个带有12个pod的复制控制器,我可以看到一些pod停留在终止状态.我的Kubernetes设置包括在ubuntu vms中安装的一个主机和三个minons.这个问题可能是什么原因?

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
Run Code Online (Sandbox Code Playgroud)

Nit*_*tin 378

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

kubectl delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE>
Run Code Online (Sandbox Code Playgroud)

  • 我在我的集​​群中做了这个,并且pod似乎被移除但是当我检查节点时它的容器仍在运行.我最终在节点上重启了Docker.https://github.com/kubernetes/kubernetes/issues/25456请注意,您没有隐藏此命令的系统性问题. (11认同)
  • 就我而言,我还需要添加一个选项:`--force`以使pod终止. (6认同)
  • “警告:立即删除不会等待确认正在运行的资源已终止。该资源可能会无限期地继续在群集上运行。”哪些资源? (6认同)
  • 这是1.2.4的解决方案.豆荚整晚都在终止 (3认同)
  • @mqsoh:强制删除只是将其从api服务器存储区(etcd)中删除,实际删除的资源可能会无限期地运行。 (3认同)
  • 这种情况发生在部署期间,健康的应用程序陷入终止状态,而不健康的应用程序进入重新启动循环(由于严格的就绪/运行状况检查超时)..太棒了!我以为库贝的强项就是韧性??过去 2 年中该网站唯一一次宕机是在 Kubernetes 上。我真的希望这一切都是由于用户错误造成的,因为我正在失去信心。另一方面,我强制终止并释放资源。 (2认同)

Joa*_*oan 50

强制删除pod:

kubectl delete pod --grace-period=0 --force --namespace <NAMESPACE> <PODNAME>
Run Code Online (Sandbox Code Playgroud)

--force标志是强制性的.

  • 但对我来说真正的问题是"为什么我们必须首先诉诸于此?" 在其他正常操作条件下,什么类型的东西会导致吊舱进入这种卡住状态? (36认同)
  • 好吧,我可以给你一个例子,我们有一个优雅关闭的java容器,但垃圾收集本身就死了,因此不会对信号做出反应. (2认同)

noe*_*lin 43

最初的问题是“这个问题的原因什么? ”,答案在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

它是由 docker mount 泄漏到其他一些命名空间引起的。

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

minikube ssh
docker container ps | grep <id>
docker container stop <id> 
Run Code Online (Sandbox Code Playgroud)

  • 我不敢相信这是得票最少的答案,而且没有一条评论。虽然所有其他答案都解决了解决问题或解决问题的方法,但OP明确询问了这种情况首先发生的原因。 (7认同)
  • 答案已经说了这一点,但我想强调一点:确保在托管 pod 的节点中运行这些命令! (3认同)

rrr*_*rrr 25

我最近偶然发现了这个来释放集群中的资源。这是将它们全部删除的命令。

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
Run Code Online (Sandbox Code Playgroud)


小智 23

我发现这个命令更简单:

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

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

  • 如果你想在其他命名空间上运行它,比如 `kube-system` 使用: `for p in $(kubectl get pods -n kube-system| grep Termination | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force -n kube-system;done` (2认同)
  • `kubectl delete pod --force $(kubectl get pods | grep Termination | cut -d' ' -f1)` 是这个答案的简短形式。 (2认同)

小智 19

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

"finalizers": [
  "foregroundDeletion"
]
Run Code Online (Sandbox Code Playgroud)


Ale*_*son 11

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

kubectl delete pod NAME --grace-period=0
Run Code Online (Sandbox Code Playgroud)

历史答案 - 版本1.1中存在一个问题,如果从群集中不正确地删除节点,则有时pod会陷入Terminating状态.

  • 您始终可以使用`kubectl delete pod NAME --grace-period = 0`强制删除终止窗格 (35认同)
  • 根据克莱顿的建议,`kubectl delete pod PODNAME --grace-period = 0`为我工作. (4认同)
  • doc说运行`kubectl delete ...时```SIG_TERM`请求将被发送到容器.但是如果在宽限期之后,容器仍在运行呢?我有一堆pods卡在`Terminating`,有些写在go,有些在nodejs.replicationController已删除,容器仍在运行 (3认同)
  • 我想这就是问题所在。我关闭了一台 Minion 虚拟机,但没有从节点中删除。这是可以接受的行为吗?或者是否有修复程序可以从 kubernetes 中删除这些 pod? (2认同)

Abd*_*UMI 9

就我而言,我不喜欢解决方法。所以有步骤:

  • k get pod -o wide-> 这将显示哪个节点正在运行 pod
  • k get nodes-> 检查该节点的状态...我明白了NotReady

我去修复了那个节点。对于我的情况,只需重新启动 kubelet 即可:

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

现在,删除 pod 应该可以正常工作,而不会强制执行 Poor pod。


小智 8

请尝试以下命令:

kubectl patch pod <pod>-p '{"metadata":{"finalizers":null}}'
Run Code Online (Sandbox Code Playgroud)

  • 点评来源:Stack Overflow 上不鼓励仅使用命令/代码的答案,因为它们没有解释它如何解决问题。请编辑您的答案以解释此代码的作用以及它如何回答问题,以便它对OP以及具有类似问题的其他用户有用。请参阅:[如何写出一个好的答案?](https://stackoverflow.com/help/how-to-answer)。谢谢 (4认同)

zub*_*b0r 7

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

唯一有帮助的是通过使用curl 直接调用 k8s api 来删除 kubernetes 终结器,如此处建议的那样

  • kubectl get namespace rook-ceph -o json > tmp.json
  • 删除 kubernetes 终结器tmp.json(保留空数组"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 拆解请参见此处


小智 7

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

kubectl delete pods --all -n <namespace> --grace-period 0 --force
Run Code Online (Sandbox Code Playgroud)


小智 7

删除所有命名空间中处于“终止”状态的所有 pod:

kubectl get pods --all-namespaces | awk '/Terminating/{print $1 " " $2}' | while read -r namespace pod; do kubectl delete pod "$pod" -n "$namespace" --grace-period=0 --force;done
Run Code Online (Sandbox Code Playgroud)


小智 6

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

kubectl delete pods <pod> --grace-period=0 --force
Run Code Online (Sandbox Code Playgroud)


sh0*_*mik 6

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

kubectl delete pods <pod> -n redis --grace-period=0 --force
Run Code Online (Sandbox Code Playgroud)

我跑了

kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'
Run Code Online (Sandbox Code Playgroud)

  • 在执行此操作之前,值得阅读 https://kubernetes.io/docs/concepts/workloads/controllers/garbage-collection/ 以了解终结器是什么。此外,查看卡住的特定终结器可能会提示_为什么_卡住以及绕过是否安全... (3认同)

Thi*_*ves 6

我用这个命令来删除 Pod

kubectl delete pod --grace-period=0 --force --namespace <NAMESPACE> <PODNAME>
Run Code Online (Sandbox Code Playgroud)

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

对我来说,解决方案是重新创建节点。我只是转到 GKE 控制台并从集群中删除了该节点,然后 GKE 启动了另一个节点。

之后,一切又开始正常运转。


Pro*_*ton 6

我在生产 Kubernetes 集群中遇到了同样的问题。

一个 Pod 在终止阶段停留了一段时间:

pod-issuing   mypod-issuing-0   1/1     Terminating   0  27h
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下命令检查日志和事件:

kubectl describe pod mypod-issuing-0 --namespace pod-issuing
kubectl logs mypod-issuing-0 --namespace pod-issuing
Run Code Online (Sandbox Code Playgroud)

但没有一个可供查看

我是如何修复它的:

我运行以下命令来强制删除 pod:

kubectl delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE>
Run Code Online (Sandbox Code Playgroud)

这会立即删除该 pod 并开始创建一个新的 pod。但是,在创建另一个 pod 时,我遇到了以下错误:

无法附加或装载卷:已卸载的卷=[数据],未附加的卷=[数据 mypod-issuing-token-5swgg aws-iam-token]:等待条件超时

我必须等待 7 到 10 分钟才能使该卷与我删除的上一个 Pod 分离,以便它可以用于我正在创建的新 Pod。


小智 5

您可以使用awk

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