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 在繁忙的大规模集群中能否流畅工作?文章覆盖负载测试目标的设定、基于 KWOK(Kubernetes 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)。
官方文档给出的初始测试上限如下:
| 资源类型 | 测试数量 |
|---|---|
| Pods | 10,000 |
| Nodes | 1,000 |
| Events | 10,000 |
| Clusters | 15(上限 300) |
KWOK:低资源消耗的大规模集群模拟方案
真实创建上千个节点、上万个 Pod 需要庞大的硬件资源,普通开发机根本无法承受。为此,官方文档推荐使用KWOK(Kubernetes WithOut Kubelet)。KWOK 是一个工具包,能够在数秒内搭建一个包含数千节点的模拟集群——所有节点都被模拟成与真实节点行为一致,但资源占用极低,可以轻松在你的机器上运行。
KWOK 的安装方式请参考官方安装文档(kwok.sigs.k8s.io/docs/user/installation/),仓库侧只需准备:可用的kubectl、Node.js(load-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 中设置了
taints(kwok.x-k8s.io/node=fake:NoSchedule),避免真实 Pod 被调度到这些模拟节点上; - status 中声明了
allocatable与capacity:每节点 32 CPU、256Gi 内存、可容纳 110 个 Pod,phase: Running。
create-pods.js:以 Deployment 形式创建 Pod
脚本位于 load-tests/scripts/create-pods.js。每个"Pod"实际是一个replicas: 1的 Deployment(名为fake-pod-${index},位于default命名空间),其 Pod 模板包含:
nodeAffinity:要求调度到type=kwok的节点;tolerations:容忍kwok.x-k8s.io/node的NoSchedule污点;- 容器使用假镜像
fake-image,不会真正拉取运行。
create-events.js:无意义事件
脚本位于 load-tests/scripts/create-events.js。事件名形如lorem-event-${index}-${时间戳},type: Warning,message 是一段 Lorem ipsum 占位文本,involvedObject.kind为someObject。它也会在require.main === module时才执行命令行解析,同时导出了eventYaml供测试复用。
create-deployments.js:nginx 部署
脚本位于 load-tests/scripts/create-deployments.js。生成nginx-deployment-${index},镜像为nginx:1.14.2,containerPort随索引递增(${index + 80})。
create-clusters.js:多集群编排
脚本位于 load-tests/scripts/create-clusters.js。与前面几个脚本不同,它不再拼 YAML,而是循环执行kwokctl create cluster --name=meow-${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 --name=kwok node scripts/create-clusters.js 15 0 --delete第一条命令删除主 KWOK 集群,第二条通过--delete选项批量删除前面创建的 15 个meow-*集群。
如何评估 Headlamp 的表现
负载就绪后,按 docs/development/index.md 中的开发指引启动 Headlamp(npm 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),仅供参考