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集群节点磁盘空间不足问题排查之一
发布评论