NodePort暴露K8s Hazelcast集群时Smart Client连接失败
问题根因
连接失败的核心原因是use_public_ip参数需要配合Hazelcast节点侧的公网地址配置才能生效,你当前手动部署的集群没有配置节点对外宣告的访问地址:
- 客户端通过第一个NodePort连接到节点后,拿到的成员列表是K8s集群内网的Pod IP(10.244.1.41、10.244.1.42),这类地址对集群外的客户端不可路由
- 开启
smart_routing后客户端会尝试直连所有集群成员,访问不可达的内网Pod IP时自然会触发连接超时、TargetDisconnectedError - 你配置的
use_public_ip=True未实际生效,因为Hazelcast节点本身不知道自己对应的NodePort映射关系,无法向客户端返回可直达的公网地址
解决方案
方案1:快速验证场景(关闭智能路由)
如果仅做功能测试,不需要智能路由的直连性能优势,直接关闭智能路由即可。此时客户端所有请求都会走你初始配置的NodePort地址,不会尝试直连内网Pod,不会触发连接超时。
修改后的客户端配置:
hz_client = hz.HazelcastClient( cluster_name="dev", cluster_members=["10.xx.xx.xx:31001", "10.xx.xx.xx:31002"], use_public_ip=True, smart_routing=False, client_name='hz.client_0', lifecycle_listeners=[ lambda state: print("Lifecycle event >>>", state), ], )
方案2:生产场景(保留智能路由能力)
如果需要使用智能路由的低延迟直连能力,必须让Hazelcast节点向客户端宣告自身对应的、客户端可直达的NodePort地址,分两步调整:
- 重新部署Hazelcast节点,给每个Pod配置对应的公网访问地址环境变量:
HAZELCAST_VERSION=latest # 先部署Hazelcast所需的K8s RBAC权限配置 # 启动第一个节点,配置对应可访问的IP和NodePort kubectl run hz-hazelcast-0 --image=hazelcast/hazelcast:$HAZELCAST_VERSION --port=5701 -l "app=hz-hazelcast-0,role=hazelcast" \ --env="HAZELCAST_PUBLIC_ADDRESS=10.xx.xx.xx:31001" kubectl create service nodeport hz-hazelcast-0 --tcp=5701:5701 --node-port=31001 # 启动第二个节点,配置对应可访问的IP和NodePort kubectl run hz-hazelcast-1 --image=hazelcast/hazelcast:$HAZELCAST_VERSION --port=5701 -l "app=hz-hazelcast-1,role=hazelcast" \ --env="HAZELCAST_PUBLIC_ADDRESS=10.xx.xx.xx:31002" kubectl create service nodeport hz-hazelcast-1 --tcp=5701:5701 --node-port=31002 # 创建统一服务入口 kubectl create service nodeport hz-hazelcast --tcp=5701:5701 --node-port=31000 -o yaml --dry-run=client | kubectl set selector --local -f - "role=hazelcast" -o yaml | kubectl create -f -
注意:将上述命令中的
10.xx.xx.xx替换为K8s节点实际的客户端可达IP,提前放通本地到该IP对应31001、31002端口的网络策略。
- 待两个Pod启动完成后,使用原有开启
smart_routing=True的客户端代码连接即可。此时节点返回给客户端的成员列表为配置好的可直达NodePort地址,可正常建立直连。
内容的提问来源于stack exchange,提问作者GZ GK
相关产品推荐
相关产品推荐

