排查kubernetes节点磁盘被日志撑满需分三步:先用df -h/df -ih/du定位是否真满及位置;再区分容器stdout、journald、应用自写三类日志来源;最后用truncate清空、find删除旧日志、配置max-size/max-file根治,并用lsof +l1处理已删未释文件。

排查 Kubernetes 节点磁盘被日志撑满,关键不是一上来就删文件,而是分三步锁定日志来源:先确认是不是日志真占满了、再定位是哪类日志、最后安全清理不伤服务。
第一步:确认磁盘满的类型和位置
登录节点后立刻执行:
-
df -h:看
/或/var是否 Use% 达到 100%,重点关注挂载点; -
df -ih:如果空间还有余量但报
No space left on device,很可能是 inode 耗尽,尤其常见于/var/log下大量小日志文件; -
du -sh /var/log/* 2>/dev/null | sort -hr | head -10:快速找出日志目录里最占空间的子目录,比如
/var/log/containers、/var/log/pods、/var/log/journal或业务自定义日志路径。
第二步:区分三类日志来源
K8s 节点上日志有三大“主力军”,每类排查方式不同:
-
容器 stdout/stderr 日志(json-file 驱动):默认存在
/var/log/containers/*.log和/var/log/pods/下,每个 Pod 对应一个目录。用ls -lhS /var/log/containers/ | head -10看最大日志文件; -
journald 系统日志:Kubelet、containerd 等服务日志走 systemd,执行
journalctl --disk-usage查用量,journalctl -u kubelet --since "3 days ago" | wc -l看近期条数; -
应用自身写入的日志文件:比如 Nginx、MySQL 或业务程序在
/var/log/app/下直接写文件,这类通常没轮转机制,容易单个文件达几十 GB。
第三步:安全清理与长期防控
清理前务必避免直接 rm 正在写入的日志文件——空间不会释放。正确做法:
- 清空大日志:
truncate -s 0 /var/log/containers/nginx-abc.log或cat /dev/null > /var/log/app/current.log; - 删旧日志:
find /var/log/app -name "*.log.*" -mtime +7 -delete; - 限制 journald:
sudo journalctl --vacuum-size=200M或配置/etc/systemd/journald.conf中SystemMaxUse=200M; - 根治容器日志膨胀:检查 Docker/containerd 的日志驱动配置,确保启用
max-size和max-file,例如:
{"log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3"}}。
额外注意:已删除但未释放的日志文件
如果清理后 df -h 空间没变化,运行:lsof +L1 | grep log
查出被进程持有句柄的已删日志(标记为 deleted),重启对应服务(如 systemctl restart kubelet 或 crictl stop && crictl rm 对应容器)即可释放空间。











