Kubernetes Pod因ephemeral-storage问题频繁驱逐的监控与配置问询
K8s ephemeral-storage 问题解决方案
一、ephemeral-storage 监控方法
- 命令行快速排查:
执行kubectl describe node <节点名>可查看节点整体临时存储的总容量、已分配容量、剩余可用容量,以及节点上所有Pod的临时存储请求/限制值;
执行kubectl top pod <Pod名> --containers可查看单个容器的实时临时存储用量(前提是集群已部署metrics-server);
执行kubectl exec <Pod名> -- df -h /tmp可直接查看Pod内部临时目录的占用情况。 - 可观测体系监控:
基于Prometheus可以直接采集kubelet_ephemeral_storage_used_bytes(单容器临时存储用量)、node_ephemeral_storage_available_bytes(节点剩余临时存储容量)指标,配置阈值告警:节点临时存储使用率达到70%触发预警,85%触发紧急告警。 - 节点本地排查:
登录问题worker节点,执行du -sh /var/lib/kubelet/pods/<PodUID>/volumes/kubernetes.io~empty-dir/可精准查询指定Pod的emptyDir等临时存储占用。
二、ephemeral-storage 节点存储路径
ephemeral-storage默认占用节点系统盘空间,具体存储路径分三类:
- 容器可写层、镜像层:Docker运行时对应路径为
/var/lib/docker/,Containerd运行时对应路径为/var/lib/containerd/ - Pod临时存储卷(emptyDir等):
/var/lib/kubelet/pods/<Pod的UID>/volumes/kubernetes.io~empty-dir/ - 容器标准输出日志:
/var/log/pods/<Pod命名空间>_<Pod名>_<PodUID>/<容器名>/
如果kubelet配置了自定义--root-dir参数,上述路径会对应迁移到自定义目录下。
三、Docker 按大小触发的logrotate配置
默认logrotate按天轮转,无法应对短时间日志暴增的场景,可按如下配置调整:
- 编辑Docker日志轮转配置文件
/etc/logrotate.d/docker,写入如下内容:
/var/lib/docker/containers/*/*.log { daily size 100M rotate 5 compress missingok notifempty copytruncate dateext dateformat -%Y%m%d-%s create 0644 root root }
核心参数说明:
size 100M:单个日志文件达到100M就触发轮转,可根据业务需求调整阈值rotate 5:最多保留5个历史日志文件,避免占用过多空间copytruncate:先拷贝日志到历史文件再清空原日志,无需重启Docker服务
- 验证配置有效性:执行
logrotate -d /etc/logrotate.d/docker查看调试输出,确认无配置错误 - 调整轮转执行频率:默认logrotate每天执行一次,可新增定时任务缩短检查间隔,比如每10分钟检查一次:
*/10 * * * * root /usr/sbin/logrotate /etc/logrotate.d/docker
四、其他优化建议
- 调整临时存储阈值:当前配置的单容器默认2Gi限制如果无法匹配业务日志/临时文件生成需求,可按需调大LimitRange的默认值,也可以在业务Deployment的resources字段单独配置ephemeral-storage的请求/限制,优先级高于全局LimitRange。
- 避免本地留存业务日志:将业务日志通过sidecar采集或者直接输出到标准输出,统一投递到Loki、ELK等集中日志平台存储,不要长期留存到节点本地。
- 配置kubelet驱逐策略:在kubelet启动参数中新增
--eviction-hard=ephemeral-storage<10%预留10%的节点临时存储空间,避免节点存储被打满;同时配置--eviction-minimum-reclaim=ephemeral-storage=5%,保证每次驱逐至少回收5%的存储空间。 - 独立挂载临时存储目录:如果节点系统盘容量较小,可以将
/var/lib/docker、/var/lib/kubelet目录单独挂载到大容量数据盘,避免系统盘被打满导致节点故障。 - 自动清理无用资源:配置kubelet镜像垃圾回收参数
--image-gc-high-threshold=80、--image-gc-low-threshold=60,当存储使用率达到80%时自动清理无用镜像,降至60%时停止清理。
内容的提问来源于stack exchange,提问作者Anvesh Muppeda
相关产品推荐
相关产品推荐

