如何为Nginx Ingress配置带通配符子域名的上游虚拟主机
基于Ingress-Nginx实现通配符域名到对应上游服务的代理
方案一:通配符自动映射(动态匹配)
通过Ingress-Nginx的server-snippet注解,利用Nginx变量和正则表达式实现下游域名到上游域名的动态替换,无需为每个域名单独配置Ingress。
步骤1:创建Dummy Service
Ingress要求必须指定后端服务,因此需要创建一个占位用的ClusterIP Service:
apiVersion: v1 kind: Service metadata: name: dummy-proxy-service spec: type: ClusterIP ports: - port: 80 targetPort: 80
步骤2:创建通配符Ingress
这个Ingress会匹配所有*.downstream.example.com请求,并自动将其路由到对应的*.upstream.example.com上游:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: wildcard-downstream-proxy annotations: nginx.ingress.kubernetes.io/server-snippet: | # 提取下游域名的前缀部分,映射到上游域名 if ($host ~* ^(?<service_prefix>[a-z0-9-]+)\.downstream\.example\.com$) { set $upstream_host "${service_prefix}.upstream.example.com"; set $upstream_target "http://${upstream_host}"; } # 代理到动态生成的上游地址 proxy_pass $upstream_target; # 设置正确的Host头传递给上游服务 proxy_set_header Host $upstream_host; # 若上游使用HTTPS,替换为https://并添加以下注解 # nginx.ingress.kubernetes.io/proxy-ssl-verify: "false" nginx.ingress.kubernetes.io/ssl-redirect: "false" spec: ingressClassName: nginx rules: - host: "*.downstream.example.com" http: paths: - path: / pathType: Prefix backend: service: name: dummy-proxy-service port: number: 80
注意事项
- 正则表达式需匹配你的域名格式,确保能正确提取前缀(示例仅匹配小写字母、数字和连字符)
- 若上游服务启用HTTPS,需将
$upstream_target改为https://${upstream_host},并根据需求配置SSL验证 - 确保Ingress-Nginx控制器允许使用
server-snippet注解(默认开启,若有安全限制需调整控制器配置)
方案二:单个域名单独配置Ingress(兼容原有upstream-vhost用法)
如果动态配置方案不可行,可直接为每个下游域名创建独立Ingress对象,这种方式更直观,便于调试和权限管控。
示例:为httpbin.downstream.example.com创建Ingress
- 先创建指向上游服务的ExternalName Service:
apiVersion: v1 kind: Service metadata: name: httpbin-upstream spec: type: ExternalName externalName: httpbin.upstream.example.com
- 对应的Ingress配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: httpbin-downstream-proxy annotations: nginx.ingress.kubernetes.io/upstream-vhost: "httpbin.upstream.example.com" nginx.ingress.kubernetes.io/ssl-redirect: "false" spec: ingressClassName: nginx rules: - host: "httpbin.downstream.example.com" http: paths: - path: / pathType: Prefix backend: service: name: httpbin-upstream port: number: 80
重复上述步骤,为httpbin2.downstream.example.com等其他域名创建对应的Service和Ingress即可。
方案选择建议
- 当需要频繁新增下游域名时,优先选择通配符自动映射方案,减少重复配置
- 若域名数量较少、需要精细化控制每个路由的配置(如SSL证书、限流规则),则使用单个Ingress方案更合适
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

