Kubernetes LoadBalancer服务外部IP可访问服务端口无法访问NodePort咨询
问题解答
认知误区核心原因
你之前对端口逻辑的认知仅适用于NodePort类型的Service,而你当前创建的是LoadBalancer类型的Service,二者的对外暴露逻辑存在差异。
不同端口的访问逻辑说明
- LoadBalancer的公网IP(EXTERNAL-IP)访问规则:
你拿到的104.198.205.71是云服务商提供的公网负载均衡实例IP,该LB默认只会放通你在Service中定义的port(80、8888),收到对应端口的请求后,会自动转发到集群节点对应的NodePort上,最终转发到Pod的targetPort。所以你访问104.198.205.71:80、104.198.205.71:8888可以正常连通。 - NodePort的访问规则:
NodePort是绑定在集群节点本身的端口,不是绑定在LoadBalancer IP上的。你如果要测试NodePort连通性,需要使用集群节点的公网IP+NodePort访问,同时要确保节点的安全组放开了30000-32767(K8s默认NodePort范围)的端口。LoadBalancer的安全组默认不会放通NodePort段的端口,所以你用LB IP加NodePort访问自然不通。
补充:你的Helm配置存在格式错误
你贴出的Helm端口配置格式有误,ports是列表类型,你当前写的是字典结构,导致第二个端口的name把第一个覆盖了,这也是你kubectl describe svc输出里两个端口的name都为api的原因,正确写法如下:
ports: - name: api port: 80 targetPort: 8888 - name: api2 port: 8888 targetPort: 8888
三种访问场景梳理
- 集群内部访问:用
ClusterIP:ServicePort或服务DNS名+ServicePort访问 - 集群外部通过节点访问:用
节点公网IP:NodePort访问,需节点安全组放通对应端口 - 集群外部通过LB访问:用
EXTERNAL-IP:ServicePort访问,需LB安全组放通对应端口
内容的提问来源于stack exchange,提问作者Kun Hwi Ko
相关产品推荐
相关产品推荐

