Kubernetes:LoadBalancer与Ingress——集群对外暴露IP是哪一个?
问题:Kubernetes Service配置中哪个IP暴露到集群外部?
用户提问:
将以下是一段Kubernetes的Service配置代码,请问哪个IP会暴露到Kubernetes集群外部?是78.11.24.19还是146.148.47.155?我希望理解此处LoadBalancer和Ingress的相关机制。
Service配置代码:
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376 clusterIP: 10.0.171.239 loadBalancerIP: 78.11.24.19 type: LoadBalancer status: loadBalancer: ingress: - ip: 146.148.47.155
解答
首先直接给出结论:暴露到Kubernetes集群外部的是146.148.47.155。下面我会详细拆解两个IP的作用,以及相关的LoadBalancer和Ingress机制:
1. 两个IP的核心区别
spec.loadBalancerIP: 78.11.24.19:这是你手动指定的「期望负载均衡器IP」,本质是向云服务商发起的一个“预约请求”。它能否生效完全依赖云服务商的支持:- 如果你的云服务商允许预留/指定公网IP,且这个IP是你预先预留的可用地址,那么最终生效的IP会和这个值一致;
- 如果云服务商不支持该功能,或者这个IP已被占用,云服务商就会自动分配一个可用的公网IP,也就是配置里的146.148.47.155。
status.loadBalancer.ingress.ip: 146.148.47.155:这是实际生效的外部访问IP,是Kubernetes从云服务商处获取到的、已经绑定到负载均衡器的真实公网地址。所有外部用户要访问你的服务,都需要通过这个IP发起请求。
2. LoadBalancer类型Service的工作流程
当你创建type: LoadBalancer的Service时,整个流程是这样的:
- Kubernetes控制器向云服务商(如AWS、GCP、Azure)发送请求,要求创建一个外部负载均衡器;
- 云服务商完成负载均衡器的创建,并分配一个公网IP(或使用你指定的IP);
- 云服务商的负载均衡器会将外部流量转发到Service的
clusterIP(这里是10.0.171.239); - 集群内部的kube-proxy组件负责将
clusterIP的流量转发到匹配selector: app: MyApp的Pod上,最终到达Pod的targetPort: 9376; - Kubernetes会将云服务商分配的真实公网IP更新到Service的
status字段中,也就是status.loadBalancer.ingress.ip,这才是外部能访问的真实地址。
3. 注意:此处的"Ingress"与Ingress资源的区别
很多人会混淆这里的ingress字段和独立的Kubernetes Ingress资源,其实两者完全不同:
- Service状态里的
status.loadBalancer.ingress只是一个状态记录字段,用来存储负载均衡器的外部接入地址(可以是IP或域名); - 而独立的Ingress资源是一个七层路由组件,它可以通过一个公网IP/域名,将不同路径的请求转发到集群内部不同的Service上,相当于一个集中式的反向代理。
内容的提问来源于stack exchange,提问作者Shafi Siyam
相关产品推荐
相关产品推荐

