nodediskpressure 由宿主机磁盘不足引发,kubelet 驱逐 pod 并清理 emptydir 导致数据“丢失”,实为临时卷强制回收;需区分 emptydir(设计即删)、hostpath(数据仍在)与 local pv(可能失败),并通过迁移存储路径、改用 pvc 等实现运行态与数据态分离。
宿主机磁盘不足导致 kubernetes 节点触发 nodediskpressure 状况,kubelet 会主动驱逐低优先级 pod,同时可能清理或卸载临时卷(如 emptydir),造成数据“丢失”——但本质是卷被强制回收,而非存储层物理损坏。关键要区分:是临时卷被删(可预防),还是持久卷(pv)数据真丢失(需恢复)。下面分场景说明应对和加固方法。
识别真实原因:先确认是哪类 Volume 受影响
不是所有“Volume丢失”都一样:
-
emptyDir:生命周期绑定 Pod,节点磁盘满 → kubelet 驱逐 Pod → emptyDir 目录被
rm -rf清理 → 数据彻底消失(设计如此,非故障) -
hostPath:若挂载到根分区(如
/data),磁盘满时写入失败,Pod 可能 CrashLoopBackOff,但数据仍在宿主机目录里,只是不可写 -
PersistentVolume(PV):底层是 NFS、Ceph、云盘等,本身不依赖节点本地磁盘;但若使用
local类型 PV,且其路径在/分区下,磁盘满会导致 IO hang 或挂载失败,PV 状态变为Failed
紧急止血:快速释放节点磁盘空间
驱逐发生后,先让节点恢复正常调度能力:
- 清理 containerd 无用资源:
ctr -n k8s.io containers ls -q | xargs ctr -n k8s.io containers rm(删已退出容器) - 删除悬空镜像:
ctr -n k8s.io images ls -q | xargs ctr -n k8s.io images rm - 清空 kubelet 暂存目录:
systemctl stop kubelet && rm -rf /var/lib/kubelet/pods/* && systemctl start kubelet - 截断日志:
journalctl --vacuum-size=500M;清空/var/log/*.log历史文件(find /var/log -name "*.log.*" -mtime +7 -delete)
防止再发生:隔离关键存储路径
避免 containerd 和 kubelet 占用根分区:
- 将
/var/lib/containerd和/var/lib/kubelet迁移至独立大容量分区(如/home或/data) - 迁移后建软链接:
ln -sf /home/containerd_data /var/lib/containerd,同理处理 kubelet - 更新 containerd 配置(
/etc/containerd/config.toml)中root = "/home/containerd_data" - 重启服务:
systemctl restart containerd kubelet
规避 emptyDir 数据丢失风险
emptyDir 本就不该存重要数据。若业务强依赖临时共享存储:
- 改用
emptyDir { medium: "Memory" }(内存盘,速度快、不占磁盘,但重启即失) - 或直接使用 PVC(哪怕小容量 NFS),确保生命周期独立于节点和 Pod
- 在应用层加检查:启动时判断挂载点是否可写、是否有预期文件,失败则主动退出并上报事件
真正重要的数据必须落在 PV 上,且 PV 底层需与节点本地磁盘解耦。磁盘满只是表象,根本解法是存储责任分离:运行时态(containerd/kubelet)和业务数据态(PV)各走各的路径。










