配置K8s Ingress路径转发后无法访问Pod REST端点如何解决?
问题根因
当前Ingress的重写规则配置错误,请求转发到后端时的路径与API实际暴露的路径不匹配。
现有配置中rewrite-target固定写为/,配合/tplm前缀匹配时,访问/tplm/acquire这类子路径请求,转发到后端后会出现双斜杠路径//acquire,后端REST框架无法识别该路径,因此两个接口均无法正常访问,仅能访问根路径连通Pod。
修复配置
将Ingress配置修改为以下内容,通过正则捕获组正确截取转发路径:
kind: Ingress metadata: name: iesd-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: isos.iesd.pt http: paths: - path: /tplm(/|$)(.*) pathType: ImplementationSpecific backend: service: name: lockmanager-service port: number: 9002
配置说明
- 路径规则
/tplm(/|$)(.*)为正则匹配:- 第一组
(/|$)匹配/tplm后的斜杠或路径结尾,避免/tplmtest这类不符合预期的路径被误转发 - 第二组
(.*)捕获/tplm/后的所有路径片段
- 第一组
- 重写规则
rewrite-target: /$2会将捕获到的有效路径拼接到根路径转发给后端:- 请求
/tplm/acquire→ 后端收到路径/acquire,正确匹配对应接口 - 请求
/tplm/release→ 后端收到路径/release,正确匹配对应接口 - 请求
/tplm→ 后端收到路径/,可正常连通服务
- 请求
补充排查项
配置更新后如果仍有访问异常,依次核对以下配置:
- 确认
lockmanager-service的9002端口与后端Pod实际监听端口一致,Pod内的REST服务绑定地址为0.0.0.0而非127.0.0.1 - 确认nginx-ingress-controller运行正常,无配置加载失败的报错日志
- 确认集群内网络策略已放行ingress控制器到后端Pod 9002端口的访问流量
内容的提问来源于stack exchange,提问作者Luis Guerra
相关产品推荐
相关产品推荐

