Kubernetes中Ingress控制器能否实现内部负载均衡?
Kubernetes Ingress 内部负载均衡的可行性与自建集群部署指南
核心结论
你的思路完全可行:仅依靠Ingress控制器就能实现集群内部的负载均衡,无需对接云厂商的外部负载均衡器。云环境中的“两层负载”是对外暴露服务的场景需求,并非Ingress的必要依赖。
概念澄清
首先纠正两个容易混淆的点:
- Ingress ≠ 负载均衡器:Ingress只是K8s的API资源,用来定义HTTP/HTTPS路由规则;真正实现负载转发逻辑的是Ingress控制器(比如Nginx、HAProxy的Ingress实现)。
- 云环境的“两层负载”是对外暴露的方案:云厂商的外部LB负责将公网流量分发到集群节点,Ingress控制器负责将节点流量转发到后端Pod。但内部负载场景下,完全可以跳过外部LB这一层。
自建集群(如Vagrant)实现Ingress内部负载的两种方式
1. ClusterIP模式(仅集群内部可访问)
将Ingress控制器的Service设置为ClusterIP类型,此时只有集群内的Pod或节点能通过ClusterIP访问Ingress控制器,实现纯内部的七层负载均衡:
- 部署Nginx Ingress控制器时指定Service类型:
helm install nginx-ingress ingress-nginx/ingress-nginx --set service.type=ClusterIP - 集群内的Pod可以直接通过Ingress控制器的ClusterIP访问,或者通过Ingress规则中定义的域名(需配置集群内部DNS)访问。
2. NodePort模式(集群节点外部可访问,无需公网LB)
如果需要从Vagrant虚拟机外部(比如你的本地主机)测试Ingress的负载规则,可以将Ingress控制器的Service设置为NodePort类型:
- 部署命令:
helm install nginx-ingress ingress-nginx/ingress-nginx --set service.type=NodePort - 查看分配的NodePort端口:
输出会显示类似kubectl get svc nginx-ingress-ingress-nginx-controller30080:80/TCP的端口映射,此时用任意Vagrant节点的IP+30080端口,就能访问Ingress规则对应的后端服务。
解决你遇到的「Ingress无外部IP」问题
在自建集群(如Vagrant)中,LoadBalancer类型的Service默认不会自动分配外部IP——这个功能是云厂商通过自身的LB组件实现的,自建集群没有对应的基础设施支持。所以你需要:
- 卸载现有配置错误的Ingress控制器:
helm uninstall nginx-ingress - 重新部署时指定
service.type=NodePort或service.type=ClusterIP,就能避免“无外部IP”的问题。
补充:内部负载均衡的完整链路
当你用Ingress控制器做内部负载时,流量链路是:集群内客户端/节点 → Ingress控制器(七层路由+负载) → 后端Service(四层Pod负载) → 目标Pod
这个链路完全不需要外部负载均衡器,就能实现Pod间的负载分发。
内容的提问来源于stack exchange,提问作者Inês Gomes
相关产品推荐
相关产品推荐

