多后端服务Ingress配置求助:Ingress-Nginx TLS终止与路径重写失败
正确的Ingress-Nginx配置方案
核心问题分析
你当前的配置存在三个关键问题:
- Ingress规则中的
host字段与TLS配置的主机名不匹配(写成了some-url-here而非some.url.here) - Ingress中引用的Service名称与实际定义的Service名称不匹配(
serviceOnevsservice-one,serviceTwovsservice-two) - Rewrite规则的正则表达式和目标路径配置不正确,无法满足
serviceTwo的路径转发需求
修正后的完整Ingress配置
kind: Ingress metadata: name: rp-some-url-here namespace: reverse-proxy annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: "/$2" nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/backend-protocol: "HTTP" nginx.ingress.kubernetes.io/proxy-ssl-verify: "false" nginx.ingress.kubernetes.io/upstream-vhost: "some.url.here" nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" nginx.ingress.kubernetes.io/proxy-send-timeout: "600" nginx.ingress.kubernetes.io/proxy-read-timeout: "600" nginx.ingress.kubernetes.io/proxy-buffering: "off" spec: tls: - hosts: - some.url.here secretName: my-tls-secret rules: - host: some.url.here http: paths: - backend: service: name: service-one port: number: 80 path: /serviceOne(/|$)(.*) pathType: ImplementationSpecific - backend: service: name: service-two port: number: 8180 path: /serviceTwo(/|$)(.*) pathType: ImplementationSpecific
关键配置说明
- Service名称匹配:将Ingress中
backend.service.name修正为与实际Service定义一致的service-one和service-two,避免服务发现失败。 - Host字段修正:将
spec.rules[0].host改为some.url.here,与TLS配置的主机名保持一致,确保请求能匹配到正确的Ingress规则。 - Rewrite规则配置:
- 启用
use-regex: "true"以支持正则路径匹配 - 使用
/serviceOne(/|$)(.*)作为路径规则:捕获/serviceOne之后的所有内容(包括空路径),通过rewrite-target: "/$2"将请求转发到后端的根路径 - 使用
/serviceTwo(/|$)(.*)作为路径规则:捕获/serviceTwo之后的所有内容,通过rewrite-target: "/someServiceNameHere/$2"将请求转发到后端的/someServiceNameHere/路径(包括后续子路径)
- 启用
- PathType设置:使用
ImplementationSpecific替代Prefix,因为正则路径匹配需要Ingress Controller自行处理路径匹配逻辑。
验证方法
应用配置后,可以通过以下命令查看生成的Nginx配置,确认Rewrite规则是否正确:
kubectl exec -n <ingress-nginx-namespace> <ingress-controller-pod-name> -- cat /etc/nginx/nginx.conf | grep -A 10 -B 5 serviceTwo
内容的提问来源于stack exchange,提问作者Robert Heine
相关产品推荐
相关产品推荐

