K8s Master 节点磁盘空间不足导致磁盘使用率过高的排查与长效治理
2026-08-11 00:53:03
# Kubernetes
问题现象与背景原因
Master 节点磁盘使用率持续升高直至打满,是常见的”慢性病”。典型现象:
- 节点状态出现
DiskPressure条件,kubelet 触发驱逐(Eviction),把部分甚至全部 Pod 赶走; - 控制面组件异常:etcd 因磁盘写不进去而心跳超时、apiserver 报
write: no space left on device; - 登录节点发现
/或/var分区 100% 使用率,df -h飘红。
根因通常不是单一文件,而是几类”空间黑洞”叠加:
- 容器日志无轮转:docker 默认
json-file驱动不限制大小,应用疯狂打日志会把/var/lib/docker/containers或/var/log/containers撑爆; - 镜像 / 废弃层堆积:长期不清理,无用镜像、悬空层占用数 GB;
- etcd 数据膨胀或碎片:频繁写入导致 DB 文件变大;
- 系统日志
/var/log爆满:journald、内核日志未轮转; - kubelet 残留:已删除 Pod 的空目录、孤儿卷未回收。
排查过程(思路与定位方法)
先定位”哪块盘、被谁吃满”:
1 | # 1. 看整体磁盘占用 |
确认是否是日志问题:
1 | # docker 容器日志体积 |
确认 etcd 数据是否过大:
1 | ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \ |
解决方法(清理策略 + 长效方案)
一、紧急清理(止血)
1 | # 1. 清理未使用的镜像、容器、网络(docker) |
若磁盘已 100% 导致节点 NotReady,先 kubectl drain 腾挪 Pod,再清理:
1 | kubectl drain <master节点> --ignore-daemonsets --delete-emptydir-data --force |
二、etcd 碎片整理(如 DB 过大)
1 | ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \ |
三、长效架构方案(避免复发)
- 组件独立磁盘:etcd 独占一块高性能 SSD,docker/containerd 数据目录挂独立盘,与系统盘分离;
- 日志轮转 + 大小限制:docker 守护进程配置
json-file的max-size/max-file:
1 | { |
containerd 在 /etc/containerd/config.toml 配置 MaxLogFileSize 限制单日志文件大小;
3. journald 限大小:/etc/systemd/journald.conf 设 SystemMaxUse=500M;
4. 自动清理 cron:定期 docker system prune + 日志截断脚本;
5. 监控告警:node-exporter + 磁盘使用率告警,在 DiskPressure 之前介入;
6. 考虑托管控制面 / 外部 etcd:把 etcd 交给云厂商或独立部署,降低自建 Master 的磁盘风险。
操作命令速查
1 | df -h # 看磁盘占用 |
经验总结
- 磁盘满不是”删个文件”就完事,要分清是日志、镜像还是 etcd,对症清理。
- 治本靠架构:独立盘 + 日志轮转 + 自动清理 + 监控告警,四件套缺一不可。
- 不要直接
rm -rf正在写入的日志文件,用truncate -s 0更安全,避免句柄泄漏。 - Master 磁盘问题会直接拖垮控制面,优先级高于普通节点,应纳入最高频巡检项。