Kubernetesのエラーメッセージと対処法

これは、KubernetesでKeycloakベンチマークスイートを実行する際に発生する一般的なエラーメッセージと、その対処法について説明しています。

Keycloakメッセージ エラー: JDBC接続を取得できませんでした

背景

このエラーメッセージは、PostgreSQLやCockroachDBのようなリレーショナルデータベースでKeycloakを実行している場合に表示されることがあります。

同様の他のエラーメッセージ

  • JDBC接続を取得できません

  • 申し訳ありませんが、取得タイムアウトです!

これは、起動時や、Keycloakが新しいデータベース接続を作成する負荷テスト中に発生し、起動が失敗することがあります。

原因

データベースが起動していないか、または現在の設定でデータベース接続数が上限に達しています。

対処法
  • データベースが実行中であることを確認してください。

  • 例えば、メモリ不足などが原因でデータベースが再起動していないことを確認してください。

  • DB接続の合計数が、データベースの最大接続数を超えないようにしてください。詳細については、Keycloakのデプロイメント設定オプションKC_DB_*を参照してください。

  • Keycloakが、最大接続数として設定されている数を超える接続を使用しようとしていないことを確認してください。

注意
  • 高負荷時、データベース接続数は通常システムの制約となります。Keycloakが「申し訳ありませんが、取得タイムアウトです!」となり、HTTP 5xxコードを呼び出し元に返すのは、適切な負荷分散メカニズムです。詳細については、本番環境での実行を参照してください。

Keycloakメッセージ プリペアドトランザクションは無効です

完全なメッセージ
org.postgresql.util.PSQLException: ERROR: prepared transactions are disabled.
Hint: Set max_prepared_transactions to a nonzero value.
背景

これは、トランザクションマネージャーまたはQuarkusがリクエスト内で複数のトランザクションを処理し、そのうちの1つがPostgreSQLデータベースに関連する場合に発生します。

原因

Quarkusのトランザクションマネージャーが2つのトランザクションをまとめると、すべてのトランザクションの準備後にコミットを送信する前に、データベースにPREPARE TRANSACTIONコマンドを送信します。これが正常に動作するためには、データベースにmax_prepared_transactionsパラメータを設定する必要があります。

影響

PostgreSQLデータベースに対するトランザクションはすべて失敗します。

対処法

パラメータ-c max_prepared_transactions=xxxをデータベースに渡してください。Kubernetes環境のコンテナ化されたデータベースでは、これは postgres-deployment.yaml で設定済みです。

Keycloakメッセージ ARJUNA012225: オブジェクトストアのルートにアクセスできません

完全なメッセージ
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: スレッドプールがいっぱいです'

完全なメッセージ
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仮想スレッドを使用しています。この構成では、この問題は発生しないはずです。