k8s集群节点磁盘空间不足问题排查之一

k8s集群环境频繁报警出现节点磁盘空间不足,导致POD被驱逐,随机POD。

物理机/磁盘空间预留100G。

deployment和statufulset都有。持久化挂载的外部ceph。空间都足够大。

到物理机上查看磁盘空间。

df -lh |grep root

确实呈现磁盘占用急剧上升的情况。

du -sh * | sort -n

时却发现没有目录的空间占用增大。

持续约十分钟左右,部分POD被驱逐后空间占用瞬间下降,像是突然释放了大量空间。

检查docker日志

ls -lh $(find /var/lib/docker/containers/ -name *-json.log)|grep G

少数几个运行时间长的POD日志占用1G,但也没有急速增长过。

手工删除或重启POD后日志消失,算是一个因素。

后陆续检查各个服务的日志,没有发现与磁盘空间占用相关的极大量日志产生。

经过一段时间跟踪定位到是mysql的容器引发,凡是Mysql调度到的节点,必然会出现该问题,查binlog日志确实有不少,同上清理。

并修改Mysql配置文件,缩小binlog日期过期时间

expire_logs_days=1

持续一段时间后,再次发生。

排上以上诸项,并无异常。

在翻日志的过程中,定位到空间爆满的时间段,其中一个服务的日志突然看到有

 Error writing file '/tmp/MYEzymCy' 

字样。

突然联想到,mysql默认的tmp目录,在大表关联,临时表处理时会使用到tmpdir空间。

show variables like '%tmp%'

果然在/tmp下,容器中的tmp与宿主机中的/tmp关联。

查附近的查询SQL,几张大表的关联查询SQL提取开发服上模拟,数据量极大,上百万之多。

于是修改代码,修改配置(业务关联),修改mysql变量,将tmpdir指向到挂载的存储中。

重新测试该部分业务,逐步增量,磁盘空间再没有暴增。

终于安稳。不得不说监控和日志真是必备的东西。

k8s集群节点磁盘空间不足问题排查之一_第1张图片

 k8s集群节点磁盘空间不足问题排查之一_第2张图片

 

你可能感兴趣的:(运维,k8s,docker,kubernetes,运维,docker)