2. 弹性伸缩基础概念:水平伸缩与垂直伸缩、基于指标与基于时间的伸缩策略、伸缩冷却与稳定窗口

弹性伸缩是平台工程团队为工作负载提供“按需分配、动态调整”能力的核心机制。理解其基础概念,是编排自动化伸缩任务的前提。本章将系统梳理伸缩的两种维度、两种触发策略,以及保障伸缩稳定性的关键参数。

2.1 水平伸缩 vs 垂直伸缩

伸缩操作本质上是对计算资源的调整,根据调整维度的不同,分为水平伸缩(Horizontal Scaling)和垂直伸缩(Vertical Scaling)。

对比维度 水平伸缩(Scale Out/In) 垂直伸缩(Scale Up/Down)
操作对象 实例数量(Pod / 虚拟机 / 容器副本数) 单个实例的规格(CPU / 内存 / 磁盘 IO)
典型场景 无状态微服务、Web 前端、API 网关 有状态数据库、传统单体应用、批处理作业
伸缩速度 较快(秒级到分钟级启动新副本) 较慢(需要重启实例或在线调整)
资源粒度 粗粒度(整份副本) 细粒度(按 vCPU / GB 内存调整)
架构要求 需支持无状态设计、负载均衡、会话共享 需支持热迁移或在线资源热插拔
成本模型 线性扩展,按副本数计费 阶梯式扩展,单实例规格越高单价越贵
平台工程关注点 副本数上限/下限、HPA 配置、PodDisruptionBudget 实例规格模板、VPA 配置、重启策略
平台工程建议: 优先为无状态工作负载启用水平伸缩,它天然适配云原生弹性模型。垂直伸缩更适合作为数据库等有状态服务的“兜底”策略,或与水平伸缩配合使用(例如先垂直扩容到最大规格,再水平扩容)。
水平伸缩 vs 垂直伸缩 水平伸缩(Scale Out/In) App v1 App v1 App v1 负载均衡器 Scale In(减少副本) Scale Out(增加副本) 垂直伸缩(Scale Up/Down) 单实例:2 vCPU / 4 GB 单实例:4 vCPU / 8 GB 单实例:8 vCPU / 16 GB Scale Up Scale Down

2.2 基于指标与基于时间的伸缩策略

伸缩策略决定了“何时触发伸缩”。平台工程团队需要为不同工作负载选择合适的策略类型,或组合使用。

2.2.1 基于指标的伸缩(Metric-Based Scaling)

根据实时监控数据自动调整副本数或规格,是弹性伸缩的“自动驾驶”模式。

  • 资源指标: CPU 使用率、内存使用率、磁盘 IOPS、网络带宽。
  • 业务指标: QPS(每秒查询数)、请求延迟 P99、队列深度、并发连接数。
  • 自定义指标: 通过 Prometheus / Datadog 等监控系统暴露的任意指标。

2.2.2 基于时间的伸缩(Time-Based Scaling)

根据预设的时间计划表执行伸缩操作,适用于可预测的流量模式。

  • 固定时间窗口: 工作日 9:00-18:00 扩容,夜间缩容。
  • 周期性模式: 每月初财务结算期扩容,月底缩容。
  • 一次性计划: 大促活动前 1 小时预扩容,活动结束后缩容。
对比维度 基于指标伸缩 基于时间伸缩
触发方式 实时指标阈值 / 目标值 Cron 表达式 / 日历计划
响应速度 秒级到分钟级(取决于指标采集周期) 准时执行(秒级精度)
适用场景 流量波动不可预测、突发流量 流量模式固定、可提前规划
风险 指标抖动导致频繁伸缩(需配合冷却窗口) 无法应对计划外的流量突增
平台工程编排 配置 HPA / VPA / KEDA ScaledObject 配置 CronHPA / 定时任务 + 伸缩 API
最佳实践: 将基于时间的伸缩作为“预调节”手段,将基于指标的伸缩作为“实时微调”手段。例如:大促期间先按时间计划扩容到 80% 预期容量,再让指标伸缩在 20% 范围内动态调整。
伸缩策略触发流程对比 基于指标伸缩 监控系统采集指标 阈值评估 触发伸缩动作 调整副本数/规格 基于时间伸缩 Cron 计划表匹配 时间窗口判断 执行预定义伸缩 调整副本数/规格

2.3 伸缩冷却与稳定窗口

冷却(Cooldown)和稳定窗口(Stabilization Window)是防止伸缩“震荡”的关键机制。平台工程团队在编排伸缩任务时,必须为每个工作负载合理配置这两个参数。

2.3.1 冷却时间(Cooldown Period)

一次伸缩操作完成后,等待下一次评估开始前必须经过的“静默期”。

  • 作用: 等待新副本启动完成、指标稳定、负载均衡器更新路由。
  • 典型值: 30 秒 ~ 5 分钟(取决于应用启动时间)。
  • 风险: 冷却过短 → 伸缩震荡;冷却过长 → 响应滞后。

2.3.2 稳定窗口(Stabilization Window)

在触发伸缩动作前,指标必须持续超出阈值的时间长度。

  • 作用: 过滤瞬时尖峰或毛刺,避免对短暂波动做出过度反应。
  • 典型值: 1 分钟 ~ 10 分钟。
  • 风险: 窗口过短 → 对毛刺敏感;窗口过长 → 扩容不及时。
参数 冷却时间 稳定窗口
触发时机 伸缩操作完成后 伸缩操作触发前
核心目的 等待系统稳定,避免连续伸缩 确认趋势,过滤瞬时波动
配置位置 HPA / VPA / 伸缩策略定义 HPA / VPA / 指标查询配置
Kubernetes 示例 --horizontal-pod-autoscaler-downscale-stabilization behavior.scaleDown.stabilizationWindowSeconds
平台工程建议 缩容冷却 > 扩容冷却(缩容更保守) 缩容稳定窗口 > 扩容稳定窗口
常见陷阱: 只配置冷却时间而忽略稳定窗口,或两者配置值相同。正确的做法是:稳定窗口用于“确认趋势”,冷却时间用于“等待生效”。两者配合使用才能有效抑制伸缩震荡。

2.3.3 伸缩行为配置示例(Kubernetes HPA)

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: payment-service-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: payment-service
  minReplicas: 2
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300   # 缩容稳定窗口 5 分钟
      policies:
      - type: Percent
        value: 10
        periodSeconds: 60
      selectPolicy: Min
    scaleUp:
      stabilizationWindowSeconds: 60    # 扩容稳定窗口 1 分钟
      policies:
      - type: Percent
        value: 100
        periodSeconds: 60
      selectPolicy: Max
平台工程编排要点: 在自助服务门户中,将冷却时间和稳定窗口暴露为“高级配置”参数,并为不同工作负载类型提供推荐值模板(例如:无状态微服务推荐扩容稳定窗口 60s,缩容稳定窗口 300s;批处理作业推荐扩容稳定窗口 120s,缩容稳定窗口 600s)。