K8s LoadBalancer服务为何可通过port访问却无法通过nodePort访问
问题根因
你的配置本身没有语法错误,访问异常来自于对LoadBalancer类型Service不同端口作用范围的理解偏差,三个端口的生效边界如下:
- port: 8080:是外部负载均衡实例(即输出中
<my_pub_IP>对应的公网LB)的监听端口,所有发往该公网IP:8080的流量会被LB转发至集群内部,这也是你访问该地址能正常连通的原因。 - nodePort: 30001:是Kubernetes在所有集群节点(Node)本地开放的端口,仅绑定节点自身的IP(节点内网IP、节点自身绑定的公网IP),和LB分配的独立公网IP没有关系。
- targetPort: 80:是Pod内Nginx容器实际监听的端口,所有到达Service的流量最终都会转发到Pod的这个端口。
你访问的<my_pub_IP>是负载均衡器的独立虚拟IP,不是集群节点的公网IP,该LB默认仅监听port字段指定的8080端口,不会监听30001端口,因此访问<my_pub_IP>:30001必然无法连通。
验证与使用方式
如果要验证nodePort配置是否正常,按以下步骤操作即可:
- 执行命令获取集群节点IP列表:
kubectl get nodes -o wide
- 从输出中获取任意节点的
INTERNAL-IP(内网访问场景)或节点自身绑定的公网IP(公网访问场景) - 确认节点对应安全组/本地防火墙已放开30001端口的TCP入站规则,访问
<节点IP>:30001即可正常打开Nginx页面。
补充配置说明
LoadBalancer类型Service是NodePort类型的上层扩展:集群会先为Service分配NodePort,在所有节点上开放该端口,再额外创建外部负载均衡实例,将LB的监听端口(即port字段)映射到对应NodePort,最终由kube-proxy完成到后端Pod的流量转发。
如果你希望通过LB的公网IP用30001端口访问服务,直接将Service配置中的port字段值从8080改为30001即可,LB会自动将监听端口调整为30001。
内容的提问来源于stack exchange,提问作者Ubaid Ilyas
相关产品推荐
相关产品推荐

