3. 脚本框架设计:主函数、配置模块、压测模块、巡检模块、报告模块的职责划分
一个健壮的 Kubernetes 环境容量压测巡检脚本,其核心在于模块化设计。清晰的职责划分不仅能提升代码的可维护性与可扩展性,还能让团队在调试与参数调优时快速定位问题。本章将详细拆解脚本的五大核心模块:主函数、配置模块、压测模块、巡检模块与报告模块,并明确各模块的输入、输出与边界。
设计原则:单一职责、高内聚低耦合、配置与逻辑分离、可观测性内置。
3.1 主函数 (main) — 流程编排与异常兜底
主函数是整个脚本的入口与调度中心。它不参与具体的业务逻辑,而是负责按顺序调用各模块,并处理全局异常与退出码。
| 职责 | 说明 |
|---|---|
| 初始化 | 加载配置模块,初始化日志系统,校验运行环境(kubeconfig、工具链)。 |
| 流程编排 | 按预设阶段调用压测模块、巡检模块,并控制阶段间的等待与同步。 |
| 异常兜底 | 捕获未预料的异常,记录错误上下文,确保脚本不会因单点故障而完全崩溃。 |
| 退出码管理 | 根据压测与巡检结果返回标准退出码(0: 成功, 1: 参数错误, 2: 压测失败, 3: 巡检异常)。 |
调试建议:在主函数入口处增加
--dry-run 参数,仅打印执行计划而不实际运行压测,便于验证配置与流程。
3.2 配置模块 (config) — 单一数据源与参数校验
配置模块负责解析、校验、存储所有运行时参数。它从 YAML 文件、命令行参数和环境变量中读取配置,并合并为统一的配置对象。
- 参数来源优先级:命令行参数 > 环境变量 > 默认配置文件 (config.yaml)。
- 核心配置项:
- 集群连接:
kubeconfig路径、context名称。 - 压测参数:并发数 (
concurrency)、持续时间 (duration)、QPS 目标、负载类型 (HTTP/gRPC/自定义)。 - 巡检参数:采集间隔 (
interval)、指标白名单、告警阈值。 - 报告参数:输出格式 (JSON/HTML/PDF)、存储路径。
- 集群连接:
- 校验逻辑:对数值范围、必填字段、文件可读性进行前置校验,校验失败时直接报错退出,避免运行时异常。
# config.yaml 示例片段
cluster:
kubeconfig: "/home/user/.kube/config"
context: "prod-cluster"
stress:
concurrency: 50
duration: "300s"
target_qps: 1000
inspect:
interval: "15s"
metrics: ["cpu", "memory", "network", "apiserver_latency"]
report:
format: "html"
output_dir: "/tmp/reports"
3.3 压测模块 (stress) — 负载生成与实时指标采集
压测模块是脚本的执行核心。它根据配置模块提供的参数,向 Kubernetes 集群注入可控负载,并在压测过程中实时采集关键性能指标。
| 子功能 | 职责 |
|---|---|
| 负载生成器 | 调用底层工具(如 hey、wrk、vegeta 或自定义 Go 客户端)发起请求。 |
| 阶段控制 | 支持预热期、稳态期、峰值期、恢复期,每个阶段可独立配置并发与持续时间。 |
| 实时指标采集 | 通过 Prometheus API 或 kubectl top 采集节点/Pod 的 CPU、内存、网络 I/O。 |
| 错误注入 | 可选功能:模拟 Pod 重启、网络延迟、资源限制,用于测试集群的韧性。 |
注意:压测模块必须内置熔断机制。当集群核心指标(如 API Server 延迟 > 5s 或节点内存使用率 > 95%)超过安全阈值时,自动终止压测并触发巡检模块进行快照采集。
3.4 巡检模块 (inspect) — 集群健康状态快照
巡检模块在压测前、压测中、压测后三个时间点执行集群健康状态检查,生成可对比的时序数据。
- 检查维度:
- 控制面:API Server 响应延迟、etcd 读写延迟、调度器队列深度。
- 数据面:节点资源使用率、Pod 状态分布、容器重启次数。
- 网络:CNI 插件健康、Service 连通性、DNS 解析成功率。
- 数据存储:每次巡检结果以时间戳为键存入内存中的环形缓冲区,供报告模块使用。
- 阈值告警:当巡检指标超过配置的阈值时,在日志中输出
WARNING级别信息,并标记报告中的对应时段为“风险”。
# 巡检模块核心数据结构 (Python 伪代码)
class InspectionSnapshot:
def __init__(self):
self.timestamp: float
self.api_server_latency_p99: float
self.node_cpu_avg: float
self.node_memory_avg: float
self.pod_restart_count: int
self.etcd_db_size: int
3.5 报告模块 (report) — 数据聚合与可视化输出
报告模块将压测与巡检的原始数据转化为结构化报告,支持多种输出格式,便于团队分析与归档。
| 输出格式 | 适用场景 | 包含内容 |
|---|---|---|
| JSON | CI/CD 管道、自动化分析 | 原始指标、时间戳、告警列表 |
| HTML | 人工阅读、邮件附件 | 趋势图、对比表、结论摘要 |
| 正式交付、客户汇报 | 封面、目录、详细数据、签名栏 |
报告模块还负责生成结论摘要,例如:
- 集群在目标 QPS 下是否稳定(基于 P99 延迟 < 200ms 且无错误响应)。
- 瓶颈点定位(CPU 饱和 / 内存不足 / 网络带宽限制)。
- 扩容建议(建议增加 Node 数量或调整 HPA 阈值)。
3.6 模块间协作流程
在实际运行中,五个模块按照以下时序协作:
- 启动阶段:主函数调用配置模块,加载并校验所有参数。若校验失败,直接退出并返回错误码 1。
- 压测前巡检:主函数调用巡检模块,采集集群基线状态,存入快照列表。
- 压测执行:主函数调用压测模块,开始注入负载。压测模块在运行期间持续向巡检模块发送“触发采集”信号。
- 压测中巡检:巡检模块按配置间隔自动采集集群状态,并与压测模块的实时指标合并。
- 压测后巡检:压测结束后,主函数再次调用巡检模块,采集恢复期状态。
- 报告生成:主函数将所有快照与压测数据传递给报告模块,生成最终报告。
关键设计决策:压测模块与巡检模块之间通过事件通道(Python
queue.Queue)通信,而非直接函数调用。这样即使巡检模块出现瞬时阻塞,也不会影响压测模块的负载生成精度。