3、压测节点概念与设计
3.1 什么是压测节点
压测节点(Load Testing Node)是 Kubernetes 集群中专门用于执行性能压测任务的专用工作负载载体。它通常以 DaemonSet 或 Deployment 形式部署,内部运行压测工具(如 Locust、k6、wrk2、vegeta)以及配套的指标采集、日志转发、健康检查等 Sidecar 容器。
压测节点与普通业务 Pod 的核心区别在于:压测节点是“施压者”而非“被压者”。它负责向目标服务(SUT,System Under Test)注入流量,同时实时采集自身资源消耗与目标响应数据。
关键定义:压测节点 = 压测引擎容器 + 指标采集容器 + 日志转发容器 + 资源预留配置 + 可观测性注入。它是一个复合工作负载单元,而非单一进程。
3.2 压测节点与普通工作节点的区别
| 对比维度 | 普通工作节点(Worker Node) | 压测节点(Load Testing Node) |
|---|---|---|
| 核心职责 | 运行业务 Pod,处理用户请求 | 向目标服务注入压测流量,采集性能数据 |
| 资源特征 | 按业务需求弹性伸缩,资源利用率波动大 | 资源预留固定,CPU/网络带宽常处于高水位 |
| 网络模型 | 通常为 ClusterIP/NodePort,对外暴露服务 | 通常为 HostNetwork 或 Macvlan,追求低延迟高吞吐 |
| 调度策略 | 默认调度器,按资源请求分配 | 需 taint/toleration 隔离,避免与业务 Pod 混部 |
| 可观测性 | 基础监控(CPU/内存/网络) | 额外采集:压测进度、QPS、P99 延迟、错误率、火焰图 |
| 生命周期 | 长期运行,滚动更新 | 按压测任务创建/销毁,常使用 Job 或 CronJob 驱动 |
| 安全约束 | 最小权限原则,限制 syscall | 可能需要 privileged 模式、调整内核参数(net.core.somaxconn 等) |
实践建议:压测节点应使用独立的节点池(Node Pool),通过
nodeSelector + taints 确保业务 Pod 不会被调度到压测节点上,避免压测流量干扰正常业务。
3.3 压测节点设计原则
压测节点的设计遵循三大核心原则:隔离性(Isolation)、弹性(Elasticity)、可观测性(Observability)。三者构成压测基础设施的稳定三角。
3.3.1 隔离性(Isolation)
- 资源隔离:压测节点独占 CPU 核、内存、网络带宽,通过 cgroup 限制和 NUMA 绑定避免资源争抢。
- 网络隔离:压测流量与业务流量分离,使用独立网卡或 VLAN,防止压测流量淹没业务网络。
- 调度隔离:对压测节点打上
load-testing=true标签,并设置NoSchedule污点,业务 Pod 默认不可调度至此节点。 - 存储隔离:压测日志、报告、火焰图等数据写入独立 PV,不与业务存储共用。
3.3.2 弹性(Elasticity)
- 按需扩缩:压测节点以 Deployment 或 StatefulSet 管理,通过 HPA(Horizontal Pod Autoscaler)或自定义指标(如 QPS 目标)动态调整副本数。
- 快速启动:压测镜像预装所有依赖,启动时间控制在 5 秒以内;使用 PDB(PodDisruptionBudget)保证最小可用副本。
- 任务级弹性:每个压测任务对应一个独立的压测节点组,任务结束后自动缩容至 0,释放资源。
3.3.3 可观测性(Observability)
- 指标采集:压测节点暴露 Prometheus 指标(QPS、延迟分布、错误率、CPU/内存/网络使用率),由 Prometheus Server 定期拉取。
- 日志收集:压测引擎日志、错误栈、慢请求日志通过 Fluentd 或 Vector 转发到 Elasticsearch 或 Loki。
- 链路追踪:压测请求携带 Trace ID,与 Jaeger 或 Zipkin 集成,追踪请求在目标服务中的完整调用链。
- 实时仪表盘:Grafana 面板实时展示压测进度、SLA 达标情况、资源瓶颈预警。
3.4 压测节点组件架构
一个完整的压测节点内部包含以下组件,各组件以 Sidecar 模式或 Init Container 模式协同工作:
| 组件名称 | 容器角色 | 功能描述 | 推荐镜像 |
|---|---|---|---|
| 压测引擎 | 主容器 | 执行压测脚本,生成并发流量,记录请求结果 | locustio/locust, grafana/k6 |
| 指标导出器 | Sidecar | 将压测引擎的内部指标(QPS、延迟、错误数)转换为 Prometheus 格式 | prom/statsd-exporter, nginx/nginx-prometheus-exporter |
| 日志采集器 | Sidecar | 读取压测引擎日志文件,结构化后发送到日志中心 | fluent/fluentd, timberio/vector |
| 资源监控 | Sidecar | 采集节点级 CPU、内存、网络、磁盘 IO 指标 | prom/node-exporter |
| 健康检查 | Init 容器 | 启动前验证目标服务可达性、压测脚本语法正确性 | busybox, curlimages/curl |
| 配置注入 | Init 容器 | 从 ConfigMap 或 Secret 拉取压测参数、目标地址、认证信息 | bitnami/kubectl, alpine |
3.5 压测节点部署清单示例
以下是一个符合上述设计原则的压测节点 Deployment 片段,展示了资源预留、污点容忍、Sidecar 注入等关键配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: load-testing-node
namespace: load-testing
spec:
replicas: 3
selector:
matchLabels:
app: load-testing-node
template:
metadata:
labels:
app: load-testing-node
spec:
# 调度到专用压测节点池
nodeSelector:
load-testing: "true"
tolerations:
- key: "load-testing"
operator: "Exists"
effect: "NoSchedule"
# 资源预留与限制
containers:
- name: locust
image: locustio/locust:2.31
resources:
requests:
cpu: "4"
memory: "8Gi"
limits:
cpu: "8"
memory: "16Gi"
env:
- name: TARGET_URL
value: "http://service-under-test.default.svc.cluster.local"
- name: LOCUST_USERS
value: "1000"
- name: LOCUST_SPAWN_RATE
value: "100"
- name: metrics-exporter
image: prom/statsd-exporter:v0.27.0
ports:
- containerPort: 9102
name: metrics
- name: log-collector
image: timberio/vector:0.42.0-alpine
volumeMounts:
- name: log-volume
mountPath: /var/log/locust
volumes:
- name: log-volume
emptyDir: {}
# 健康检查 Init 容器
initContainers:
- name: health-check
image: curlimages/curl:8.10.0
command:
- sh
- -c
- |
curl -sf http://service-under-test.default.svc.cluster.local/healthz || exit 1
echo "Target service is healthy, starting load test..."
注意:压测节点应避免使用
resources.limits 设置过低的 CPU 限制,否则压测引擎可能因 CPU 节流(Throttling)导致 QPS 不稳定。建议 limits.cpu 至少为 requests.cpu 的 1.5 倍。