K8s Nginx Ingress下多域名CNAME映射至单域名不同路径实现方法
需求可行性结论
该需求完全可实现,依托已部署的Nginx Ingress原生路由、路径重写能力即可完成配置,不需要修改商城后端的业务代码。
具体配置步骤
1. 客户侧DNS解析配置
通知两位客户分别为自有域名添加CNAME解析记录:
- 客户1将
www.customer1.com的CNAME指向Nginx Ingress的对外负载均衡地址,直接CNAME到已正常解析的shop.mycompany.com也可 - 客户2将
www.customer2.com的CNAME指向上述相同的Ingress入口地址
2. K8s侧Nginx Ingress规则配置
核心逻辑是:识别请求携带的Host头为客户自有域名时,自动将请求路径重写为对应客户编号的前缀路径,再转发给后端商城服务,全程对访问用户透明。
假设商城后端Service名称为mall-svc,服务端口为80,Ingress配置示例如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: mall-custom-domain-ingress annotations: kubernetes.io/ingress.class: "nginx" # 路径重写规则,将捕获的路径段拼接为后端需要的带客户前缀的路径 nginx.ingress.kubernetes.io/rewrite-target: /$2 # 可选配置:自动替换后端返回的跳转地址,避免跳转到原shop.mycompany.com域名 nginx.ingress.kubernetes.io/proxy-redirect-from: "~*^https?://shop.mycompany.com/(customer[0-9]+)/(.*)$" nginx.ingress.kubernetes.io/proxy-redirect-to: "/$2" spec: # 可选:如果需要为客户自有域名配置HTTPS,添加以下tls段,提前将两个域名的证书存入名为mall-custom-domain-tls的Secret即可 # tls: # - hosts: # - www.customer1.com # - www.customer2.com # secretName: mall-custom-domain-tls rules: # 客户1专属域名路由规则 - host: www.customer1.com http: paths: - path: /(customer1/|)(.*) pathType: ImplementationSpecific backend: service: name: mall-svc port: number: 80 # 客户2专属域名路由规则 - host: www.customer2.com http: paths: - path: /(customer2/|)(.*) pathType: ImplementationSpecific backend: service: name: mall-svc port: number: 80
配置关键点说明
rewrite-target: /$2配合path中的正则捕获组:用户访问www.customer1.com/xxx时,后端服务实际收到的请求路径为/customer1/xxx,完全兼容原有商城的路径路由规则- path正则
/(customer1/|)(.*)同时兼容原有访问逻辑:不会影响shop.mycompany.com/customer1路径的正常访问,新旧访问方式可并行生效 proxy-redirect为可选优化项:解决后端服务返回3xx跳转时Location头携带原商城地址的问题,保证用户全程停留在自有域名下,不会跳转到shop.mycompany.com
3. 生效验证
- 应用上述Ingress配置后,执行
kubectl describe ingress mall-custom-domain-ingress,确认规则已被Nginx Ingress控制器正常同步 - 等待客户侧DNS解析生效后,分别访问两个客户自有域名,确认可正常打开对应客户的专属商城
- 测试商城内页面跳转、静态资源加载、下单等核心流程,确认无路径报错、无跳转到原域名的问题即可
内容的提问来源于stack exchange,提问作者user1167253
相关产品推荐
相关产品推荐

