Kubernetes 错误消息和解决方法

本文描述了在 Kubernetes 上运行 Keycloak 基准测试套件时常见的错误消息及其解决方法。

Keycloak 消息 ERROR: Failed to obtain JDBC connection

背景

当使用关系数据库(例如 PostgreSQL 或 CockroachDB)运行 Keycloak 时,可能会出现此错误消息。

类似的其它错误消息

  • 无法获取 JDBC 连接

  • 抱歉,获取超时!

这可能发生在启动期间,然后启动失败。也可能在负载测试期间发生,当 Keycloak 创建新的数据库连接时。

原因

数据库要么未启动,要么当前设置中数据库连接数已耗尽。

解决方法
  • 确保数据库正在运行。

  • 确保数据库没有重启,例如,由于内存不足问题。

  • 确保数据库连接总数不超过数据库的最大连接数。 有关详细信息,请参阅 Keycloak 部署配置选项 KC_DB_*

  • 确保 Keycloak 没有尝试使用超过配置的最大连接数。

警告
  • 在高负载下,数据库连接数通常是系统的约束。 Keycloak 遇到“抱歉,获取超时!”并向调用者返回 HTTP 5xx 代码是一种合理的负载削减机制。 有关详细信息,请参阅在生产环境中运行

Keycloak 消息 prepared transactions are disabled

完整消息
org.postgresql.util.PSQLException: ERROR: prepared transactions are disabled.
Hint: Set max_prepared_transactions to a nonzero value.
背景

当事务管理器或 Quarkus 在一个请求中处理多个事务,并且其中一个事务属于 PostgreSQL 数据库时,会发生这种情况。

原因

一旦 Quarkus 的事务管理器捆绑了两个事务,它会在准备好所有事务后发送提交之前,向数据库发送 PREPARE TRANSACTION 命令。 为了使其工作,数据库需要设置 max_prepared_transactions 参数。

效果

针对 PostgreSQL 数据库的所有事务都将失败。

解决方法

将参数 -c max_prepared_transactions=xxx 传递给数据库。 对于 Kubernetes 设置中的容器化数据库,这已在 postgres-deployment.yaml 中配置。

Keycloak 消息 ARJUNA012225: cannot access root of object store

完整消息
ARJUNA012225: FileSystemStore::setupStore - cannot access root of object store: ObjectStore/ShadowNoFileLockStore/defaultStore/
背景

当事务管理器或 Quarkus 在一个请求中处理多个事务并尝试本地持久化事务状态时,会发生这种情况。

原因

Keycloak 的工作目录在 Keycloak 容器中不可写,因此写入状态失败。

效果

针对参与 JTA 事务的任何存储的所有事务都不会完成,因此 Keycloak 将无法启动。

解决方法

通过环境变量 QUARKUS_TRANSACTION_MANAGER_OBJECT_STORE_DIRECTORY 传入一个可写的文件夹。 这已在上游 Keycloak 21.1 版本中修复,参见 keycloak#19384

Keycloak 消息 'org.jgroups.util.ThreadPool: thread pool is full'

完整消息
org.jgroups.util.ThreadPool`: thread pool is full (max=xx, active=xx); thread dump (dumped once, until thread_dump is reset)
背景

当 JGroups 中的线程池耗尽线程时,会发生这种情况。

解决方法

Keycloak 26.1+ 在 JDK 21 上运行时,为此使用了 Java 虚拟线程。 在这种设置中,这种情况不应再发生。