Azure K8s中Nginx Ingress下Swagger UI路由错误致API调用404问题咨询
问题根源
原有Ingress仅配置了/swagger路径的转发规则,完全没有覆盖/api/*开头的API请求,这类请求无法匹配到任何Ingress规则,因此直接返回404。
另外存在域名配置不一致的隐患:Ingress绑定的host是api-swagger.azure.com,但测试curl命令使用的是api-swagger.cloudapp.azure.com,域名不匹配也会导致请求不命中当前Ingress规则。
修复步骤
1. 补全Ingress路径转发规则
由于Swagger界面和API接口都部署在同一个后端服务development-manager中,需要在Ingress的paths列表下新增/api前缀的转发规则,同样指向该后端服务,保证所有API请求能命中转发逻辑。
如果使用的K8s版本≥1.19,建议显式指定pathType: Prefix避免路径匹配逻辑歧义。
补全后的基础配置如下:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: basic-ingress namespace: default annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/ssl-redirect: "false" spec: rules: # 改成你实际访问的域名,需和curl命令的域名保持一致 - host: api-swagger.cloudapp.azure.com http: paths: # 保留原有Swagger路径规则 - path: /swagger backend: serviceName: development-manager servicePort: 80 # 新增API路径规则 - path: /api backend: serviceName: development-manager servicePort: 80
2. 按需配置路径重写(仅特定场景需要)
如果你的ASP.NET Core后端服务本身的路由不带/api前缀(比如后端实际接口路径为/v1/DevelopmentManager/batches),才需要配置路径重写,把请求的/api前缀剥离后再转发:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: basic-ingress namespace: default annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/ssl-redirect: "false" # 新增重写注解 nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: rules: - host: api-swagger.cloudapp.azure.com http: paths: - path: /swagger backend: serviceName: development-manager servicePort: 80 # 路径增加捕获组,匹配/api下的所有路径 - path: /api/(.*) backend: serviceName: development-manager servicePort: 80
注意:如果后端服务本身的路由已经包含
/api前缀(比如直接访问后端Pod时需要请求/api/v1/xxx才能通),不需要配置任何重写规则,使用第一步的基础配置即可。
3. 验证配置生效
配置修改后执行kubectl apply -f <你的ingress配置文件>更新规则,再用kubectl describe ingress basic-ingress确认规则和域名配置正确,重新执行curl测试即可正常转发请求。
内容的提问来源于stack exchange,提问作者ikenahim

