使用nginx-ingress能否将域名直接路由到后端服务路径?
Nginx Ingress 域名路由到后端指定路径的正确配置方法
你遇到的错误是因为Kubernetes Networking v1版本的Ingress API规范中,backend.service字段下根本不存在path这个配置项,所以API服务器校验时直接报错了。
要实现域名根路径映射到后端服务的指定路径,得用Nginx Ingress Controller提供的路径重写注解,具体配置方式如下:
方式1:分两个Ingress对象(逻辑更清晰)
针对两个域名分别创建Ingress,每个单独配置重写规则:
foo.example.com 的Ingress配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: foo-service-ingress annotations: # 开启正则匹配,用于传递子路径 nginx.ingress.kubernetes.io/use-regex: "true" # 重写目标路径,$1对应捕获到的子路径内容 nginx.ingress.kubernetes.io/rewrite-target: /myapp/gui/$1 spec: rules: - host: foo.example.com http: paths: - path: /(.*) pathType: ImplementationSpecific backend: service: name: my-service port: name: http
bar.example.com 的Ingress配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: bar-service-ingress annotations: nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/rewrite-target: /different/path/here/$1 spec: rules: - host: bar.example.com http: paths: - path: /(.*) pathType: ImplementationSpecific backend: service: name: my-service port: name: http
方式2:单个Ingress对象统一配置
如果想把两个域名的规则写到同一个Ingress里,可以用nginx.ingress.kubernetes.io/server-snippet注解自定义Nginx原生配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: multi-host-ingress annotations: nginx.ingress.kubernetes.io/server-snippet: | server { listen 80; server_name foo.example.com; location / { proxy_pass http://my-service.default.svc.cluster.local/myapp/gui/; proxy_set_header Host $host; } } server { listen 80; server_name bar.example.com; location / { proxy_pass http://my-service.default.svc.cluster.local/different/path/here/; proxy_set_header Host $host; } } spec: ingressClassName: nginx
关键说明
- 如果不需要传递子路径(仅映射根路径
/到后端指定路径),可以简化配置:去掉use-regex注解,将path设为/,rewrite-target直接写目标路径(比如/myapp/gui/)。 - 确保集群已正确部署Nginx Ingress Controller,且Ingress对象指定了正确的
ingressClassName: nginx(若集群存在多个Ingress Controller)。
内容的提问来源于stack exchange,提问作者romosa
相关产品推荐
相关产品推荐

