K8s部署应用访问REST端点返回404错误问题排查
Kubernetes Nginx Ingress 场景下POST接口返回404排查方案
核心排查原则
你反复调整后端Ingress路径规则始终无效,首先要跳出「路径匹配错误」的思维定式:GraphQL接口正常访问已经证明/前缀的转发规则是生效的,不需要再反复修改path配置。先定位404的返回来源,再针对性修复。
第一步:定位404响应的来源
打开浏览器开发者工具,找到报错的POST请求,查看响应头的Server字段:
- 如果值为
nginx,说明请求在Ingress层被拦截,未转发到后端服务 - 如果值为
quarkus/vert.x,说明请求已经到达后端,是后端服务自身返回的404
同时检查报错请求的完整URL,确认域名是后端服务的backend.exemple.com还是前端服务的bilels.exemple.com,80%的前后端分离部署404问题都是接口路径写错导致的。
场景1:请求发到了前端域名,被前端静态服务返回404
问题特征
报错POST请求的域名是bilels.exemple.com,GraphQL接口正常是因为代码里写死了后端域名,获取token的REST接口用了相对路径,请求被转发到Angular前端服务。Angular是单页静态应用,只处理静态资源和前端路由,对于POST类接口请求会直接返回404。
修复方案
二选一即可:
- 前端代码修复:统一所有后端接口的请求baseUrl为
https://backend.exemple.com,确保所有接口请求直接发往后端域名,不经过前端Ingress。 - 前端Ingress路由分流:修改前端Ingress配置,将后端接口路径的请求转发到后端服务,静态资源请求转发到前端服务,注意长路径规则必须放在
/规则前面,避免被前缀匹配优先拦截,配置参考:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: mcs-thirdparty-ingress namespace: namespace annotations: nginx.ingress.kubernetes.io/use-regex: "true" spec: ingressClassName: nginx-internal rules: - host: bilels.exemple.com http: paths: # 替换成你实际的后端接口前缀,比如/auth、/api等 - path: /(graphql|auth|api)(.*) backend: service: name: mcs-thirdparty-backend port: number: 8080 pathType: Prefix - path: / backend: service: name: mcs-thirdparty-frontend port: number: 80 pathType: Prefix
场景2:请求到达后端Quarkus服务,后端返回404
先在集群内跳过Ingress直接测试后端接口,排除Ingress影响:
# 临时启动curl测试Pod kubectl run curltest --image=curlimages/curl -it --rm -- sh # 在Pod内直接访问后端Service,替换为实际的token接口路径 curl -X POST http://mcs-thirdparty-backend:8080/你的token接口路径 -v
如果上述命令返回404,直接排查后端配置,常见原因:
- HTTP方法不匹配:检查接口注解配置,部分Quarkus RESTEasy版本对仅允许GET的接口,收到POST请求时会返回404而非标准的405状态码。可以同时用GET方法请求同一路径验证,如果GET正常POST 404,直接给接口加上
@POST注解即可。 - 上下文根配置不一致:检查Quarkus配置文件
application.properties,如果配置了quarkus.http.root-path或quarkus.resteasy-reactive.path,所有REST接口会增加统一前缀,而GraphQL如果单独配置了路径则不受影响,导致你请求的路径和后端实际暴露的路径不匹配。 - CORS配置拦截:部分Quarkus版本对跨域配置不合法的请求会直接返回404,而非标准的CORS跨域错误。确保配置中允许前端域名跨域,参考配置:
quarkus.http.cors.origins=https://bilels.exemple.com quarkus.http.cors.methods=GET,POST,PUT,DELETE,OPTIONS quarkus.http.cors.headers=accept,authorization,content-type,x-requested-with
之前调整path配置无效的原因
你之前尝试的/(.*)、/*、/response等path配置,要么没有配合nginx.ingress.kubernetes.io/rewrite-target注解做路径重写,导致转发到后端的路径和接口实际路径不匹配;要么本身/前缀规则已经可以覆盖所有请求,修改path完全没有必要。
内容的提问来源于stack exchange,提问作者Bilel-NEJI
相关产品推荐
相关产品推荐

