Kubernetes における Keycloak の障害シミュレーション

Kubernetes 環境における Keycloak Pod の障害シミュレーションを自動化して、障害後の Keycloak の復旧をテストする方法。

なぜ障害テストが必要なのか

一般的な Chaos テストツールがなぜ必要なのかについては、Chaos テストツール krkn の紹介に優れた記述があります。

kc-chaos.sh スクリプトを使用した障害テストの実行

準備

  • keycloak-benchmark-${version}.[zip|tar.gz] ファイルを抽出します

  • テストのための Keycloak の準備

  • 障害テストを実行する予定の場所から Kubernetes クラスターにアクセスできることを確認し、kubectl get pods -n keycloak-keycloak などのコマンドを実行します。

負荷のシミュレーション

CLI からベンチマークを実行する ガイドを使用して、特定の Kubernetes 環境に対して負荷をシミュレーションします。

障害テストの実行

既存の Kubernetes/OpenShift クラスターでホストされている Keycloak アプリケーションに対して十分な負荷がかかったら、以下のコマンドを実行して

./kc-chaos.sh <RESULT_DIR_PATH>

以下の環境変数を設定して、このスクリプトの実行方法と場所を構成します。

INITIAL_DELAY_SECS

スクリプトが最初の障害をトリガーするまで待機する時間(秒単位)。

CHAOS_DELAY_SECS

スクリプトが障害シミュレーションの間隔を待機する時間(秒単位)。

PROJECT

Keycloak Pod の名前空間。

結果の収集

Chaos スクリプトは、Keycloak の障害、Keycloak Pod の使用率、Keycloak Pod の再起動、Keycloak Pod を強制終了する前と実行終了時の Keycloak ログに関する情報も収集し、results/logs ディレクトリに保存します。

Krkn Chaos テストフレームワークを使用した障害テストの実行

Chaos テストフレームワーク krkn を Taskfile Chaos.yaml の一部として統合し、Kubernetes 上の Keycloak のマルチサイトセットアップ内のさまざまなコンポーネントに対して pod-scenarios テストを実行するための個別のタスクを作成しました。これは、Keycloak および Infinispan アプリケーションの Pod 障害シナリオのシミュレーションに焦点を当てています。

準備

  • この Taskfile には、Podman/Docker がシステムにインストールおよび構成されている必要があります。

  • ROSA クラスターの Kubernetes 構成ファイルは、指定された ISPN_DIR ディレクトリにある必要があります。

  • タスクを実行する前に、必要な環境変数を設定してください。

  • 変数のデフォルト値をオーバーライドすることで、タスクの動作をカスタマイズできます。

kraken-pod-scenarios

これは、Kraken Pod 障害シナリオを実行するためのコア機能を提供する内部タスクです。これは、krkn-chaos/krkn-hub リポジトリの pod-scenarios イメージを使用します。このタスクには、以下の変数が必要です

ROSA_CLUSTER_NAME

ROSA クラスターの名前

POD_LABEL

ターゲット Pod を識別するためのラベルセレクター

EXPECTED_POD_COUNT

中断後の Pod の予想数

ISPN_DIR

Infinispan 構成を含むディレクトリ

タスクは、DEFAULT_NAMESPACEDISRUPTION_COUNTWAIT_DURATIONITERATIONS などの変数にいくつかのデフォルト値を設定します。また、Kubernetes 構成ファイルの存在を確認するための前提条件もあります。

kill-gossip-router

このタスクは、Infinispan クラスター内の JGroups Gossip Router Pod を強制終了します。これは、kraken-pod-scenarios タスクを POD_LABELDISRUPTION_COUNT、および EXPECTED_POD_COUNT の特定の値を指定して呼び出します。

現在、kill-gossip-router タスクは timeout while waiting for pods to come up エラーメッセージで失敗しますが、これは修正が必要であり、現在 GitHub issue で追跡されています。

kill-infinispan

このタスクは、ランダムな Infinispan Pod を強制終了します。これは、kraken-pod-scenarios タスクを POD_LABELDISRUPTION_COUNT、および EXPECTED_POD_COUNT の適切な値を指定して呼び出します。EXPECTED_POD_COUNT のデフォルト値は、CROSS_DC_ISPN_REPLICAS 変数(設定されていない場合は 3)に基づいて計算されます。

kill-keycloak

このタスクは、ランダムな Keycloak Pod を強制終了します。これは、kraken-pod-scenarios タスクを POD_LABELDISRUPTION_COUNT、および EXPECTED_POD_COUNT の特定の値を指定して呼び出します。EXPECTED_POD_COUNT のデフォルト値は、KC_INSTANCES 変数(設定されていない場合は 1)に基づいて計算されます。

制限事項

  • 現在、Kraken Pod 内で生成される Krkn レポートを詳しく調べることができませんが、これは一時的なストレージであるため削除されます。これは現在修正が計画されており、GitHub issue で追跡されています。