初遇 k8s Pod 处于 Unknown 状态

背景

今天下午突然发现,ACK 环境中运行的 Pod,有几个的状态显示为 Unknown,如下:

NAME                                     READY     STATUS         RESTARTS   AGE
annoroad-alpha-6589c4c6d7-d2vxr          1/1       Running        0          7d
annoroad-alpha-5947b7745c-gv7ng          1/1       Unknown        1          8d

原因

在百度上找到了这么一段话

从 v1.5 开始,Kubernetes 不会因为 Node 失联而删除其上正在运行的 Pod,而是将其标记为 Terminating 或
Unknown 状态

通过这句话,问题就很明显了,应该是 Pod 所在的 Node 出了问题,从而导致 Pod 的状态为 Unknow。再进一步对几个处于 Unknow 状态的 Pod 进行排查(kubectl describe po …),发现这几个 Pod 都属于同一个 ACK 节点,这就更加证明了是由于 ACK 节点出了问题而导致问题出现的猜测。马上联系运维,从运维那里也得到了证实,果然 ACK 节点出了问题。

如何删除 Unknown 状态的 Pod

问题找到,但是怎么才能将这个有问题的 Pod 删除呢?这里有三种方法:

  1. 从集群中删除有问题的 Node。使用公有云时,kube-controller-manager 会在 VM 删除后自动删除对应的 Node。而在物理机部署的集群中,需要管理员手动删除 Node(kubectl delete node ${node_name})。
  2. 被动等待 Node 恢复正常,Kubelet 会重新跟 kube-apiserver 通信确认这些 Pod 的期待状态,进而再决定删除或者继续运行这些 Pod。
  3. 主动删除 Pod,通过执行 kubectl delete po ${pod_name} --grace-period=0 --force 强制删除 Pod。但是这里需要注意的是,除非明确知道 Pod 的确处于停止状态(比如 Node 所在 VM 或物理机已经关机),否则不建议使用该方法。特别是 StatefulSet 管理的 Pod,强制删除容易导致脑裂或者数据丢失等问题。

两个 annoroad-alpha-xxxxx-xx Pod ??

这里再多说一嘴,从「背景」中我们可以看到,ACK 里有两个 annoroad-alpha-xxxxx-xx Pod,一个处于 Running,一个处于 Unknown,这是由于我采用的是 Deployment 发布的,且 Deployment 的 replicas 设置为 1,所以 K8s 就要保证一直都有 1 个 Pod 处于 Running 状态。也就是说,当原本执行的 Pod(annoroad-alpha-5947b7745c-gv7ng) 由于所属节点出了问题导致状态变为 Unknown,K8s 为保证一直都有 1 个处于Running 状态 Pod,所以就又自动起了一个新的 Pod(annoroad-alpha-6589c4c6d7-d2vxr)。

你可能感兴趣的:(初遇 k8s Pod 处于 Unknown 状态)