如何通过Ingress在集群中为多节点上的多主机部署复用单个LoadBalancer
问题1:如何通过Ingress让多节点服务共用一个负载均衡器?
Ingress是Kubernetes中专门统一管理外部访问路由的核心资源,核心逻辑是通过单个Ingress Controller的LoadBalancer Service作为唯一入口,将不同域名/路径的请求转发到集群内对应的后端服务。具体操作步骤:
部署Ingress Controller
选择主流Ingress Controller(比如Nginx Ingress),部署完成后它会自动创建一个LoadBalancer类型的Service,该Service会获取集群提供商分配的公网IP,这就是所有服务的统一访问入口。为每个服务配置Ingress规则
针对每个需要暴露的服务,创建独立的Ingress资源,通过spec.rules.host字段指定唯一域名,指向对应后端的ClusterIPService。所有Ingress规则都会被Ingress Controller识别,流量统一通过同一个LoadBalancer转发。配置域名解析
将所有需要暴露的域名,统一解析到Ingress Controller对应的LoadBalancer公网IP上。
问题2:解决Helm多Release重复创建LoadBalancer的问题
你的问题根源是当前Helm Chart中,每个Release都会创建独立的LoadBalancer Service。要实现共享单个LB,需调整Chart的资源定义:
修改Service类型为ClusterIP
移除Chart中LoadBalancer类型的Service定义,替换为ClusterIP类型——这样每个Release的服务仅在集群内部可见,不会单独申请新的LB资源。在Chart中添加Ingress模板
在Chart的templates目录下新增Ingress模板文件,根据values配置生成对应域名的路由规则。示例模板:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: {{ .Release.Name }}-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: {{ .Values.ingress.host }} http: paths: - path: / pathType: Prefix backend: service: name: {{ .Release.Name }}-service port: number: {{ .Values.service.port }}在values文件中配置Ingress参数
分别在host1-value.yaml和host2-value.yaml中指定各自的域名:# host1-value.yaml service: port: 80 ingress: host: host1.example.com# host2-value.yaml service: port: 80 ingress: host: host2.example.com统一部署Ingress Controller
单独部署一套Ingress Controller(不要包含在业务Chart中),确保它的LoadBalancer是集群内唯一的流量入口。
调整后,每个Helm Release只会创建ClusterIP Service和对应的Ingress规则,所有流量都通过同一个Ingress Controller的LoadBalancer进入,不会重复生成LB资源。
额外注意事项
- 确保Ingress Controller拥有足够的RBAC权限,能读取集群内所有Ingress和Service资源。
- 如果需要HTTPS访问,可以在Ingress资源中配置TLS证书,统一由LoadBalancer处理SSL终止。
- 用
{{ .Release.Name }}作为Service和Ingress名称的前缀,避免多Release之间的资源命名冲突。
内容的提问来源于stack exchange,提问作者gippo

