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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:25:25