使用Kubernetes DNS插件发现多Hazelcast实例的问题
在GCP Kubernetes Engine中配置JHipster单体应用的Hazelcast K8s DNS发现
看起来你已经迈出了关键第一步——添加Hazelcast的K8s DNS发现依赖,接下来咱们把剩下的配置补全,让你的JHipster单体应用在GKE多副本之间顺利共享Hazelcast缓存:
1. 完善Hazelcast配置类
JHipster默认提供了Hazelcast配置的基础框架,你需要修改或新增配置类来启用K8s DNS发现逻辑:
import com.hazelcast.config.Config; import com.hazelcast.config.JoinConfig; import com.hazelcast.config.NetworkConfig; import com.hazelcast.kubernetes.HazelcastKubernetesDiscoveryStrategyFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class HazelcastConfiguration { @Bean public Config hazelcastConfig() { Config config = new Config(); NetworkConfig networkConfig = config.getNetworkConfig(); JoinConfig joinConfig = networkConfig.getJoin(); // 禁用默认的多播发现(K8s环境下不需要) joinConfig.getMulticastConfig().setEnabled(false); // 启用K8s DNS发现策略 joinConfig.getDiscoveryConfig() .addDiscoveryStrategyConfig( new com.hazelcast.config.DiscoveryStrategyConfig( new HazelcastKubernetesDiscoveryStrategyFactory() ) ); // 配置K8s服务名称(替换为你的应用在K8s中的Service名称) joinConfig.getDiscoveryConfig().getDiscoveryStrategyConfigs().get(0) .addProperty("service-name", "your-jhipster-app-service"); return config; } }
2. 配置K8s Service暴露Hazelcast端口
确保你的K8s Service包含Hazelcast默认通信端口(5701),让副本之间能通过DNS解析到彼此:
apiVersion: v1 kind: Service metadata: name: your-jhipster-app-service labels: app: your-jhipster-app spec: type: ClusterIP ports: - name: http port: 8080 targetPort: 8080 - name: hazelcast port: 5701 targetPort: 5701 selector: app: your-jhipster-app
3. 配置GKE权限让Hazelcast访问K8s API
Hazelcast的K8s发现插件需要权限查询Pod和Service列表,你需要创建对应的RBAC规则:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: hazelcast-discovery namespace: your-app-namespace rules: - apiGroups: [""] resources: ["pods", "services"] verbs: ["get", "list", "watch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: hazelcast-discovery-binding namespace: your-app-namespace subjects: - kind: ServiceAccount name: default # 使用应用对应的ServiceAccount,默认是default namespace: your-app-namespace roleRef: kind: Role name: hazelcast-discovery apiGroup: rbac.authorization.k8s.io
4. 验证Hazelcast集群连接
部署应用后,通过Pod日志确认节点是否成功组成集群:
kubectl logs <your-app-pod-name> | grep Hazelcast
如果看到类似Members {size:3, ver:3} [Member [10.xx.xx.xx]:5701 - xxxxxx, Member [10.yy.yy.yy]:5701 - yyyyyy, Member [10.zz.zz.zz]:5701 - zzzzzz]的日志,说明多副本已经成功加入同一个Hazelcast集群。
5. 确认JHipster缓存适配
JHipster默认已经配置Hazelcast作为缓存提供商,你可以在application.yml中再次确认:
spring: cache: type: hazelcast
内容的提问来源于stack exchange,提问作者LioRz
相关产品推荐
相关产品推荐

