Headlamp 负载测试实战:用 KWOK 与 load-tests 脚本模拟万级 Pod 集群

发布时间:2026/9/17 20:41:53
Headlamp 负载测试实战:用 KWOK 与 load-tests 脚本模拟万级 Pod 集群 Headlamp 负载测试实战用 KWOK 与 load-tests 脚本模拟万级 Pod 集群【免费下载链接】headlampA Kubernetes web UI that is fully-featured, user-friendly and extensible项目地址: https://gitcode.com/GitHub_Trending/he/headlamp本篇技术指南围绕 Headlamp 官方测试文档 docs/development/testing.md 展开系统讲解如何回答一个核心问题Headlamp 在繁忙的大规模集群中能否流畅工作文章覆盖负载测试目标的设定、基于 KWOKKubernetes WithOut Kubelet的低资源消耗集群模拟方案、load-tests目录下负载生成脚本的完整用法与源码级原理以及测试结束后的清理流程。读完本文你将掌握一套可在本地机器上复现的、覆盖万级 Pod 与多集群场景的 Headlamp 性能验证方案。Headlamp 为什么要做负载测试Headlamp 是一个功能完整、易用且可扩展的 Kubernetes Web UI见仓库根目录 README.md。作为面向集群的界面它需要持续从 Kubernetes API server 拉取资源、维护缓存并渲染列表因此集群中资源数量会直接影响它的响应速度与资源占用。负载测试要回答的就是文档开头提出的那个问题Can Headlamp work well with busy clusters?即 Headlamp 能否在繁忙集群下依然保持良好的交互体验。测试方法很直观在集群中制造负载运行 Headlamp并与低负载场景对比观察其表现对比维度包括性能画像performance profiles、CPU/内存占用、主观操作感受feel。官方文档给出的初始测试上限如下资源类型测试数量Pods10,000Nodes1,000Events10,000Clusters15上限 300KWOK低资源消耗的大规模集群模拟方案真实创建上千个节点、上万个 Pod 需要庞大的硬件资源普通开发机根本无法承受。为此官方文档推荐使用KWOKKubernetes WithOut Kubelet。KWOK 是一个工具包能够在数秒内搭建一个包含数千节点的模拟集群——所有节点都被模拟成与真实节点行为一致但资源占用极低可以轻松在你的机器上运行。KWOK 的安装方式请参考官方安装文档kwok.sigs.k8s.io/docs/user/installation/仓库侧只需准备可用的kubectl、Node.jsload-tests脚本依赖 npm 与yargs见 load-tests/package.json。创建与删除 KWOK 集群如果你需要从零开始或想重置测试环境可以删除旧集群并创建一个全新的kwokctl delete cluster kwokctl create cluster创建完成后务必确认你的 kubectl 当前上下文指向 KWOK 集群kubectl config get-contexts这是一个硬性前提仓库中的负载生成脚本会强制校验当前上下文必须为kwok-前缀否则直接报错退出。该校验实现在 load-tests/scripts/helpers.js 的assertContextKwok()函数中它通过kubectl config current-context获取当前上下文若不以kwok-开头则打印错误并以退出码 1 终止防止误把负载灌进真实生产集群。生成初始负载数据确认上下文正确后进入load-tests目录安装依赖并生成初始数据cd load-tests npm install echo Creating initial activity: 900 nodes, 9000 pods, and 1000 events node scripts/create-nodes.js 900 0 node scripts/create-pods.js 9000 0 node scripts/create-events.js 1000 0 node scripts/create-deployments.js 500 0 node scripts/create-clusters.js 15 0上述命令会在最短时间内生成约900 个节点、9000 个 Pod、1000 个事件另外还会创建 500 个 Deployment 与 15 个 KWOK 集群用于验证 Headlamp 的多集群场景。脚本参数说明所有脚本遵循统一的命令行接口基于yargs解析见各脚本源码node scripts/create-资源.js 数量 [sleepInterval]数量必填要创建的资源个数sleepInterval可选默认 0第二个参数在create-nodes、create-pods、create-events、create-deployments脚本中已被标记为Deprecated已废弃仅为了向后兼容而保留实际会被忽略——也就是说当前版本会以最快速度一次性创建所有资源而在create-clusters.js中它仍然生效表示创建每个集群之间的间隔秒数源码中通过await setTimeout(sleepInterval * 1000)实现。create-clusters还额外支持--delete或-d选项用于删除集群而不是创建。持续生成活动负载初始数据只是静态快照真实集群中资源会持续变化。为了模拟繁忙状态可以在初始数据加载完成后并行运行持续制造变化的脚本echo --------------- echo creating 1 node, 1 pod, and 1 event per second node scripts/create-events.js 9000 1 node scripts/create-nodes.js 100 1 node scripts/create-pods.js 1000 1 三个命令通过在后台并行执行效果如下事件每秒 1 个累计最多 9000 个事件节点每秒 1 个累计新增 100 个节点Pod每秒 1 个累计新增 1000 个 Pod。持续变化的数据流能有效检验 Headlamp 前端在资源频繁增删watch 事件触发、列表刷新、缓存失效时的稳定性与流畅度。负载生成脚本的源码级剖析load-tests目录下的脚本非常轻量核心逻辑高度一致拼装 YAML → 批量kubectl apply。以下按脚本逐一说明其生成资源的细节。create-nodes.js模拟节点脚本位于 load-tests/scripts/create-nodes.js。每个节点的 YAML 都带有 KWOK 特有的标注与污点注解kwok.x-k8s.io/node: fake标记该节点由 KWOK 模拟标签type: kwok与kubernetes.io/hostname: kwok-node-${index}用于标识与调度关键点spec 中设置了taintskwok.x-k8s.io/nodefake:NoSchedule避免真实 Pod 被调度到这些模拟节点上status 中声明了allocatable与capacity每节点 32 CPU、256Gi 内存、可容纳 110 个 Podphase: Running。create-pods.js以 Deployment 形式创建 Pod脚本位于 load-tests/scripts/create-pods.js。每个Pod实际是一个replicas: 1的 Deployment名为fake-pod-${index}位于default命名空间其 Pod 模板包含nodeAffinity要求调度到typekwok的节点tolerations容忍kwok.x-k8s.io/node的NoSchedule污点容器使用假镜像fake-image不会真正拉取运行。create-events.js无意义事件脚本位于 load-tests/scripts/create-events.js。事件名形如lorem-event-${index}-${时间戳}type: Warningmessage 是一段 Lorem ipsum 占位文本involvedObject.kind为someObject。它也会在require.main module时才执行命令行解析同时导出了eventYaml供测试复用。create-deployments.jsnginx 部署脚本位于 load-tests/scripts/create-deployments.js。生成nginx-deployment-${index}镜像为nginx:1.14.2containerPort随索引递增${index 80}。create-clusters.js多集群编排脚本位于 load-tests/scripts/create-clusters.js。与前面几个脚本不同它不再拼 YAML而是循环执行kwokctl create cluster --namemeow-${x}--delete时执行kwokctl delete cluster每个集群之间按sleepInterval秒间隔休眠。注意其上下文校验被注释掉了// assertContextKwok();因为kwokctl自行管理集群与当前 kubectl 上下文无关。batchApply批量提交的性能关键所有资源创建都依赖 load-tests/scripts/helpers.js 中的batchApply(yamls, batchSize 500)。它会将每批最多 500 个 YAML 文档用---分隔符拼接成多文档 YAML 字符串通过单次kubectl apply -f -stdin 输入提交整批资源每批打印进度日志Batch N/M: applied ...设置maxBuffer: 100 * 1024 * 1024容纳大批量输出。其注释明确说明了设计动机将进程启动开销从 O(n) 降到 O(n/batchSize)使创建 20,000 个资源从约 25 分钟缩短到约 30 秒。batchApply还会校验batchSize必须是正整数否则抛出RangeError。脚本正确性由单元测试保障load-tests目录自带 Node 内置 test runner 的单元测试load-tests/scripts/helpers.test.js可通过npm test即node --test scripts/*.test.js见 load-tests/package.json运行。测试覆盖batchApply按配置的批大小正确合并资源、命令为kubectl apply -f -中间批次失败时停止并向上抛出错误对 0、负数、小数等非法批大小抛出RangeError。测试完成后的集群清理测试结束后务必清理环境。文档特别提醒KWOK 集群即使在空闲时也会占用大量资源因为 Kubernetes API server 空闲时同样消耗资源。因此清理是测试流程的必要收尾步骤kwokctl delete cluster --namekwok node scripts/create-clusters.js 15 0 --delete第一条命令删除主 KWOK 集群第二条通过--delete选项批量删除前面创建的 15 个meow-*集群。如何评估 Headlamp 的表现负载就绪后按 docs/development/index.md 中的开发指引启动 Headlampnpm start或分别运行npm run backend:start/npm run frontend:start然后在浏览器中打开界面从三个层面与低负载场景对比性能画像观察页面加载、列表滚动、资源详情切换等操作的响应速度是否有明显劣化CPU/内存借助系统监控工具对比 Headlamp 进程在高、低负载下的资源占用曲线主观感受UI 交互是否卡顿、是否出现长时间 loading 或白屏。需要说明的是官方文档当前把 10,000 Pod / 1,000 Node / 10,000 Event / 15 Cluster 定义为起步阶段to begin with的测试上限300 个集群为上限参考值这些数字是测试基准而非性能承诺。如果你在真实压测中发现了性能瓶颈可以结合 Headlamp 的 telemetry 能力OpenTelemetry 与 Prometheus参见 docs/development/telemetry.md进一步定位问题。整套方案的价值在于你不需要任何重型硬件只靠一台开发机和 KWOK load-tests脚本就能在几分钟内复现一个万级 Pod 多集群的高压环境为 Headlamp 的性能验证、版本回归和前端优化提供可量化的测试基础设施。【免费下载链接】headlampA Kubernetes web UI that is fully-featured, user-friendly and extensible项目地址: https://gitcode.com/GitHub_Trending/he/headlamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考