AKS中Nginx Ingress Controller路由异常排查求助
问题排查与解决方案
核心问题
你的Ingress配置存在URL重写规则与路径不匹配的问题,导致请求未正确转发到Spring Boot应用:
- 你配置了
nginx.ingress.kubernetes.io/rewrite-target: /$2,但对应的path是/,没有定义正则捕获组,$2会被解析为空字符串,最终请求被转发到Spring Boot的根路径/,而非你实际请求的/api/product/products。 - Ingress日志有记录但Spring Pod无请求日志,是因为Nginx根据错误的重写规则转发到了不存在的路径,直接返回了404,或者转发的路径未被Spring Boot的控制器处理,且日志级别未开启调试导致没记录。
修复步骤
1. 修正Ingress配置
根据你的API路径,调整Ingress配置,移除错误的重写规则,或配置正确的捕获组:
方案一:移除不必要的重写规则(推荐)
如果不需要修改请求路径,直接删除rewrite-target注释,让请求原样转发:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: cert-manager.io/cluster.issuer: letsencrypt-staging kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/ssl-redirect: "false" generation: 2 name: aks-helloworld spec: ingressClassName: nginx rules: - http: paths: - backend: service: name: springboot-service port: number: 80 path: / pathType: Prefix
方案二:配置正确的重写规则(如果需要URL重写)
如果要将/api/*的请求重写为/*转发到后端,可调整path和重写规则:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: cert-manager.io/cluster.issuer: letsencrypt-staging kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: /$1 nginx.ingress.kubernetes.io/ssl-redirect: "false" generation: 2 name: aks-helloworld spec: ingressClassName: nginx rules: - http: paths: - backend: service: name: springboot-service port: number: 80 path: /api/(.*) pathType: Prefix
此时访问http://<public-ip>/api/product/products会被重写为/product/products转发到后端,需确保Spring Boot的控制器路径匹配(比如将@RequestMapping(path = "api/product")改为@RequestMapping(path = "product"))。
2. 应用配置并验证
执行命令更新Ingress:
kubectl apply -f <你的Ingress配置文件名>.yaml
等待1-2分钟后,再次访问http://<public-ip>/api/product/products测试。
3. 额外排查动作
- 检查Nginx转发规则:进入Ingress Controller Pod,查看
/etc/nginx/nginx.conf,确认转发路径是否正确:kubectl exec -it <nginx-ingress-pod-name> -n <ingress-namespace> -- cat /etc/nginx/nginx.conf - 开启Spring Boot调试日志:在Deployment的环境变量中添加
LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG,重启Pod后查看请求日志,确认请求是否到达后端。 - 测试集群内Service连通性:在集群内任意Pod中执行
curl http://springboot-service/api/product/products,验证Service是否能正确转发请求到Spring Boot应用。
为什么aks-helloworld能正常访问?
教程中的镜像在根路径/有响应接口,而你的Spring Boot应用根路径/没有对应的控制器,所以当Ingress错误转发到/时,aks-helloworld能返回内容,你的应用则返回404。
内容的提问来源于stack exchange,提问作者Feldmarshall
相关产品推荐
相关产品推荐

