问题现象
Kubernetes 集群中有几个节点每隔 3 ~ 5 分钟就会 NotReady,查询该节点的 Kubelet 日志发现如下报错:
PLEG is not healthy: pleg was last seen active 3m5.30015447s
PLEG is not healthy: pleg was last seen active 3m5.30015447s
PLEG is not healthy: pleg was last seen active 3m5.30015447s
PLEG is not healthy: pleg was last seen active 3m5.30015447s
问题分析
该现象在 1.16.x 的集群曾经遇到过,有 issue 指明是该版本的 Bug。但当前集群的版本为 1.19.x ,能确定可能不是 Bug。
简述下 PLEG 是什么?
PLEG 全称叫 Pod Lifecycle Event Generator
,即 Pod 生命周期事件生成器。实际上它只是 Kubelet
中的一个模块,主要职责就是通过每个匹配的 Pod 级别事件来调整容器运行时的状态,并将调整的结果写入缓存,使 POD 的缓存保持最新状态。
通过 PLEG 的介绍大概能知道这玩意是干嘛的了,其中的原理就不过多阐述了,简单来说:Kubelet 检测容器生命周期失败,从而出现了该问题。
问题解决
通过以上描述得出,需要排查 Kubelet 异常节点的容器,通过以下命令排查:
for c in `docker ps -aq`; do echo $c; docker inspect $c 1>/dev/null 2>&1; done
如果在某个容器卡住,那么就说明是该容器导致的。
xxxxx
xxxxx
xxxxx
646c7c7fb7
脚本检测到是 646c7c7fb7
不正常,尝试手动 inspect
docker inspect 646c7c7fb7
发现卡住,尝试删除该容器
docker rm -f 646c7c7fb7
还是卡住,此时容器 hang 住了,需要通过其他手段删除该容器。
首先卸载该容器的挂载。
$ cat /proc/mounts |grep "docker" | grep 646c7c7fb7
shm /var/lib/docker/containers/646c7c7fb7342c38d0586178f8f98cc5afb64b45456bfda4870388214/mounts/shm tmpfs rw,nosuid,nodev,noexec,relatime,size=65536k 0 0
$ umount /var/lib/docker/containers/646c7c7fb7342c38d0586178f8f98cc5afb64b45456bfda4870388214/mounts/shm
删除容器目录
rm -rf /var/lib/docker/containers/646c7c7fb7342c38d0586178f8f98cc5afb64b45456bfda4870388214
此时容器还是删不掉的,因为还有其他进程在使用它,kill 掉使用该容器的进程。
$ ps aux | grep 646c7c7fb7
$ kill -9 79801 79803
此时再查看容器可以发现已经删除掉了。
docker ps -a | grep 646c7c7fb7
问题解决,观察 Kubelet 10分钟左右,没有再出现 NotReady 状态。
结论
问题可能没有彻底解决,因为不清楚为什么会出现 hang 住的容器,也许不会再出现,也许还会出现。