Azure AKS集群Apache Ignite TcpDiscoveryKubernetesIpFinder连接故障
故障根因定位与解决方案
核心故障根因
当前配置的TcpDiscoveryKubernetesIpFinder存在三类配置偏差,直接导致节点无法完成集群发现:
- 关联服务与Ignite服务端口不匹配,Endpoint列表为空
TcpDiscoveryKubernetesIpFinder的工作逻辑是调用K8s API拉取指定服务后端的所有Pod地址,用于Discovery端口通信。当前关联的cohortstore-load-balancer-internal为LoadBalancer类型服务,仅暴露8080、10800、10900三个业务端口,未声明Ignite Discovery默认端口47500。根据K8s规则,当Service定义的端口与Pod容器声明的端口无法匹配时,对应Pod的IP不会被加入服务的Endpoint列表,最终导致IpFinder拉取到的地址集合为空,触发Failed to get registered addresses from IP finder on start错误。 - IpFinder关联的服务类型不符合官方要求
Ignite官方要求TcpDiscoveryKubernetesIpFinder必须关联无头服务(Headless Service,spec.clusterIP=None),而非带负载均衡的ClusterIP/LoadBalancer服务。LoadBalancer服务会对后端节点做健康检查、负载过滤,无法返回完整的全量服务端节点地址列表,无法满足Discovery阶段需要遍历所有集群成员的要求。这也解释了为何瘦客户端可正常连接:瘦客户端仅需通过LoadBalancer的10800端口做代理通信,不需要拉取全量节点地址列表,因此不受影响。 - 超时参数设置不合理触发线程阻塞告警
配置中socketTimeout=300的阈值远低于跨命名空间通信的常规网络延迟,当Discovery线程因拉不到有效地址持续等待时,会触发系统关键线程Blocked类告警。
修复操作步骤
- 在服务端命名空间创建专属的无头服务
在cohort-store命名空间下新建无头服务,配置要求:- 通过selector匹配所有Ignite服务端Pod的标签
- 配置
clusterIP: None启用无头服务模式 - 暴露Ignite集群内部通信所需端口:
47500:对应TcpDiscoverySpi的Discovery通信端口47100:对应TcpCommunicationSpi的节点间通信端口
- 调整厚客户端的IpFinder配置
将XML配置中serviceName字段替换为上述新建的无头服务名称,保持namespace=cohort-store不变即可。 - 优化Discovery超时参数
将Discovery SPI的socketTimeout从300调整为2000~3000ms,适配跨命名空间网络延迟,避免无意义的线程阻塞告警。 - 检查跨命名空间的K8s API权限
确保cohort-frontdoor命名空间内厚客户端Pod使用的服务账号,已通过RBAC绑定对应权限,可查询cohort-store命名空间下的Service、Endpoints资源,避免因API权限不足导致地址拉取失败。
验证方案
- 配置更新后,先在厚客户端Pod内执行命令,确认可正常获取到全量服务端节点地址:
输出结果需包含3个kubectl get endpoints -n cohort-store <新建的无头服务名称>cohortstore-*Pod的IP,且映射端口包含47500。 - 重启厚客户端节点,观察日志确认Discovery阶段可正常拉取到服务端节点列表,无
Failed to get registered addresses from IP finder报错即为修复完成。
内容的提问来源于stack exchange,提问作者kjdfkdsf
相关产品推荐
相关产品推荐

