如何排查Minikube中/dev/sda1存储耗尽问题?
咱们一步步来定位问题根源,再针对性解决,毕竟Minikube磁盘占满确实挺闹心的:
1. 快速定位大目录
先进入Minikube节点,扫描/mnt/sda1下的目录占用情况,找到最“吃空间”的目录:
# 进入Minikube节点 minikube ssh # 切换到/dev/sda1挂载目录 cd /mnt/sda1 # 查看一级目录的空间占用(按大小排序更直观) du -h --max-depth=1 | sort -rh
这个命令会帮你快速锁定占用最高的目录,比如/var/lib/docker、/var/log或者Minikube的PV存储目录。
2. 深入分析大目录
根据上一步的结果,对重点目录进行细分排查:
情况A:/var/lib/docker占用过高
Docker的存储包含镜像、容器、卷、日志等,进一步拆分查看:
# 查看Docker子目录的占用 du -h /var/lib/docker --max-depth=2 | sort -rh
- 如果是
images目录大:执行更彻底的镜像清理(包含中间层镜像),比单独的image prune更有效:
这个命令会删除所有未使用的镜像、容器、卷和网络,清理力度拉满。docker system prune -a -f --volumes - 如果是
containers目录大:大概率是容器日志无限制增长导致的,查看具体容器的日志大小:
找到大日志文件后,可以临时清空(注意先确认容器可重启):cd /var/lib/docker/containers du -h --max-depth=1 | sort -rh
后续建议给容器配置日志轮转,避免再次占满磁盘。# 替换<CONTAINER_ID>为目标容器ID truncate -s 0 /var/lib/docker/containers/<CONTAINER_ID>/<CONTAINER_ID>-json.log - 如果是
volumes目录大:检查你的MySQL和MongoDB PV对应的卷是否超出预期,比如MySQL备份是否累积了大量旧文件:# 查看所有Docker卷的挂载路径 docker volume ls | awk '{print $2}' | xargs -I {} docker volume inspect {} | grep -E "Mountpoint|Name" # 进入挂载点查看具体文件大小 du -h <MOUNTPOINT>
情况B:Minikube的PV存储目录占用过高
Minikube默认的hostPath类型PV通常存在/mnt/sda1/var/lib/minikube/hostpath_pv或/tmp/hostpath-provisioner下,检查这些目录:
du -h /mnt/sda1/var/lib/minikube/hostpath_pv --max-depth=2 | sort -rh
如果是MySQL备份PV占用远超20GB,那可能是备份任务没有清理旧备份,直接进入对应目录删除冗余文件即可。
情况C:/var/log目录占用过高
系统或应用日志可能无限制增长,查看大日志文件:
cd /var/log du -h --max-depth=1 | sort -rh
找到大日志后,可以用logrotate配置轮转策略,或者临时删除旧日志文件(比如rm -f /var/log/syslog.1)。
3. 检查已删除但仍被进程占用的文件
有时候文件已经被删除,但进程还在占用它,导致磁盘空间无法释放。用以下命令找出这类文件:
lsof | grep deleted
输出中会显示占用已删除文件的进程ID(PID),可以重启对应进程或者用kill -9 <PID>终止进程,释放磁盘空间。
4. 清理Skaffold相关缓存
虽然你已经执行了Skaffold清理,但可能还有残留的构建缓存或同步文件:
# 在本地执行,清理Skaffold的本地缓存 skaffold cache delete # 进入Minikube节点,清理Skaffold可能留下的构建 artifacts rm -rf /mnt/sda1/var/lib/docker/overlay2/*skaffold*
5. Minikube专属清理操作
如果以上步骤都没解决,可以尝试Minikube的缓存清理:
# 清理Minikube本地缓存的所有镜像 minikube cache delete --all # 重启Minikube(如果业务允许的话) minikube stop && minikube start
后续建议在Minikube节点安装ncdu工具(apt install ncdu),它可以交互式地查看磁盘占用,更直观地定位大文件。
内容的提问来源于stack exchange,提问作者juan garcia

