Kubernetes Nginx Ingress返回404但后端服务正常的问题求助
解决Kubernetes Nginx Ingress返回404的排查步骤
1. 检查路径转发与后端路由的匹配性
当配置pathType: Prefix时,Nginx会将**完整请求路径(包括/posts)**转发给后端服务。如果你的query-srv服务仅监听根路径/而非/posts,就会返回404。
两种解决方式:
- 调整后端服务的路由逻辑,支持
/posts前缀的请求 - 添加Ingress路径重写注解,转发时去掉
/posts前缀:
修改Ingress配置的metadata.annotations和path字段:metadata: name: ingress-serv annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: rules: - host: posts.com http: paths: - path: /posts(/|$)(.*) pathType: Prefix backend: service: name: query-srv port: number: 4002
2. 验证Ingress资源的生效状态
执行命令查看Ingress的规则和事件:
kubectl describe ingress ingress-serv
重点检查Rules部分是否与配置一致,Events中是否存在服务找不到、端口不匹配等报错信息。
3. 测试Ingress Controller到后端服务的连通性
进入Nginx Ingress Controller的Pod,直接访问后端服务的ClusterIP验证:
# 获取Ingress Controller Pod名称 kubectl get pods -n ingress-nginx # 进入Pod kubectl exec -it <ingress-controller-pod-name> -n ingress-nginx -- /bin/bash # 访问后端服务的目标路径 curl 10.97.137.162:4002/posts
如果这里返回404,说明后端服务本身不处理/posts路径;如果返回正常,问题出在Ingress的路径转发配置。
4. 确认本地DNS/hosts配置正确性
确保本地机器已将posts.com指向Kubernetes集群Ingress Controller的外部访问地址:
- 若用NodePort,指向集群节点IP+NodePort端口
- 若用LoadBalancer,指向负载均衡IP
执行curl -v posts.com/posts,确认请求确实发往了正确的地址。
5. 查看Ingress Controller日志定位问题
查看Nginx Ingress Controller的日志,可获取请求转发的详细信息:
kubectl logs -n ingress-nginx <ingress-controller-pod-name>
日志中会显示请求路径、转发的后端地址及返回状态码,帮助快速定位404的根源。
内容的提问来源于stack exchange,提问作者Narayan Acharya
相关产品推荐
相关产品推荐

