弹性伸缩策略基础:水平扩展 vs 垂直扩展、基于指标的策略

在平台工程中,弹性伸缩是保障服务稳定性与资源利用率的核心能力。本章聚焦于两种基本扩展模式——水平扩展与垂直扩展,以及基于关键指标的触发策略。理解这些基础是后续编排权限管理与安全实践的前提。

1. 水平扩展 vs 垂直扩展

扩展模式决定了当负载增加时,系统如何获取更多计算资源。下表从多个维度对比两种模式:

对比维度 水平扩展 (Scale Out/In) 垂直扩展 (Scale Up/Down)
操作方式 增加/减少实例数量 增加/减少单个实例的规格(CPU/内存)
扩展上限 理论上无限(受限于集群规模) 受限于单机硬件上限
故障域 分散风险,单点故障影响小 单点故障影响大
适用场景 无状态服务、微服务、分布式应用 有状态服务、单体应用、数据库
成本模型 通常使用更廉价的通用实例 高规格实例成本呈非线性增长
运维复杂度 需要负载均衡、服务发现、分布式协调 通常需要重启实例,可能涉及数据迁移
平台工程建议: 优先采用水平扩展作为默认策略,因为它能更好地利用云原生的弹性能力,并与容器编排平台(如 Kubernetes)的天然特性对齐。垂直扩展应作为补充,用于那些难以或无状态化的组件。

下图展示了两种扩展模式在 Kubernetes 环境下的典型架构差异:

水平扩展 vs 垂直扩展架构对比 水平扩展 (Scale Out) 负载均衡器 实例 A (2C4G) 实例 B (2C4G) 实例 C (2C4G) + 实例 D + 实例 E • 增加实例数量 • 每个实例规格不变 • 需要负载均衡分发流量 • 无状态服务首选 垂直扩展 (Scale Up) 实例 (2C4G) 当前规格 实例 (8C16G) 升级后规格 • 提升单实例规格 • 通常需要重启 • 受限于物理上限 • 适合有状态组件

2. 基于指标的弹性伸缩策略

弹性伸缩的核心驱动力是实时指标。平台工程中,最常用的指标包括 CPU 使用率、内存使用率和请求数(QPS/RPS)。这些指标通过监控系统采集,并作为触发扩缩容动作的信号。

2.1 核心指标详解

指标类型 含义 典型阈值 适用场景 注意事项
CPU 使用率 实例 CPU 时间占比 目标 60-80% 计算密集型服务 避免瞬时尖峰导致频繁抖动
内存使用率 已用内存占总内存比例 目标 70-85% 内存密集型服务、缓存 注意内存泄漏导致持续扩容
请求数 (QPS/RPS) 每秒请求数 根据压测结果设定 Web 服务、API 网关 需要结合请求延迟综合判断
关键陷阱: 单一指标可能导致误判。例如,CPU 使用率低但请求延迟高,可能表明存在锁竞争或 I/O 瓶颈,此时扩容 CPU 无法解决问题。建议采用多指标组合策略。

2.2 基于指标的伸缩流程

一个典型的基于指标的弹性伸缩流程包含以下步骤:

  1. 指标采集: 通过 Agent 或 Sidecar 从实例中采集 CPU、内存、请求数等原始数据。
  2. 聚合与平滑: 将原始数据按时间窗口(如 1 分钟、5 分钟)聚合,去除噪声和瞬时尖峰。
  3. 阈值评估: 将聚合后的指标与预设的扩缩容阈值进行比较。
  4. 决策执行: 如果指标超过扩容阈值,则触发扩容操作;如果低于缩容阈值并持续一段时间,则触发缩容。
  5. 冷却与稳定: 执行扩缩容后,进入冷却期,等待新实例就绪或指标稳定,避免频繁震荡。

下图展示了基于 CPU 和请求数的混合伸缩决策流程:

基于多指标的弹性伸缩决策流程 指标采集 聚合与平滑 (1min/5min) 阈值评估 CPU > 75% 触发扩容 (Scale Out) QPS > 阈值 触发扩容 (Scale Out) 未触发 维持当前实例数 冷却期 (Cooldown)

3. 策略选择与组合实践

在实际平台工程中,通常需要组合使用多种策略以达到最佳效果:

  • 默认策略: 以水平扩展为主,基于 CPU 和请求数组合指标。
  • 兜底策略: 设置垂直扩展作为紧急兜底,当水平扩展达到上限时触发。
  • 预测性策略: 结合历史数据,在业务高峰到来前预先扩容(如 Cron 定时策略)。
  • 安全策略: 设置最大/最小实例数限制,防止无限扩容导致成本失控或缩容导致服务不可用。
平台工程最佳实践: 在 Kubernetes 环境中,推荐使用 HorizontalPodAutoscaler (HPA) 实现水平扩展,结合 VerticalPodAutoscaler (VPA) 作为辅助。同时,通过 PodDisruptionBudget (PDB) 保障缩容时的服务可用性。务必为每个工作负载设置明确的 requests 和 limits,这是弹性伸缩准确工作的前提。
# 示例:Kubernetes HPA 配置(基于 CPU 和内存)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: example-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: example-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Percent
        value: 10
        periodSeconds: 60
    scaleUp:
      stabilizationWindowSeconds: 0
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15
      - type: Pods
        value: 4
        periodSeconds: 15
      selectPolicy: Max

上述配置中,stabilizationWindowSeconds 用于防止指标抖动导致的频繁扩缩容,selectPolicy: Max 表示在多种扩容策略中选择最大扩容数量,以快速响应突发流量。