Kubernetes Ingress请求转发规则及Spring Boot接口404问题咨询
请求路径的修改逻辑
你当前的Ingress配置添加了nginx.ingress.kubernetes.io/rewrite-target: /注解,所有匹配前缀路径的请求都会被重写为根路径后转发到后端服务:
- 你发起的请求路径为
/api/helloworld,匹配到path: /api的规则 - Nginx Ingress会将路径重写为
/helloworld后转发给rest-service服务 - 所以Spring Boot收到的请求路径不是原来的
/api/helloworld,也不会调用映射到/api/helloworld的端点
404错误的原因
你的配置存在冲突,具体原因如下:
你在Spring Boot中配置了server.servlet.context-path=/api,意味着Spring Boot所有接口的访问路径都需要加上/api前缀,也就是你写的/helloworld接口实际可访问路径是/api/helloworld。但Ingress转发给Spring Boot的路径是/helloworld,和Spring期望的路径不匹配,因此返回404错误。
解决方案
可以任选以下一种方案调整:
方案1:修改Ingress配置,保留原始路径前缀
直接删除nginx.ingress.kubernetes.io/rewrite-target: /注解,调整后的Ingress配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: smf-ingress spec: rules: - http: paths: - path: /api pathType: Prefix backend: service: name: rest-service port: number: 80 - path: / pathType: Prefix backend: service: name: ng-service port: number: 4200
这种方案下,/api/helloworld请求会原封不动转发给Spring Boot,刚好匹配context-path=/api的配置。
方案2:调整Spring Boot的context-path配置
将Spring Boot配置文件中的server.servlet.context-path=/api改为server.servlet.context-path=/(或者直接删除该配置,默认值就是/),这样Spring Boot接收的路径不需要前缀,Ingress转发的/helloworld就可以正常匹配到对应的接口。
内容的提问来源于stack exchange,提问作者Luca Pasini
相关产品推荐
相关产品推荐

