初遇 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)。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cab5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值