Azure Kubernetes中EmbeddedCacheManager的Infinispan缓存跨Pod驱逐失败
Infinispan嵌入式集群缓存K8s环境问题排查与配置建议
核心问题分析
本地环境能正常跨节点驱逐缓存,是因为JGroups默认的本地发现机制(如PING协议)能自动识别同一网络下的节点;但在Azure Kubernetes中,Pod处于隔离的网络环境,默认的发现机制无法找到其他Pod,导致两个应用节点没有形成有效缓存集群,因此跨节点的缓存驱逐操作无法生效。
配置修改建议
1. 配置JGroups的K8s集群发现机制
Infinispan依赖JGroups实现集群成员发现,必须替换为适配K8s的发现协议(推荐kubernetes_ping或dns_ping):
- 代码配置:在
ConfigurationBuilder中指定K8s专用的JGroups栈,并配置Headless Service的DNS查询地址
ConfigurationBuilder confBuilder = new ConfigurationBuilder(); confBuilder.expiration().lifespan(8, TimeUnit.HOURS); confBuilder.clustering().cacheMode(CacheMode.DIST_SYNC); // 配置K8s集群发现 confBuilder.transport().stack("kubernetes") .addProperty("dns.query", "your-headless-service.your-namespace.svc.cluster.local"); // 可选:开启初始状态传输,确保新节点加入时同步缓存数据 confBuilder.clustering().stateTransfer().awaitInitialTransfer(true); confBuilder.transaction().transactionMode(TransactionMode.TRANSACTIONAL); confBuilder.build();
- 依赖补充:添加JGroups的K8s集成依赖(Maven为例)
<dependency> <groupId>org.jgroups.kubernetes</groupId> <artifactId>jgroups-kubernetes</artifactId> <version>2.0.1.Final</version> <!-- 匹配你的Infinispan版本 --> </dependency>
- K8s Headless Service配置:创建Headless Service用于Pod的DNS解析,让JGroups能获取所有集群节点地址
apiVersion: v1 kind: Service metadata: name: infinispan-app-headless namespace: your-app-namespace spec: clusterIP: None selector: app: your-app-label # 匹配你的Pod标签 ports: - name: jgroups port: 7800 protocol: TCP
2. 验证集群成员状态
在应用中添加简单的状态检查逻辑,确认两个Pod是否已加入同一集群:
@Autowired private EmbeddedCacheManager cacheManager; // 可通过REST端点暴露该方法 public List<String> getClusterMembers() { return cacheManager.getMembers().stream() .map(Address::toString) .collect(Collectors.toList()); }
如果返回列表包含两个Pod的节点地址,说明集群已正常形成;若仅返回当前节点地址,需检查JGroups配置和Service是否正确。
3. 事务配置校验
由于使用了TransactionMode.TRANSACTIONAL模式,需确保Spring事务管理器配置正确,避免因事务未提交导致缓存操作未同步到集群。例如:
@Bean public PlatformTransactionManager transactionManager(EmbeddedCacheManager cacheManager) { return new JtaTransactionManager(); }
是否需要切换为RemoteCacheManager?
- 嵌入式模式(EmbeddedCacheManager):适合当前两个应用节点组成缓存集群的场景,无需切换,只要解决K8s集群发现问题即可正常工作。优点是部署简单,缓存与应用同进程,无额外组件依赖。
- RemoteCacheManager:适用于需要将缓存层独立出来的场景(如多应用共享缓存、缓存独立扩容/运维),此时需要部署独立的Infinispan Server集群,应用通过远程连接访问缓存。如果当前场景没有这类需求,没必要切换。
内容的提问来源于stack exchange,提问作者Muzaffar Ali
相关产品推荐
相关产品推荐

