Kubernetes Deployment访问URL随机出现404 Not Found错误如何排查
问题根因排查方向
1. 多副本流量路由异常(最高概率)
- Deployment配置了多个Pod副本,其中部分Pod的服务没有正确启动,或者对应副本的应用代码没有包含
/healthcheck路由,或者副本启动未完成就被Service纳入端点列表- 排查方式:先执行
kubectl get endpoints <你的service名称>,确认所有端点IP对应的Pod是否处于正常Running状态,再逐个Pod端口转发访问/healthcheck验证是否有部分Pod本身返回404
- 排查方式:先执行
- 没有配置就绪探针(readinessProbe),K8s会把还没完全启动完成的Pod加入Service的负载均衡列表,首次请求打到未就绪的Pod就返回404,后续重试打到已经启动完成的Pod就正常,间隔久请求的时候如果有Pod重建或者重新调度,又会出现这个问题
- 排查方式:查看Deployment的yaml配置,确认是否配置了正确的就绪探针指向
/healthcheck路径
- 排查方式:查看Deployment的yaml配置,确认是否配置了正确的就绪探针指向
2. Ingress路径匹配规则配置错误
- 你配置的Ingress路径规则存在冲突,比如同时配置了前缀匹配和精确匹配的路由,或者路径重写(
rewrite-target)规则配置错误,导致部分请求被转发到错误的服务或者路径上- 例如:你配置了
rewrite-target: /$1但是路径捕获规则写错,导致/healthcheck请求被转发到后端的时候路径被截断或者篡改,变成不存在的路径返回404 - 排查方式:查看Ingress的事件日志
kubectl describe ingress <你的ingress名称>,确认配置没有报错,同时检查Ingress Controller的日志,看404请求的转发路径是否和预期一致
- 例如:你配置了
3. Gunicorn worker进程启动异常
- Gunicorn的worker进程配置有问题,部分worker没有完成加载Flask应用就开始接收请求,或者worker进程存在偶发崩溃重启的情况,重启过程中收到的请求就会返回404
- 排查方式:查看Pod的标准输出日志
kubectl logs <pod名称>,确认Gunicorn启动日志有没有报错,worker进程有没有异常退出的记录
- 排查方式:查看Pod的标准输出日志
4. Service标签选择器配置错误
- Service的
selector字段配置的标签匹配到了集群中其他运行着不同应用的Pod,流量会被负载均衡到其他应用上,其他应用没有/healthcheck路由就返回404- 排查方式:执行
kubectl describe service <你的service名称>确认selector对应的标签,再用kubectl get pods -l <标签键>=<标签值>确认返回的Pod都是你部署的Flask应用的Pod,没有多余的其他Pod
- 排查方式:执行
内容的提问来源于stack exchange,提问作者John Munar
相关产品推荐
相关产品推荐

