2. 弹性伸缩基础概念:水平伸缩与垂直伸缩、基于指标与基于时间的伸缩策略、伸缩冷却与稳定窗口
弹性伸缩是平台工程团队为工作负载提供“按需分配、动态调整”能力的核心机制。理解其基础概念,是编排自动化伸缩任务的前提。本章将系统梳理伸缩的两种维度、两种触发策略,以及保障伸缩稳定性的关键参数。
2.1 水平伸缩 vs 垂直伸缩
伸缩操作本质上是对计算资源的调整,根据调整维度的不同,分为水平伸缩(Horizontal Scaling)和垂直伸缩(Vertical Scaling)。
| 对比维度 | 水平伸缩(Scale Out/In) | 垂直伸缩(Scale Up/Down) |
|---|---|---|
| 操作对象 | 实例数量(Pod / 虚拟机 / 容器副本数) | 单个实例的规格(CPU / 内存 / 磁盘 IO) |
| 典型场景 | 无状态微服务、Web 前端、API 网关 | 有状态数据库、传统单体应用、批处理作业 |
| 伸缩速度 | 较快(秒级到分钟级启动新副本) | 较慢(需要重启实例或在线调整) |
| 资源粒度 | 粗粒度(整份副本) | 细粒度(按 vCPU / GB 内存调整) |
| 架构要求 | 需支持无状态设计、负载均衡、会话共享 | 需支持热迁移或在线资源热插拔 |
| 成本模型 | 线性扩展,按副本数计费 | 阶梯式扩展,单实例规格越高单价越贵 |
| 平台工程关注点 | 副本数上限/下限、HPA 配置、PodDisruptionBudget | 实例规格模板、VPA 配置、重启策略 |
平台工程建议: 优先为无状态工作负载启用水平伸缩,它天然适配云原生弹性模型。垂直伸缩更适合作为数据库等有状态服务的“兜底”策略,或与水平伸缩配合使用(例如先垂直扩容到最大规格,再水平扩容)。
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% 范围内动态调整。
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)。