模拟 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 的一部分,并创建了单独的任务以对 Keycloak 在 Kubernetes 上的多站点设置内的不同组件运行 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_COUNTEXPECTED_POD_COUNT 提供特定值。

目前,kill-gossip-router 任务会失败,并显示 timeout while waiting for pods to come up 错误消息,这需要修复,目前在 GitHub 问题 中进行跟踪。

kill-infinispan

此任务会杀死随机的 Infinispan Pod。它调用 kraken-pod-scenarios 任务,并为 POD_LABELDISRUPTION_COUNTEXPECTED_POD_COUNT 提供适当的值。EXPECTED_POD_COUNT 的默认值根据 CROSS_DC_ISPN_REPLICAS 变量(如果未设置,则为 3)计算。

kill-keycloak

此任务会杀死随机的 Keycloak Pod。它调用 kraken-pod-scenarios 任务,并为 POD_LABELDISRUPTION_COUNTEXPECTED_POD_COUNT 提供特定值。EXPECTED_POD_COUNT 的默认值根据 KC_INSTANCES 变量(如果未设置,则为 1)计算。

局限性

  • 目前,我们无法查看在 kraken Pod 内生成的 Krkn 报告,但该报告会被删除,因为它属于临时存储。目前计划修复此问题,并在 GitHub 问题 中进行跟踪。