Kubernetes LoadBalancer Service 解析:IP与端口详解
服务类型与IP解析
- Service 是 Kubernetes 中的资源类型,用来将一组 Pod 的应用作为网络服务公开。每个 Pod 都有自己的 IP,但是这个 IP 的生命周期与 Pod 生命周期一致,也就是说 Pod 销毁后这个 IP 也就无效了(也可能被分配给其他的 Pod 使用)。而 Service 的 IP(ClusterIP) 则是在创建之后便不会改变,Service 与 Pod 之前通过 userspace 代理、iptables 和 ipvs 代理 等手段关联。
- LoadBalancer 是 Service 四种类型中的一种,其他三种是 ClusterIP、NodePort、ExternalName。
- LoadBalancer 的工作需要搭配第三方的负载均衡器来完成。当我们安装 Ingress 控制器时,会创建一个类型为 LoadBalancer 的 Service。新创建的 Service 的 EXTERNAL-IP 状态是 pending,假如没有负载均衡器的话,会一直处于 pending 状态
-
Cluster IP (10.233.50.2):
- 这是服务在集群内部的虚拟IP地址
- 集群内的其他Pod可以通过这个IP访问该服务
- 自动分配且在服务生命周期内保持不变
-
External IP (显示为
<pending>
):- 对于LoadBalancer类型的服务,这是云提供商分配的外部IP
- 在自建Kubernetes集群(如使用MetalLB)中,可能需要额外配置才会分配
- 当前状态为
<pending>
表示尚未分配外部IP
端口类型解析
服务暴露了多个端口,每种端口有不同的含义:
-
Service Port (如9091/TCP):
- 服务在Cluster IP上暴露的端口
- 集群内部访问时使用的端口
-
TargetPort (如9091/TCP):
- 实际Pod上应用程序监听的端口
- 流量最终会被转发到这个端口
-
NodePort (如19650/TCP):
- 当服务类型为NodePort或LoadBalancer时,Kubernetes会在每个节点上开放这个端口
- 即使没有外部负载均衡器,也可以通过任何节点的IP+NodePort访问服务
端口映射关系
当前服务暴露了4个端口组:
9091:19650/TCP # http服务
9090:30536/TCP # grpc服务
9092:23589/TCP # ws (WebSocket)服务
9093:20652/TCP # metrics服务
每组格式为:ServicePort:NodePort/TCP
连接方式
集群内部连接
-
通过Cluster IP:
http://10.233.50.2:9091 # http服务 grpc://10.233.50.2:9090 # grpc服务 ws://10.233.50.2:9092 # WebSocket服务 http://10.233.50.2:9093 # metrics服务
-
通过服务DNS名 (在同一个命名空间):
http://controller:9091
集群外部连接
-
通过NodePort (当外部IP未分配时):
- 获取任意节点的IP地址
- 使用对应的NodePort:
http://<任一节点IP>:19650 # http服务 grpc://<任一节点IP>:30536 # grpc服务 ws://<任一节点IP>:23589 # WebSocket服务 http://<任一节点IP>:20652 # metrics服务
-
通过LoadBalancer IP (当外部IP分配后):
- 等待
<pending>
变为实际IP(如123.123.123.123) - 然后使用:
http://123.123.123.123:9091 grpc://123.123.123.123:9090
- 等待
注意事项
-
如果
ExternalTrafficPolicy
设置为Cluster
(当前配置),NodePort上的流量会经过kube-proxy的转发,可能会丢失原始客户端IP -
如果设置为
Local
,则只有运行有服务Pod的节点才会响应NodePort请求,但可以保留客户端IP -
在生产环境中,通常会配合Ingress控制器使用,而不是直接暴露多个NodePort
-
在云环境中,LoadBalancer IP分配通常需要几分钟时间