磁盘不足触发Kubernetes驱逐机制,导致容器异常终止、残留文件及/tmp等目录权限丢失,重建时因权限缺失无法启动;需立即清理空间、修复权限(如chmod 1777 /tmp)、调优eviction阈值并配置securityContext与日志轮转。

磁盘不足导致容器被驱逐后出现权限挂起,本质是节点资源紧张触发了Kubernetes的eviction机制,而驱逐过程可能中断容器正常退出、残留临时文件或破坏目录权限(尤其是/tmp、/var/run等共享路径),后续Pod重建时因权限缺失无法初始化。解决需兼顾空间释放、权限修复与机制调优。
快速释放磁盘空间并恢复基础权限
先解除“无空间”状态,避免持续驱逐:
- 登录问题节点,用
df -h确认根分区或/var/lib/docker所在挂载点是否满载 - 立即清理已退出容器和悬空镜像:
docker container prune -f && docker image prune -f - 定位大日志文件并清空(不删除,避免进程报错):
find /var/lib/docker/containers -name "*.log" -size +100M -exec truncate -s 0 {} \; - 检查
/tmp权限是否异常(常见问题):ls -ld /tmp—— 正常应为drwxrwxrwt;若缺少w或t位,执行:chmod 1777 /tmp
修复因迁移或覆盖导致的Docker Root Dir权限问题
若此前迁移过/var/lib/docker,cp -a遗漏或软链接失效会导致子目录(如/tmp容器内路径)权限丢失:
- 验证当前Docker根目录:
docker info | grep "Docker Root Dir" - 若使用
data-root配置,确认新路径(如/mnt/data/docker)下tmp子目录权限正确:ls -ld /mnt/data/docker/tmp;错误时手动修复:chmod 1777 /mnt/data/docker/tmp - 若用软链接方式,确保链接目标存在且可写:
ls -l /var/lib/docker→ 应指向有效路径,且stat /mnt/data/docker显示挂载点有足够空间和正确挂载选项(如noatime不影响)
调整K8s节点驱逐阈值与容器启动权限
防止反复驱逐+权限失败循环:
- 编辑kubelet配置(通常为
/var/lib/kubelet/config.yaml或启动参数),降低磁盘驱逐触发点:evictionHard:nodefs.available: "10%"(原默认常为15%) - 对易出问题的Pod(如Harbor、Mongo、Loki),在
securityContext中显式指定用户和/tmp挂载:securityContext:runAsUser: 0runAsGroup: 0fsGroup: 0
并在volumeMounts中挂载emptyDir到/tmp,避免复用宿主机/tmp
长期预防:日志限流 + 定期巡检
从源头控制增长,避免再次触达临界点:
- 全局启用Docker日志轮转(修改
/etc/docker/daemon.json):{"log-driver": "json-file", "log-opts": {"max-size": "50m", "max-file": "3"}}
重启systemctl restart docker(仅对新建容器生效) - 在K8s集群中部署
node-problem-detector或自定义脚本,定时检查df -h | grep -E "(100%|9[5-9]%)".*,告警并自动触发docker system prune -f - 对StatefulSet类应用,强制要求
volumeClaimTemplates声明独立PVC,避免所有Pod共用节点本地磁盘


















