2. 弹性伸缩基础:水平伸缩与垂直伸缩、弹性伸缩的触发条件、冷却时间与稳定性窗口
弹性伸缩是云原生架构中实现成本与性能平衡的核心手段。本章将系统梳理两种伸缩模式(水平与垂直)的差异、触发条件的设计原则,以及冷却时间与稳定性窗口这两个关键控制参数,为后续构建服务画像提供理论基础。
2.1 水平伸缩 vs 垂直伸缩
水平伸缩(Horizontal Scaling)与垂直伸缩(Vertical Scaling)是应对负载变化的两种基本路径。下表从多个维度对比两者的核心差异:
| 对比维度 | 水平伸缩(Scale Out/In) | 垂直伸缩(Scale Up/Down) |
|---|---|---|
| 操作对象 | 增加/减少实例数量 | 调整单个实例的资源配置(CPU、内存) |
| 扩容粒度 | 按整实例粒度(通常 1 个起) | 按资源规格阶梯(如 2C4G → 4C8G) |
| 生效速度 | 中等(需启动新实例、注册服务) | 较快(通常无需重启进程,部分场景需热迁移) |
| 架构要求 | 必须无状态或会话外置 | 对应用无特殊要求 |
| 资源上限 | 理论上无限(受集群规模限制) | 受单机物理上限约束 |
| 典型场景 | Web 服务、API 网关、无状态微服务 | 有状态中间件、数据库、单机批处理任务 |
| 成本模型 | 线性增长,按实例付费 | 阶梯式增长,高规格实例单价更高 |
关键原则:在云原生架构中,优先选择水平伸缩。水平伸缩天然适配容器化、不可变基础设施模式,且能通过 HPA(Horizontal Pod Autoscaler)实现自动化。垂直伸缩通常作为水平伸缩的补充,用于处理无法水平拆分的组件。
下图展示了两种伸缩模式在 Kubernetes 环境中的典型工作流程:
2.2 弹性伸缩的触发条件
触发条件是弹性伸缩策略的核心决策依据。设计不当的触发条件会导致频繁抖动(Thrashing)或响应滞后。常见的触发条件分为以下三类:
2.2.1 基于资源指标的触发
- CPU 使用率:最常用指标,适用于 CPU 密集型服务。典型目标值:40%–80%。
- 内存使用率:适用于内存密集型服务,需注意 GC 行为对指标的影响。
- 网络 I/O / 磁盘 I/O:适用于 I/O 密集型服务,通常作为辅助指标。
2.2.2 基于业务指标的触发
- QPS / RPS:每秒请求数,直接反映业务负载。需配合请求耗时分析。
- 请求延迟(P50 / P95 / P99):延迟升高通常意味着资源瓶颈,适合作为扩容信号。
- 队列深度:消息队列或任务队列中的积压数量,适用于异步处理场景。
- 并发连接数:适用于网关、长连接服务。
2.2.3 基于时间与事件的触发
- 定时伸缩(Cron-based):适用于可预测的周期性负载(如早高峰、促销活动)。
- 预测性伸缩:基于历史数据训练模型,提前扩容。
- 事件驱动:通过 Webhook 或自定义控制器响应特定事件(如大促开始、故障转移)。
最佳实践:生产环境中建议采用 复合触发条件。例如:CPU > 70% 且持续 3 分钟,或 P99 延迟 > 500ms 持续 1 分钟,任一条件满足即触发扩容。复合条件能有效降低误触发概率。
下表总结了不同触发条件的适用场景与注意事项:
| 触发条件类型 | 典型指标 | 适用场景 | 注意事项 |
|---|---|---|---|
| 资源指标 | CPU、内存 | 通用场景,所有服务 | 需排除闲置进程干扰;内存指标受缓存影响 |
| 业务指标 | QPS、延迟、队列深度 | 用户交互型服务、消息处理 | 指标采集延迟较高;需标准化业务指标暴露 |
| 时间/事件 | Cron 表达式、Webhook | 周期性负载、已知事件 | 无法应对突发流量;需配合其他条件兜底 |
2.3 冷却时间与稳定性窗口
冷却时间(Cooldown Period)和稳定性窗口(Stabilization Window)是防止弹性伸缩系统进入震荡状态的两个关键参数。两者协同工作,确保伸缩动作的平稳执行。
2.3.1 冷却时间
冷却时间是指一次伸缩动作完成后,系统必须等待的最短时间间隔,在此期间不会触发新的伸缩评估。其核心作用是:
- 等待实例就绪:新启动的 Pod 需要时间完成初始化、注册服务、接收流量,其资源指标在启动初期可能不具参考性。
- 避免连续伸缩:防止因指标短暂波动导致频繁扩容/缩容,造成资源浪费和服务抖动。
典型配置:Kubernetes HPA 默认冷却时间为 5 分钟(扩容)和 5 分钟(缩容)。生产实践中,扩容冷却时间建议设为 3–5 分钟,缩容冷却时间建议设为 5–10 分钟(缩容更保守)。
2.3.2 稳定性窗口
稳定性窗口是指系统在触发伸缩动作前,需要观察指标持续满足条件的最短时间。其核心作用是:
- 过滤瞬时毛刺:避免因秒级尖峰流量触发不必要的扩容。
- 确认趋势:确保负载变化是持续性趋势而非瞬时抖动。
下图展示了冷却时间与稳定性窗口在伸缩决策流程中的位置:
2.3.3 参数配置建议
| 参数 | 推荐范围 | 配置原则 |
|---|---|---|
| 扩容稳定性窗口 | 1–3 分钟 | 较短,确保快速响应负载上升 |
| 缩容稳定性窗口 | 5–15 分钟 | 较长,避免因负载短暂下降而过度缩容 |
| 扩容冷却时间 | 3–5 分钟 | 等待新实例完全就绪并接收流量 |
| 缩容冷却时间 | 5–10 分钟 | 更保守,防止频繁缩容导致服务质量下降 |
常见陷阱:将冷却时间设置过短(如 < 1 分钟)会导致伸缩系统震荡,实例频繁创建/销毁,不仅浪费资源,还可能触发下游服务的限流或熔断。建议通过服务画像中的“启动时间”和“预热时间”指标来校准冷却时间。
2.4 本章小结
- 水平伸缩是云原生首选模式,垂直伸缩作为补充手段。
- 触发条件应优先使用业务指标(QPS、延迟),辅以资源指标,并支持定时/事件触发。
- 冷却时间防止连续伸缩,稳定性窗口过滤瞬时波动,两者共同保障伸缩平稳性。
- 参数配置需结合服务画像中的启动时间、预热时间、指标波动特征进行调优。