如何在一个 Kubernetes 集群中的命名空间之间隔离 Keycloak Infinispan,以防止 KC pod 相互发现和同步

How can isolate Keycloak Infinispan between namespaces in one Kubernetes cluster to prevent KC pod from discovering and synchronizing from one other

目前,我有一个带有 2 个命名空间的 Kubernetes:NS1 和 NS2。我正在使用 jboss/keycloak Docker 图片。

我在这 2 个命名空间中运行 2 个 Keycloak 实例,我希望它们 运行 独立运行。 但对于 Keycloak 中的 Infinispan 缓存来说,情况并非如此。我遇到一个问题,当 NS2 中的 KC pod 被声明为“Crash Loopback”时,NS1 中的所有 KC 会话都会失效很多次。

每当 NS2 中的“Crash Loopback”KC pod 尝试重启时,日志如下:

15:14:46,784 INFO [org.infinispan.CLUSTER] (remote-thread--p10-t412) [Context=clientSessions] ISPN100002: Starting rebalance with members [keycloak-abcdef, keycloak-qwerty], phase READ_OLD_WRITE_ALL, topology id 498

keycloak-abcdef是NS1中的KC pod,keycloak-qwerty是NS2中的KC pod。因此,NS1 中的 KC pod 可以看到 NS2 中的 KC pod 并受其影响。

经过研究,我发现Keycloak使用Infinispan缓存来管理会话数据,Infinispan使用JGroups以默认方法PING来发现节点。我假设这种机制是“无效会话”问题的根本原因,因为它会尝试联系同一集群(甚至不同命名空间)中的其他 KC pods 来执行类似同步的操作。

有什么方法可以在命名空间之间隔离 Keycloak 中 Infinispan 的工作吗?

谢谢!

将评论作为社区 wiki 答案发布以获得更好的知名度


我会使用 JDBC_PING 进行发现,因此只有使用相同数据库的节点才能发现彼此