【问题现象】
1、上周五晚上出现Docker服务端的CPU较高问题,单核显示占用120%左右,内存正常;
2、自研进程,cpu内存占用都很小;
3、周一早上上班发现CPU回归正常,单核显示占用3%左右
【分析定位步骤】
1、由于周一早上上班之后,docker服务端的CPU恢复了正常,所以只能查看日志,尝试定位问题
2、查看docker服务日志,发现上周五下午16:25:33秒dockerd(docker服务)和kubelet(k8s节点的work进程)断连,周六早上10:57:24秒,被systemd自动拉起
journalctl -u docker.server -S "2019-12-13 16:25:30"
3、不知为何dockerd会被重启,直接查看查看系统日志/var/log/messages-20191215上下文
发现周六早上10:57:24秒的flanneld(网络规划服务)被systemd(Linux守护进程)认定为异常,systemd对kubelet、docker、flanneld进行了重启,从而整个系统恢复了正常,从上面的日志分析猜测是flanneld出现了未知异常,导致docker和kubelet网络异常,引起docker的cpu增高。
Flanneld异常的原因现在暂时未清楚,但是通过flanneld上面的日志,flanneld重启之前,控制器的服务一直在报挂载卷异常,所以猜测硬盘满了,导致了flanneld的异常,现在系统已经使用了572G,但当时只是分配了500G
【主要调试命令】
开启daemon的debug日志
可以在启动docker的时候加上-D参数,但是一般环境出现了问题我们不能重启,所以docker给我们想好了出现了问题应该怎么做:
https://docs.docker.com/config/daemon/
(Enable debugging章节)
在/var/docker/daemon.json中设置好
{
"debug": true
}
使用命令
sudo kill -SIGHUP $(pidof dockerd)
重新加载配置文件, docker开始打印debug日志
打印docker堆栈
$ kill -SIGUSR1 $(pidof dockerd)
上述命令是否生效,以及堆栈文件的生成位置,都可以在journalctl -u docker.service -f 查看到