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

Posted

技术标签:

【中文标题】如何在一个 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 【发布时间】:2022-01-15 07:16:51 【问题描述】:

目前,我有一个具有 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 pod 来执行诸如同步之类的操作。

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

谢谢!

【问题讨论】:

我会使用 JDBC_PING 进行发现,因此只有使用相同数据库的节点才能发现彼此。 谢谢@JanGaraj。它对我有用。 【参考方案1】:

发布评论作为社区 wiki 答案以获得更好的可见性


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

【讨论】:

你好@bkl。如果可以解决您的问题,请考虑 accepting the answer。

以上是关于如何在一个 Kubernetes 集群中的命名空间之间隔离 Keycloak Infinispan,以防止 KC pod 相互发现和同步的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Kubernetes 集群中执行 GitLab Runner:无法在命名空间“gitlab”中的 API 组“”中创建资源“秘密”

K8SNamespace命名空间

防止 Kubernetes 中的命名空间间通信

Kubernetes集群命名空间(Namespace)

Kubernetes集群命名空间(Namespace)

命名空间的 kubernetes 集群信息