ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Selenium Grid KEDA Autoscaling 混沌测试实录:job_count 策略在随机故障负载下的扩缩容行为分析

Selenium Grid KEDA Autoscaling 混沌测试实录:job_count 策略在随机故障负载下的扩缩容行为分析 测试后端云原生容器编排可观测性【免费下载链接】docker-seleniumProvides a simple way to run Selenium Grid with Chrome, Firefox, and Edge using Container Platform, making it easier to perform browser automation at scale项目地址https://gitcode.com/GitHub_Trending/do/docker-selenium点击查看免费下载本篇技术指南以 docker-selenium 仓库中.keda/目录下的测试结果文档 results_test_k8s_autoscaling_job_count_strategy_default_in_chaos.md 为核心结合 .keda/README.md、scaler 官方触发规范、scaler 实现源码 与 AutoscalingTests 测试代码完整还原 Selenium Grid 在 Kubernetes 上使用 KEDAselenium-gridscaler、采用job_countScaledJob缩放策略时的混沌场景测试全过程。读完本文你将掌握该测试的数据字段含义、20 轮混沌迭代的完整实测数据、数据背后的扩缩容原理队列长度计算、Pod 冷启动、冷却期行为以及如何在本仓库中复现同类测试。背景为什么需要 KEDA Selenium Grid Scaler 混沌测试Selenium Grid 4 的核心设计之一是会话队列session queue当请求到达 Hub 而没有可用 Node 时请求会进入队列等待。传统固定副本数部署会浪费资源而 KEDAKubernetes Event-driven Autoscaling提供的selenium-grid内置 scaler 正是针对这一场景根据会话队列中等待的请求数量与每个 Node 可并行承载的最大会话数max sessions动态扩缩浏览器 Node。docker-selenium 仓库本身作为该 scaler 的共同维护方见 .keda/README.md会基于 KEDA 最新稳定版本打补丁后构建镜像并在本仓库中持续交付与验证 scaler 的修复与改进。验证方式之一就是一系列 Kubernetes 自动扩缩容测试其结果文档位于 .keda 目录下包含三类对照场景job_count策略ScaledJob常规负载results_test_k8s_autoscaling_job_count_strategy_default.mdjob_count策略混沌负载本文主体results_test_k8s_autoscaling_job_count_strategy_default_in_chaos.mdjob_count策略 nodeMaxSessions每 Pod 多槽位results_test_k8s_autoscaling_job_count_strategy_default_with_node_max_sessions.mddeployment_count策略ScaledObject的常规、混沌、多槽位三组results_test_k8s_autoscaling_deployment_count.md、results_test_k8s_autoscaling_deployment_count_in_chaos.md、results_test_k8s_autoscaling_deployment_count_with_node_max_sessions.md所谓混沌chaos测试是指测试脚本以随机并发请求量、随机关闭会话数的方式制造不稳定负载验证 scaler 在突发、抖动负载下仍能正确收敛到期望的 Pod 数量而不是失控地无限扩容或缩容。job_count 缩放策略的工作原理在深入解读数据之前先厘清job_count策略与 scaler 指标的底层机制。从 scaler 实现源码 可以看到scaler 每次被 KEDA 轮询时会向 Selenium Grid 的 GraphQL 端点发起如下查询{ grid { sessionCount, maxSession, totalSlots }, nodesInfo { nodes { id, status, sessionCount, maxSession, slotCount, stereotypes, sessions { id, capabilities, slot { id, stereotype } } } }, sessionsInfo { sessionQueueRequests } }随后在 getSessionsQueueLength 与 GetMetricsAndActivity 中解析sessionQueueRequests按 scaler 触发元数据中的browserName、browserVersion、platformName、capabilities等条件统计匹配的排队新请求数量newRequestNodes解析各 Node 的stereotypes与活跃sessions统计仍在进行中的匹配会话数量onGoingSessions输出外部指标值newRequestNodes onGoingSessions并判断其是否大于activationThreshold默认0来决定是否活跃activity。KEDA 的ScaledJob即job_count策略会依据该指标值决定同时运行的 Job 数量。当每个 Node Pod 的SE_NODE_MAX_SESSIONS为 1 时测试默认nodeMaxSessions1理想情况下Pod 数 排队请求数 运行中会话数即每个待处理请求恰好对应一个 Node Pod二者一一对应。关于 Job 的收尾行为charts/selenium-grid/values.yaml 中的注释也说明启用job类型缩放时Node 默认会按nodeMaxSessions排空drain后退出这保证了 Job 在完成当前会话后才被回收不会中断正在运行的浏览器任务。混沌测试脚本逻辑test_scale_chaos混沌场景的测试脚本是 tests/AutoscalingTests/test_scale_chaos.py其核心循环第 29-62 行每轮执行以下动作for iteration in range(TEST_AUTOSCALING_ITERATIONS): # 默认 20 轮 new_request_sessions random.randint(3, 6) # 随机发起 3~6 个并发会话请求 start_time time.time() start_pods get_pod_count() new_sessions create_sessions_in_parallel(new_request_sessions) # 并行创建会话 failed_sessions new_request_sessions - len(new_sessions) end_time time.time() stop_pods get_pod_count() SESSIONS.extend(new_sessions) elapsed_time end_time - start_time new_scaled_pods stop_pods - start_pods # 本轮新扩容的 Pod 数 total_sessions len(SESSIONS) total_pods get_pod_count() wait_for_count_matches(SESSIONS, TEST_NODE_MAX_SESSIONS) # 等待 Pod 数收敛到期望值 total_pods get_pod_count() closed_session randomly_quit_sessions(SESSIONS, random.randint(3, 12)) # 随机关闭 3~12 个会话 ... time.sleep(15) # 每轮间隔 15 秒与常规测试 test_scale_up.py每轮仅random.randint(1, 3)个请求、每 5 轮固定关闭 20 个会话相比混沌测试的特点是更高的突发负载每轮 3~6 个并发请求峰值更猛随机关闭会话每轮随机关闭 3~12 个会话制造负载骤降抖动两轮之间无整批清空会话累积与随机释放交织使 Pod 数始终处于动态调整中。脚本还依赖 common.py 中的wait_for_count_matches进行回归防护它以 60 秒为超时上限轮询 Pod 数量一旦 Pod 数与期望值不一致期望值按每种浏览器类型分别计算ceil(会话数 / nodeMaxSessions)后求和见expected_pod_count就持续打印VALIDATING状态超时未收敛则抛出断言错误。注释明确说明这是针对 SeleniumHQ/docker-selenium#3167 的回归防护——该 issue 对应ScaledJob 策略对进行中会话重复计数导致 Pod 数无法收敛的历史缺陷。混沌场景测试结果job_count 策略 20 轮完整数据以下是 results_test_k8s_autoscaling_job_count_strategy_default_in_chaos.md 中记录的 20 轮混沌测试完整结果nodeMaxSessions默认为 1即每个 Pod 承载 1 个会话IterationNew request sessionsSessions created timeSessions failed to createNew pods scaled upTotal running sessionsTotal running podsMax sessions per podGapsSessions closed130.12 s30001002337.39 s03331033453.51 s04441044660.61 s06661065647.99 s06661066650.42 s06661037339.59 s03661068448.08 s04441049350.00 s033310310441.29 s044410411444.75 s044410412451.30 s044410413458.21 s044410414351.86 s033310315560.19 s055510416459.07 s045510517457.85 s044410418657.36 s066610619651.80 s066610520651.24 s0677107数据字段解读测试结果由 common.py 中的FIELD_NAMES统一定义每列含义如下字段含义Iteration迭代轮次1~20New request sessions本轮随机发起的并发会话请求数random.randint(3, 6)Sessions created time本轮从发起请求到全部会话创建成功或失败的耗时Sessions failed to create本轮创建失败的会话数请求数减去成功数New pods scaled up本轮新增的selenium-node-*运行中 Pod 数结束时 Pod 数减去开始时 Pod 数Total running sessions截至本轮结束时仍存活的总会话数Total running pods截至本轮结束时的总运行 Pod 数Max sessions per pod每个 Pod 的最大并发会话数本组测试恒为 1Gaps闲置容量 total_pods * nodeMaxSessions - total_sessions即已分配的槽位数 − 实际会话数Sessions closed本轮随机关闭的会话数Pod 数量的统计方式见 common.py 的 get_pod_count通过kubectl get pods -A --no-headers统计名称包含selenium-node-且状态为Running的 Pod。混沌场景数据的三层解读1. 首轮冷启动失败是预期行为而非缺陷第 1 轮数据非常关键请求 3 个会话3 个全部创建失败耗时仅 0.12 s且没有扩容任何 Pod。这在混沌测试中属正常现象测试刚开始时KEDA、ScaledJob 与 Node 尚在初始化会话队列尚未被 scaler 感知客户端请求因无可用 Node 而快速超时失败。test_scale_chaos.py的create_sessions_in_parallel会捕获这类异常并计入failed_sessions见 common.py因此该数据如实记录了冷启动窗口而不是测试 bug。2. Pod 冷启动主导了会话创建耗时从第 2 轮起每轮会话创建耗时稳定在37~61 秒区间如第 4 轮 60.61 s、第 13 轮 58.21 s、第 15 轮 60.19 s。这一耗时的量级对应的是会话请求进入队列 → KEDA 轮询到指标 → ScaledJob 创建 Job/Pod → Node 镜像拉取与启动 → Node 注册到 Hub → 会话被调度执行的完整冷启动链路。由于混沌场景每轮都会因随机关闭会话而产生新的扩容需求几乎每轮都涉及新 Pod 的冷启动因此耗时普遍高于常规测试常规测试中请求量较小、Pod 复用率高。3. 扩缩容的精确性与收敛性验证New pods scaled up与New request sessions几乎一一对应第 2 轮 3/3、第 4 轮 6/6、第 18 轮 6/6 等证实nodeMaxSessions1时 scaler 按一个待处理请求对应一个 Node精确扩容Gaps全部为 0这是本组测试最重要的结论——在所有 20 轮中total_pods × 1 - total_sessions恒等于 0说明 Pod 供给与实际会话需求完全匹配既没有过度供给浪费资源也没有供给不足请求积压。对比node_max_sessions版本如 results_test_k8s_autoscaling_job_count_strategy_default_with_node_max_sessions.md 中 Gaps 出现 12、16、19 等非零值可以反衬出当每个 Pod 承载多个槽位如 3而会话数不足以填满时会存在固有闲置容量这是多槽位配置下的正常现象Pod 不会立刻随会话关闭而缩容第 6 轮关闭 3 个会话后第 7 轮开始时仍保留 6 个 PodTotal running pods为 6待新请求补齐后才逐步调整。这是 KEDA ScaledJob 的冷却/排空机制在起作用——Job 需要等待运行中的会话结束按nodeMaxSessions排空后才退出避免中断进行中的浏览器任务收敛性回归防护生效每轮结束前都会调用wait_for_count_matches60 秒超时验证 Pod 数等于期望值整个 20 轮均未触发断言错误说明 patch 后的 scaler 在混沌负载下没有复现 #3167 的双重计数问题。与其他测试场景的横向对照将混沌结果与.keda目录下其余五份结果文档对照可形成完整的验证矩阵测试文档缩放策略负载模型关键观察job_count 常规ScaledJob每轮 1~3 请求每 5 轮关闭 20 会话前几轮因批量会话累积New pods scaled up与新请求一致Gaps 始终为 0job_count 混沌ScaledJob每轮 3~6 请求每轮随机关闭 3~12 会话首轮冷启动全部失败Gaps 恒为 0Pod 与需求精确匹配job_count nodeMaxSessionsScaledJob每轮 2~3 请求每个 Pod 3 槽位Gaps 出现非零值如 12、19、30扩缩按ceil(会话数/3)进行deployment_count 常规/混沌/多槽位 等三份ScaledObject同上三组负载Deployment 副本数方式Node 注册后常驻行为与 Job 排空机制不同需要特别说明deployment 与 job 两种策略在缩容时机上有本质差异——ScaledJob 的 Pod 是临时 Job任务排空后即退出ScaledObject 管理的是长期运行的 Deployment 副本。选择哪种策略取决于你对Node 常驻 vs 按需拉起的取舍。如何复现混沌测试本仓库的测试脚本可直接运行。根据 tests/README.md 的说明先安装依赖依赖清单见 tests/requirements.txtpython3 -m pip install -r tests/requirements.txt运行混沌场景测试REMOTE_SERVER_ADDRhttp://$(hostname -I | cut -d -f1)/selenium/wd/hub \ python3 -m unittest AutoscalingTests.test_scale_chaos运行常规扩容测试REMOTE_SERVER_ADDRhttp://$(hostname -I | cut -d -f1)/selenium/wd/hub \ python3 -m unittest AutoscalingTests.test_scale_up运行前提是集群中已通过 Helm Chart 部署 Selenium Grid 并启用autoscaling.enabledtrue该开关会同时安装 KEDA 子 Chart且 KEDA 使用本仓库维护的 patch 后 scaler 镜像。测试脚本会通过环境变量REMOTE_SERVER_ADDR指定 Grid 入口并以kubectl get pods实时统计 Node Pod 数。结果由 common.py 的导出函数 输出为tests/autoscaling_results.csv与 Markdown 表格文件即本仓库.keda下各结果文档的生成来源。脚本还支持两个环境变量调整行为TEST_AUTOSCALING_ITERATIONS迭代轮数默认 20与TEST_NODE_MAX_SESSIONS每 Pod 最大会话数默认 1用于复现多槽位场景。结论20 轮混沌测试数据表明在每轮 3~6 个并发请求、随机关闭 3~12 个会话的高抖动负载下job_count策略配合 patch 后的 Selenium Grid scaler 表现如下扩容精确New pods scaled up与排队请求一一对应Gaps 恒为 0无过度供给收敛可靠每轮都能在 60 秒超时内将 Pod 数收敛到期望值未触发 #3167 回归缩容稳健Pod 按会话排空机制渐进释放不中断进行中的会话冷启动代价可见37~61 秒的会话创建耗时主要由 Node Pod 冷启动构成是评估从 0 扩容场景时必须纳入预算的延迟。对于在生产环境使用 Selenium Grid KEDA 自动扩缩容的团队本测试结果可作为job_count策略调参nodeMaxSessions、冷却时间、冷启动延迟预算与容量规划的量化参考若需进一步研究 scaler 的匹配逻辑如 Edge 的sessionBrowserName、自定义capabilities匹配、enableManagedDownloads可直接阅读 scaler 触发规范 与 实现源码 及其 单元测试。赞分享测试后端云原生容器编排可观测性【免费下载链接】docker-seleniumProvides a simple way to run Selenium Grid with Chrome, Firefox, and Edge using Container Platform, making it easier to perform browser automation at scale项目地址https://gitcode.com/GitHub_Trending/do/docker-selenium点击查看免费下载相关推荐CANN PTO-ISA 点对点远程读带宽对比实战TGET 与 TGET_ASYNC 在 A2/A3 上的原理、基准测试与调优CANN PTO ISA 点对点远程读带宽对比实战TGET 与 TGET_ASYNC 在 A2/A3 上的原理、基准测试与调优 TGET同步远程读与 TG测试后端云原生容器编排可观测性Higress怎么用从一条命令启动到30大模型统一接入Higress怎么用从一条命令启动到30大模型统一接入 Higress 是一款云原生 API 网关AI 网关跑一条 Docker 命令就能拿到一个统一API网关后端云原生LLM 网关人工智能MCP 服务GraphQL混沌测试评估API弹性的故障注入策略GraphQL混沌测试评估API弹性的故障注入策略 你是否遇到过GraphQL API在生产环境中突然崩溃的情况用户投诉、服务中断、数据不一致——这些问题往API设计后端上一篇免费开源游戏神器如何用一台电脑实现800游戏本地分屏联机下一篇Mongoose 内置 TCP/IP 协议栈net_builtin安全审查实战指南攻击面、边界校验与驱动防护创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表