「Bug」Pod 无法删除,卡在 Terminating 状态

修改了 Deployment 后,旧的 Pod 被 Terminated,新的 Pod 被启动。

然后问题就出现了,旧 Pod 一直处于 Exited: Terminated 状态,无法删除。

因为我们使用了 hostPort,端口一直被这个旧 Pod 占用,新 Pod 就无法启动,一直 Pending.

通过 kubectl describe pod <pod-name> 查看:

...
Annotations:               cni.projectcalico.org/podIP: 100.103.53.8/32
Status:                    Terminating (lasts 29h)
Termination Grace Period:  5s
IP:
IPs:                       <none>
...
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  test-token-d4d2k:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  test-token-d4d2k
    Optional:    false
QoS Class:       Burstable
Node-Selectors:  kubernetes.io/hostname=xxxxxx
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:          <none>

显示终止状态持续了 29h: Status: Terminating (lasts 29h)

原因分析

目前尚不清楚原因,通过 docker ps -a | grep <pod-name> 查看,发现该容器已经处于 Exited 状态,也就是说容易已经死掉了。
但是容器只是 Exited 了,没有被删除, Pod 也一直卡在 Terminating 状态。

网上询问同道,说这种情况可能是容器相关的其他资源(数据卷之类的东西)无法删除,导致容器一直卡在这个状态。
下次好好排查一下看看。

解决方法

方法一

使用 kubectl 命令:

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

方法二

使用 docker 命令:

  1. 手动登录到对应的节点,通过 docker ps -a | grep 查找到已经 Exited 的容器
  2. 然后 docker rm -f <container-id> 手动删除掉它。

现在再进 kubernetes,发现旧 Pod 已经消失了。

posted @ 2020-03-17 09:13  於清樂  阅读(...)  评论(...编辑  收藏