Spring Boot在Kubernetes Pod中间歇性返回404问题排查咨询
间歇性404问题排查思路
一、验证Pod内应用的可用性
- 进入目标Pod内部,直接调用本地接口:
重复调用数十次,观察是否会出现404。如果Pod内部调用也出现异常,说明问题出在应用本身;如果内部调用完全正常,再排查外部到Pod的网络转发问题。kubectl exec -it <你的Pod名称> -- curl -v http://localhost:8080/api/v1/addStudents
二、检查应用路由加载的一致性
- 查看Pod内应用启动日志,搜索
Mapped关键字,确认/api/v1/addStudents对应的路由是否每次启动都成功注册。比如日志中应该出现类似:
如果存在启动时路由未注册的情况,排查组件扫描范围:检查Mapped "{[/api/v1/addStudents],methods=[POST]}" onto public com.example.demo.Result com.example.demo.StudentController.addStudents(...)@SpringBootApplication或@ComponentScan的包路径是否覆盖了该控制器所在的包;同时检查控制器类上是否有条件注解(如@ConditionalOnProperty),是否因环境变量配置不一致导致控制器间歇性不加载。
三、排查Pod资源限制与运行状态
- 查看Pod的资源配置与使用情况:
检查kubectl describe pod <你的Pod名称>Resources字段的Limits和Requests是否合理,是否存在CPU/内存不足导致应用卡顿的情况;同时查看Events列表,确认是否有OOMKilled、重启等异常记录——若Pod频繁重启,重启过程中的请求会返回404。 - 监控Pod内应用的资源占用:使用
kubectl top pod <你的Pod名称>实时查看CPU和内存使用率,确认是否在出现404时资源占用异常飙升。
四、对比请求的差异
- 收集出现404时的请求详情,包括HTTP方法、请求头(尤其是
Content-Type、Accept)、请求参数,与正常请求做对比:- 若控制器方法限定了HTTP方法(如
@PostMapping),但部分请求用了错误的方法(如GET),会返回404; - 若控制器方法依赖
@RequestBody,但请求未携带Content-Type: application/json头部,可能因无法匹配到方法而返回404(通常应为415,但部分场景下会出现404)。
- 若控制器方法限定了HTTP方法(如
五、排查应用内部异常
- 当出现404时,抓取应用的线程栈:
分析线程栈中是否有阻塞在路由匹配、类加载等环节的线程,排查是否存在类加载冲突或线程池耗尽的情况。# 先获取应用进程ID kubectl exec <你的Pod名称> -- jps # 抓取线程栈 kubectl exec <你的Pod名称> -- jstack <进程ID> > thread_dump.txt - 检查应用依赖:确认K8s环境下的依赖包与本地是否一致,尤其是Spring Boot相关依赖,排除因依赖冲突导致的路由注册异常。
六、排查K8s网络转发问题
- 若Pod内部调用正常,外部调用出现间歇性404,检查服务的转发配置:
- 若使用ClusterIP/NodePort服务,查看kube-proxy的日志,确认是否存在转发规则异常或丢包情况;
- 检查是否有网络策略限制了部分请求流量到达Pod,导致请求无法被应用处理。
内容的提问来源于stack exchange,提问作者Siva
相关产品推荐
相关产品推荐

