制限事項

minikube ドライバー

Linux の場合、スケーラブルなソリューションには kvm2 ドライバーが必要です (15 Keycloak レプリカでテスト済み)。8 GB 以上の RAM を追加すると、より多くのインスタンスが可能です。

Linux 上の Podman ドライバーは現在、オープンファイル数の制限により、Keycloak のインスタンスを最大 5 つまでしかサポートしていません。これは実際にはスレッド数の制限です。その後、コンテナはより多くのプロセスを開始できないと不満を漏らします。

minikube ランタイム

より大きなマシンで cri-o ランタイムをテストしたところ、Pods の起動と Kubernetes API および Web ブラウザー経由でのアクセスが不安定でした。Pods の liveness プローブが時々失敗し、Pods が再起動しました。いくつかの分析の後、理由はまだ不明確でしたが、オープンファイル数の制限に関連している可能性があります。

minikube 永続ストレージ

minikube の PVC はローカルファイルシステムからマウントされます。そのため、PVC サイズはチェックされず、1 つのサービスがディスクを非常に多く埋め尽くし、他のすべての人も利用できなくなる可能性があります。

Jaeger とトレースのサンプリング

各トレースに対して収集されるデータは大きく、Jaeger Pod でメモリ不足の状態を急速に引き起こす可能性があります。収集されるデータ量を最小限に抑えるために、OTEL_TRACES_SAMPLER_ARG の値は 0.01 に設定され、100 リクエストに 1 つだけをトレースします。トレースはデフォルトで無効になっており、Keycloak の Helm チャートの values.yaml ファイルで有効にできます。

代替のトレースソリューションとして、Tempo が検討されました。トレースは OTEL 経由で正常に送信され、トレース ID による検索は期待どおりに機能しますが、トレースの検索 (現在ベータ版) では、一部のトレース (たとえば、ユーザーの削除) が返されません。したがって、今のところ、Jaeger トレースが使用されています。

JFR 記録用の Cryostat

Helm チャートの内容は、元々 Cryostat オペレーターによって作成されました。バージョン 2.0 のオペレーターによって作成されたリソースを分析したところ、cryostat-deployment に必要な環境変数を追加するサポートされた方法はありませんでした。そのため、これが抽出され、Helm チャートとしてここに配置されました。

Cryostat インスタンスは、接続先の JVM と同じ名前空間で実行する必要があります。そのため、個別の Helm チャートではなく、Keycloak デプロイメントの一部となっています。

作成されたプロファイリングは通常のプロファイリングであり、非同期プロファイリングではありません。したがって、プロファイリングはセーフポイントバイアス問題の影響を受けます。詳細については、Java async profiler を参照してください。

このプロジェクトは、セーフポイントバイアス問題の影響を受けない Java 用の低オーバーヘッドサンプリングプロファイラーです。スタックトレースを収集し、メモリー割り当てを追跡するための HotSpot 固有の API を備えています。プロファイラーは、OpenJDK、Oracle JDK、および HotSpot JVM に基づくその他の Java ランタイムで動作します。

— Java async profiler

今のところ、非同期プロファイリングを使用しないことは、そうでないと証明されるまで十分であるはずです。