概述
一套跑在 K8s 上的 MES 系统里,辅助服务 Pod mes-app-assist 频繁重启:kubectl describe pod 显示容器因 Liveness 存活探针连续失败,被 kubelet 强行终止(退出码 137 / SIGKILL)。
- 故障现象:Pod 反复重启,退出码 137 初看像 OOMKilled,但事件日志明确写着
Liveness probe failed; - 根因:外部接入层 Nginx 所在宿主机的文件描述符上限(
nofile)过低——worker 进程软限制仅 1024。并发连接持续累积后,Nginx 报24: Too many open files,既无法建立到后端 NodePort 的 socket 连接,连返回错误页50x.html的文件句柄都拿不到,经它转发的请求只能以 HTTP 500 或超时收场; - 误杀机制:该 Pod 的 Liveness 探针被配置成跨节点探测外部 Nginx 反代地址——外部网关句柄耗尽,被 kubelet 误判为容器死亡,实际健康的后端容器被误杀重启。外部故障沿着探针链路反向传导进了 K8s 内部。