如何排查单节点Kubernetes集群的节点磁盘占用过高问题
我来帮你一步步拆解这个磁盘占用过高的问题,你看到的那些overlay挂载其实是容器的根文件系统,它们共享宿主机的根磁盘空间,所以咱们从几个核心方向入手排查:
第一步:检查容器镜像的存储空间占用
从挂载路径能看出你用的是containerd,直接用crictl工具查看镜像:# 按大小排序查看所有镜像,找出占空间最大的那些 crictl images --sort size如果发现有没用的旧镜像或者悬空镜像,可以手动清理:
# 删除单个无用镜像 crictl rmi <镜像ID> # 一键清理所有未被使用的镜像、容器、快照等资源(会提示确认) crictl system prune要是你习惯用docker命令,也可以用
docker images和docker system prune,效果类似。第二步:排查容器日志的大小
Kubernetes容器的日志默认存在宿主机本地,很容易被忽略而占满磁盘:# 查看每个Pod日志目录的总大小 du -sh /var/log/pods/* # 找出单个超过1G的日志文件 find /var/log -name "*.log" -size +1G -exec du -h {} \;如果是日志占了大量空间,要么手动清理旧日志(注意别删正在写入的日志),要么给容器配置日志轮转规则——比如在Pod的YAML里给容器添加日志配置,限制单日志文件大小和保留数量。
第三步:核查Persistent Volumes的实际使用
虽然你用的是PV而非hostPath,但如果是local类型的PV,最终还是挂载在节点本地的:# 查看指定PV的详细信息,找到挂载路径 kubectl describe pv <你的PV名称>然后用
du -sh <挂载路径>查看实际占用空间,也可以直接进入Pod内部,用df -h和du -sh /<挂载点路径>确认是不是应用本身写入了大量数据到PV里。第四步:清理containerd的残留资源
有时候已停止的容器、未被引用的快照也会偷偷占空间:# 查看所有容器(包括已停止的) crictl ps -a # 删除单个已停止的无用容器 crictl rm <容器ID>之前提到的
crictl system prune其实已经包含了这些资源的清理,不过单独排查能更清楚哪些资源在浪费空间。第五步:检查节点上的其他非K8s相关大文件
最后别忘了排查节点本身的系统文件,比如系统日志、临时文件、备份包之类的:# 先看根目录下各文件夹的总大小 du -sh /* # 针对大文件夹深入排查,比如/var目录 du -sh /var/* # 找出所有超过1G的文件 find / -type f -size +1G -exec du -h {} \;
小提醒
清理资源前,最好确认这些资源确实没有被正在运行的Pod使用,尤其是生产环境,避免误删导致业务中断。如果是日志占空间,一定要配置好日志轮转,从根源上解决问题。
备注:内容来源于stack exchange,提问作者knpwrs




