如何使用Kubernetes Ingress访问多服务并复用单个LoadBalancer
问题解答
可行性结论
完全可以通过Ingress实现该需求,这也是多租户K8s集群统一暴露服务的标准实践,仅需1个LoadBalancer即可承载所有客户的访问流量,可大幅降低资源消耗和运维成本。
核心实现原理
你只需要在集群中部署一套Ingress Controller(常用的如Nginx Ingress Controller),为该Ingress Controller分配唯一的LoadBalancer,所有外部访问流量都会先经过这个LB进入Ingress Controller,再由Controller根据预设的路由规则转发到对应客户Namespace下的前端/后端服务。
你可以根据业务需求选择两种路由规则配置方案:
- 基于子域名的路由:为每个客户分配独立的子域名,例如
tenant1.example.com、tenant2.example.com,Ingress规则匹配到对应子域名后,直接转发到对应Namespace下的front-end Service;如果需要暴露后端接口,可额外配置路径规则,将*/api/*前缀的请求转发到同Namespace下的back-end Service。 - 基于路径前缀的路由:如果不想申请大量子域名,可通过路径前缀区分客户,例如
/tenant1/*的请求转发到租户1的前端服务,/tenant1/api/*的请求转发到租户1的后端服务,配合Ingress的重写注解去掉前缀后再转发到后端服务即可。
关键注意事项
- 规则管理:你可以选择在每个客户的Namespace下单独创建该租户的Ingress规则,Ingress Controller会默认自动识别全集群所有Namespace下的Ingress资源,无需额外配置。
- 租户隔离:如果需要避免租户间的配置冲突,可以开启Ingress Controller的租户隔离参数,限制每个Namespace下的Ingress规则仅能引用本Namespace内的Service资源。
- 容量扩展:后续客户量级增长后,可直接对Ingress Controller做水平扩容,前端的单个LoadBalancer会自动将流量负载到多个Ingress Controller实例上,不需要新增LB资源。
配置示例(Nginx Ingress Controller)
以下是租户Namespace tenant-a 下的Ingress配置样例,基于子域名路由,同时适配前端和后端服务的转发:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tenant-a-ingress namespace: tenant-a annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: rules: - host: tenant-a.yourdomain.com http: paths: - path: /(.*) pathType: Prefix backend: service: name: front-end-svc port: number: 80 - path: /api/(.*) pathType: Prefix backend: service: name: back-end-svc port: number: 8080
所有租户都按上述格式在自己的Namespace下创建Ingress资源即可,全程共用1个LoadBalancer资源。
内容的提问来源于stack exchange,提问作者Dusty
相关产品推荐
相关产品推荐

