这类问题我又碰上了一次。一台 8 核 16G 的 worker 半夜开始驱逐 Pod,kubectl describe node 显示 DiskPressure True,节点上 evicted 的 Pod 有十几个,df -h 显示根分区还剩百分之四。

第一反应是「Pod 的空目录里写了大量临时文件,占用算在节点根分区上」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。kubelet 的 evictionHard 阈值是 10%,剩余低于它就会开始挑 Pod 驱逐;镜像和容器日志把 /var/lib/docker 撑满,节点可回收空间一路下滑;日志驱动是 json-file 且没限大小,单个容器的日志涨到几十 G。

上来先看节点上到底是什么在占空间

du -xsh /var/lib/docker/* /var/log/* 2>/dev/null | sort -h | tail -10

随后清掉不用的镜像释放空间

crictl rmi --prune

限制容器日志大小并滚动

printf '{"log-driver":"json-file","log-opts":{"max-size":"100m","max-file":"3"}}' > /etc/docker/daemon.json && systemctl reload docker

等前面都确认过,再确认压力状态已经解除

kubectl describe node node-2 | grep -i 'diskpressure\|Allocatable' -A2

改完先别撤,确认这几项。describe node 的 DiskPressure 变为 False,驱逐的 Pod 在其他节点重新 Running,节点根分区使用率降到七成以下。

驱逐是按 QoS 从低到高挑,没有 requests 的 Pod 最先走;给节点单独挂数据盘放 docker 目录,比事后清理可靠得多。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189