You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:54:54