You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:23:00