💬
近期在测试环境中遇到某个微服务频繁重启的问题,最终排查发现是由于k8s节点的 ephemeral-storage 资源不足被系统驱逐。
 

🕵️ 异常现象与初步排查

 
notion image
通过 Rancher 查看微服务状态时,发现该服务所在的 Pod 被频繁重启。
为了进一步定位问题,使用如下命令查看 Pod 详细信息:
实际返回信息如下(重点内容已摘录):
主容器状态:
可以看到:
  • Pod 被驱逐(Evicted)
  • 驱逐原因是 节点的临时存储空间不足
  • 容器的退出码为 137,说明是系统强制终止(SIGKILL)
这表明问题并非出在服务本身,而是底层资源调度层面。
 

💡 什么是 ephemeral-storage

ephemeral-storage 是 k8s 中的短期本地磁盘资源,与 Pod 生命周期绑定,Pod 一旦终止,其中的 ephemeral-storage 数据也会被清理。它常被用于:
使用方式
是否占用 ephemeral-storage
说明
emptyDir
✅ 是
Pod 生命周期内的数据存储
容器日志(stdout/stderr)
✅ 是
容器日志默认写入本地磁盘
/tmp/var/log
✅ 是
临时文件、缓存、日志等
容器内操作如下载文件、缓存
✅ 是
例如 wget、Java agent dump
 

🔍 进一步排查:是日志撑爆了节点磁盘

经过排查发现,导致节点存储空间耗尽的元凶是该服务在 /var/logs 中持续写入大量日志文件,最终触发 kubelet 的资源回收机制。
kubelet 默认会根据如下设置执行驱逐操作:
也就是说,当节点可用磁盘空间小于 10% 时,就会主动驱逐 Pod 来释放资源。
 

🧨 为什么会触发 Evicted?

在 k8s 中,每个节点的 kubelet 会持续监控 CPU、内存、磁盘等资源使用。当系统检测到 磁盘资源紧张 时:
  • 会驱逐部分 Pod,释放资源
  • 被驱逐的 Pod 状态会标记为 Evicted
  • 这种驱逐机制属于 k8s 的资源保护行为
触发驱逐的典型消息如下:
 

❗ Exit Code 137 是什么?

Exit Code: 137 表示容器收到了 SIGKILL 信号,通常有以下几种可能:
  • 容器 内存不足(OOM)
  • 节点 资源紧张被系统强制回收
  • 磁盘压力导致系统回收 ephemeral-storage
本案例符合第三种情况。
 

🧽 被驱逐 Pod 的资源会自动回收吗?

k8s 会在 Pod 被驱逐后自动执行资源清理:
  1. 删除容器的临时存储(包括 emptyDir、容器层文件系统、日志等)
  1. 回收对应节点的磁盘空间
这也是为什么节点在一段时间后“恢复正常”,磁盘资源回落到合理区间。
 

⚙️ 怎么为 Pod 配置 ephemeral-storage 资源限制

k8s 默认不强制设置 ephemeral-storage,需要手动添加。例如:
 
建议特别关注以下几类 Pod,它们通常容易产生大量临时文件:
  • 使用 emptyDir 卷或访问 /tmp
  • 容器内主动写入日志(如日志未打入 ELK)
  • Java Agent(如 SecPoint.jar)可能生成大量临时日志或 dump 文件
 

🧠 延伸:Kubernetes 的 Pod 驱逐优先级

Kubernetes 决定驱逐哪个 Pod 时,会依据以下几个因素:
优先级因素
描述
PodPriority
明确设置的优先级值,值越低越容易被驱逐
QoS Class
BestEffort > Burstable > Guaranteed,优先驱逐低保障级别 Pod
实际资源占用
占用资源多的 Pod 更可能被选中驱逐
驱逐策略配置
kubelet 的驱逐参数设置决定触发条件
示例 kubectl get priorityclasses 返回:

✅ 总结

微服务被频繁重启,可能并不是代码或服务异常,而是资源调度问题。
通过本次问题复盘,我们得出以下关键结论:
  • Pod Evicted 通常源于节点资源(如 ephemeral-storage)不足
  • 没有为 Pod 设置资源 requests/limits 是风险隐患
  • 合理配置资源配额 + 监控机制,才能保障系统稳定运行
 
如果你也遇到类似现象,建议立刻排查节点磁盘资源情况,检查 Pod 是否未设置临时存储配额,并从配置层面进行修复与预防。
 
 
SUNSPEC IEEE2030.5/CSIP认证-COMM-003、COMM-004 解读Java 线程中的守护线程标志位
Loading...