Kubernetes Ingress仅根路径可用,如何配置/users路径转发?
问题:Ingress路径重写配置不生效的原因及解决办法
现有配置与正常运行状态
原Ingress配置(ingress.yaml)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: spring-ingress annotations: nginx.ingress.kubernetes.io/enable-cors: "true" nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS, DELETE" nginx.ingress.kubernetes.io/cors-allow-origin: "*" nginx.ingress.kubernetes.io/cors-allow-credentials: "true" nginx.ingress.kubernetes.io/cors-allow-headers: "Content-Type" nginx.ingress.kubernetes.io/rewrite-target: "/" spec: rules: - host: my-project.app.loc http: paths: - path: / pathType: ImplementationSpecific backend: service: name: user-service port: number: 8080
后端Controller代码(UserController.java)
@RestController public class UserController { @GetMapping("/hello1") public String sayHello1() { return "Hello World 1!"; } @GetMapping("/hello2") public String sayHello2() { return "Hello World 2!"; } }
当前配置下,执行curl my-project.app.loc/hello1可以正常返回Hello World 1!。
需求目标
希望执行curl my-project.app.loc/users/hello1时,同样能返回Hello World 1!。
已验证的可行方案
目前找到两种有效方法,均需保持Ingress中的path为/:
- 在
UserController类上添加@RequestMapping("/users")注解 - 在
application.properties中配置server.servlet.context-path=/users
疑问点
网上很多示例仅通过修改Ingress配置path: /users即可实现类似需求,无需改动后端代码或配置文件,但自己尝试后却无效——明明已经配置了rewrite-target注解,想知道其中原因,以及如何仅通过Ingress配置实现需求。
最终解决配置
通过调整Ingress的路径匹配规则和重写目标,解决了问题,修改后的配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: spring-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: rules: - host: my-project.app.loc http: paths: - path: /users/(.*) pathType: ImplementationSpecific backend: service: name: user-service port: number: 8080
配置说明
path: /users/(.*)使用正则表达式匹配所有以/users/开头的路径,括号内的(.*)会捕获/users/之后的所有内容作为第一个分组rewrite-target: /$1将重写后的路径设置为/加上捕获的分组内容,比如请求/users/hello1会被重写为/hello1,刚好匹配后端Controller中的接口路径,从而正常返回结果。
内容的提问来源于stack exchange,提问作者jackdicuori15
相关产品推荐
相关产品推荐

