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 环境中的典型工作流程:

水平伸缩 vs 垂直伸缩工作流程对比 水平伸缩(HPA) Metrics Server 采集 Pod 指标 (CPU / 内存 / 自定义指标) HPA Controller 计算期望副本数 desiredReplicas = ceil(currentUtil / targetUtil) 调整 Deployment / StatefulSet 副本数 创建 / 销毁 Pod 进入冷却时间 / 稳定性窗口 等待下次评估周期 垂直伸缩(VPA) VPA Recommender 采集资源使用 (历史百分位 + OOM 事件) 生成资源推荐(Request / Limit) lowerBound / target / upperBound VPA Updater 执行资源变更 原地更新 / 驱逐重建 Pod 进入冷却时间 / 稳定性窗口 等待下次推荐周期

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 稳定性窗口

稳定性窗口是指系统在触发伸缩动作前,需要观察指标持续满足条件的最短时间。其核心作用是:

  • 过滤瞬时毛刺:避免因秒级尖峰流量触发不必要的扩容。
  • 确认趋势:确保负载变化是持续性趋势而非瞬时抖动。

下图展示了冷却时间与稳定性窗口在伸缩决策流程中的位置:

冷却时间与稳定性窗口在伸缩决策中的位置 指标采集 每 15s 一次 稳定性窗口检查 指标持续达标 ≥ N 分钟 执行伸缩动作 调整副本数 / 资源 冷却时间 等待 N 分钟 冷却期间不进行新的伸缩评估 关键参数关系: 稳定性窗口(Stabilization Window)决定“何时触发”,冷却时间(Cooldown Period)决定“触发后何时允许再次触发”。 两者共同构成伸缩策略的“防抖”机制,缺一不可。

2.3.3 参数配置建议

参数 推荐范围 配置原则
扩容稳定性窗口 1–3 分钟 较短,确保快速响应负载上升
缩容稳定性窗口 5–15 分钟 较长,避免因负载短暂下降而过度缩容
扩容冷却时间 3–5 分钟 等待新实例完全就绪并接收流量
缩容冷却时间 5–10 分钟 更保守,防止频繁缩容导致服务质量下降
常见陷阱:将冷却时间设置过短(如 < 1 分钟)会导致伸缩系统震荡,实例频繁创建/销毁,不仅浪费资源,还可能触发下游服务的限流或熔断。建议通过服务画像中的“启动时间”和“预热时间”指标来校准冷却时间。

2.4 本章小结

  • 水平伸缩是云原生首选模式,垂直伸缩作为补充手段。
  • 触发条件应优先使用业务指标(QPS、延迟),辅以资源指标,并支持定时/事件触发。
  • 冷却时间防止连续伸缩,稳定性窗口过滤瞬时波动,两者共同保障伸缩平稳性。
  • 参数配置需结合服务画像中的启动时间、预热时间、指标波动特征进行调优。