模拟 Kubernetes 中 Keycloak 的故障

如何在 Kubernetes 环境中自动化模拟 Keycloak Pods 的故障,以测试 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 issue 中跟踪。

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)计算得出的。

局限性

  • 目前,我们无法查看 Krkn 报告,该报告在 kraken Pod 内部生成,但由于其临时存储而被删除。这目前计划修复,并在 GitHub issue 中跟踪。