k8s node not ready PLEG is not healthy: pleg was last seen active ago; threshold is 3m0废s

问题:

k8s node not ready PLEG is not healthy: pleg was last seen active ago; threshold is 3m0废s_第1张图片

排查步骤:

1、 describe node 如下

在这里插入图片描述

这句话的意思是PLEG上次处于活跃状态是59小时之前,阈值是3分钟。也就是说pleg在不活跃状态下持续3分钟,node就被标记为not ready状态。

k8s node not ready PLEG is not healthy: pleg was last seen active ago; threshold is 3m0废s_第2张图片

2、 登录node 节点,查看kubelet状态,发现是正常的,

k8s node not ready PLEG is not healthy: pleg was last seen active ago; threshold is 3m0废s_第3张图片
继续查看kubelet日志,还是pleg不健康

通过上面三个日志,我们可以得到:

pleg超时-----》 kubelet不健康 -----》 node not ready。

那么问题来了? pleg是什么?

pleg是pod生命周期事件生成器"pod lifecycle event generator", 的缩写。pleg会记录Pod生命周期中的各种事件,如容器的启动、终止等,这些事件会写入缓存中,同时他检测到container异常退出时,他会通知kubelet,然后重启创建该container。(https://github.com/kubernetes/kubernetes/issues/45419#issuecomment-304413713)

pleg在每次迭代检查中会 调用docker ps来检测容器状态的变化,并调用docker Inspect来获取这些容器的详细信息。

在完成每次迭代之后,它更新一个时间戳。如果时间戳有一段时间没有更新(即3分钟),则运行状况检查失败。

所以,原因有可能是docker ps和docker inspect很慢,以至于pleg在检查过程中超时

我们执行下docker ps,发现果然卡住了。

vmstat和top,查看cpu和内存占用,无异常

k8s node not ready PLEG is not healthy: pleg was last seen active ago; threshold is 3m0废s_第4张图片

故障原因

通过参考这边文章 https://www.infoq.cn/article/t_ZQeWjJLGWGT8BmmiU4

其中说明了原因是systemd的一个bug导致。

临时解决办法是:

在故障节点上执行 systemctl daemon-reexec。执行后故障确实恢复,但是这只是临时解决办法。

根本解决是:将systemd升级到 v242-rc2,升级后需要重启操作系统。(https://github.com/lnykryn/systemd-rhel/pull/322)

需要补充的是

同时发生的一个故障是,从master 节点ssh到故障节点很慢,通过ssh -vvvv发现
卡在了 pledge: network
k8s node not ready PLEG is not healthy: pleg was last seen active ago; threshold is 3m0废s_第5张图片
然后参考了这篇文章
https://serverfault.com/questions/792486/ssh-connection-takes-forever-to-initiate-stuck-at-pledge-network

查看日志
k8s node not ready PLEG is not healthy: pleg was last seen active ago; threshold is 3m0废s_第6张图片

查看日志journalctl -u systemd-logind.service -r

k8s node not ready PLEG is not healthy: pleg was last seen active ago; threshold is 3m0废s_第7张图片

至此,两个故障的原因貌似都指向了systemd。

如上所述,在执行了 systemctl daemon-reexec之后,这个故障也恢复了。

正如前面提到的,根本解决办法是升级systemd。

我们先查看下当前systemd的版本

# systemctl --version
systemd 219
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN

如果你想从根本上解决这个故障,你需要升级systemd到v242-rc2版本。升级后可能需要重启操作系统。(是否需要重启我不确定。)

你可能感兴趣的:(k8s)