模擬 Kubernetes 中 Keycloak 的故障

如何在 Kubernetes 環境中自動化模擬 Keycloak Pod 的故障,以測試 Keycloak 在故障後的恢復。

為什麼需要故障測試

關於為什麼我們一般需要混沌測試工具,在混沌測試工具 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 的命名空間。

收集結果

此混沌腳本還收集有關 Keycloak 故障、Keycloak pod 使用率、Keycloak pod 重新啟動、在關閉 Keycloak pod 之前以及執行結束時的 Keycloak 日誌資訊,並將其儲存在 results/logs 目錄下。

使用 Krkn 混沌測試框架執行故障測試

我們將混沌測試框架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。它會以 POD_LABELDISRUPTION_COUNTEXPECTED_POD_COUNT 的特定值呼叫 kraken-pod-scenarios 任務。

目前,kill-gossip-router 任務會失敗並顯示 timeout while waiting for pods to come up 錯誤訊息,此錯誤需要修復,目前在 GitHub 問題中追蹤。

kill-infinispan

此任務會關閉隨機的 Infinispan pod。它會以 POD_LABELDISRUPTION_COUNTEXPECTED_POD_COUNT 的適當值呼叫 kraken-pod-scenarios 任務。EXPECTED_POD_COUNT 的預設值會根據 CROSS_DC_ISPN_REPLICAS 變數 (如果未設定則為 3) 計算。

kill-keycloak

此任務會關閉隨機的 Keycloak pod。它會以 POD_LABELDISRUPTION_COUNTEXPECTED_POD_COUNT 的特定值呼叫 kraken-pod-scenarios 任務。EXPECTED_POD_COUNT 的預設值會根據 KC_INSTANCES 變數 (如果未設定則為 1) 計算。

限制

  • 目前,我們無法查看在 kraken pod 內產生,但由於是臨時儲存而被移除的 Krkn 報告。這目前計劃修正,並在 GitHub 問題中追蹤。