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 达标情况、资源瓶颈预警。
压测节点设计原则三角架构 压测节点设计原则三角架构 隔离性 Isolation 弹性 Elasticity 可观测性 Observability 压测节点设计必须同时满足隔离性、弹性、可观测性,三者缺一不可。 隔离性保障业务安全,弹性控制成本,可观测性提供决策依据。

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
压测节点内部组件架构 压测节点 Pod 内部组件架构 压测节点 Pod 边界 压测引擎 主容器 指标导出器 Sidecar 日志采集器 Sidecar 资源监控 Sidecar Init 容器 健康检查+配置注入 所有 Sidecar 共享同一个 Pod 网络命名空间和存储卷,通过 localhost 通信

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 倍。