Spring Boot + Hazelcast + Kubernetes环境下缓存集群连接异常问题求助
从你提供的日志和配置来看,这个Unknown protocol: HTT警告的根源很明确:你的Hazelcast节点正在尝试连接到一个非Hazelcast集群端口(这里是9191),而这个端口运行的是HTTP服务,导致Hazelcast无法识别通信协议,最终断开连接。
问题分析
在你的HazelcastConfiguration配置类中,你启用了Kubernetes集群发现机制,但很可能存在以下问题之一:
- 配置的
SERVICE_DNS指向的Kubernetes Service,错误关联到了你的应用服务(而非Hazelcast专用服务),而应用服务的端口是9191(HTTP端口) - Hazelcast专用Service的端口映射配置错误,没有指向Hazelcast默认的集群通信端口5701
具体解决方案
1. 检查并修正Hazelcast Kubernetes Service配置
首先确保你有一个专属的Hazelcast Service,而不是复用应用的Service。以下是标准的Hazelcast无头Service配置(适合StatefulSet部署):
apiVersion: v1 kind: Service metadata: name: hazelcast-cluster-service namespace: {{你的Hazelcast命名空间}} # 对应staticConfig.getHazelcastNamespace()的取值 spec: selector: app: hazelcast # 必须匹配Hazelcast Pod的标签 ports: - protocol: TCP port: 5701 # Service暴露的端口 targetPort: 5701 # 容器内Hazelcast监听的端口(默认5701) clusterIP: None # 无头服务,确保Kubernetes DNS能解析到所有Hazelcast Pod
2. 调整Hazelcast发现配置
如果你的Hazelcast Service使用了非默认端口(不推荐,但如果必须的话),需要在Kubernetes发现配置中明确指定端口:
joinConfig.getKubernetesConfig().setEnabled(true) .setProperty(HazelcastConstants.NAMESPACE, staticConfig.getHazelcastNamespace()) .setProperty(HazelcastConstants.SERVICE_DNS, staticConfig.getHazelcastServiceDns()) .setProperty("service-port", "5701"); // 添加此行,指定集群通信端口
同时确认staticConfig.getHazelcastServiceDns()的值是Hazelcast专属Service的DNS(比如hazelcast-cluster-service.your-namespace.svc.cluster.local),而非应用服务的DNS。
3. 验证Pod端口监听
进入任意Hazelcast Pod,执行以下命令确认Hazelcast在正确端口监听:
netstat -tulpn | grep 5701
如果没有结果,说明Hazelcast启动时端口配置有误,需要检查Hazelcast核心配置。
4. 排除管理中心配置干扰
你的代码中初始化了ManagementCenterConfig但未配置具体URL,虽然这不会直接导致端口错误,但建议明确配置管理中心的地址(如果使用的话),避免和集群通信端口混淆:
config.setManagementCenterConfig(new ManagementCenterConfig() .setUrl("http://hazelcast-management-center:8080/hazelcast-mancenter") .setEnabled(true));
总结
这个问题本质是集群发现的目标端口错误,只要确保Hazelcast通过Kubernetes发现机制连接到同集群内其他Hazelcast节点的5701端口,就能解决这个协议不匹配的异常。
内容的提问来源于stack exchange,提问作者Keval Panchal

