弹性伸缩策略基础:水平扩展 vs 垂直扩展、基于指标的策略
在平台工程中,弹性伸缩是保障服务稳定性与资源利用率的核心能力。本章聚焦于两种基本扩展模式——水平扩展与垂直扩展,以及基于关键指标的触发策略。理解这些基础是后续编排权限管理与安全实践的前提。
1. 水平扩展 vs 垂直扩展
扩展模式决定了当负载增加时,系统如何获取更多计算资源。下表从多个维度对比两种模式:
| 对比维度 | 水平扩展 (Scale Out/In) | 垂直扩展 (Scale Up/Down) |
|---|---|---|
| 操作方式 | 增加/减少实例数量 | 增加/减少单个实例的规格(CPU/内存) |
| 扩展上限 | 理论上无限(受限于集群规模) | 受限于单机硬件上限 |
| 故障域 | 分散风险,单点故障影响小 | 单点故障影响大 |
| 适用场景 | 无状态服务、微服务、分布式应用 | 有状态服务、单体应用、数据库 |
| 成本模型 | 通常使用更廉价的通用实例 | 高规格实例成本呈非线性增长 |
| 运维复杂度 | 需要负载均衡、服务发现、分布式协调 | 通常需要重启实例,可能涉及数据迁移 |
平台工程建议: 优先采用水平扩展作为默认策略,因为它能更好地利用云原生的弹性能力,并与容器编排平台(如 Kubernetes)的天然特性对齐。垂直扩展应作为补充,用于那些难以或无状态化的组件。
下图展示了两种扩展模式在 Kubernetes 环境下的典型架构差异:
2. 基于指标的弹性伸缩策略
弹性伸缩的核心驱动力是实时指标。平台工程中,最常用的指标包括 CPU 使用率、内存使用率和请求数(QPS/RPS)。这些指标通过监控系统采集,并作为触发扩缩容动作的信号。
2.1 核心指标详解
| 指标类型 | 含义 | 典型阈值 | 适用场景 | 注意事项 |
|---|---|---|---|---|
| CPU 使用率 | 实例 CPU 时间占比 | 目标 60-80% | 计算密集型服务 | 避免瞬时尖峰导致频繁抖动 |
| 内存使用率 | 已用内存占总内存比例 | 目标 70-85% | 内存密集型服务、缓存 | 注意内存泄漏导致持续扩容 |
| 请求数 (QPS/RPS) | 每秒请求数 | 根据压测结果设定 | Web 服务、API 网关 | 需要结合请求延迟综合判断 |
关键陷阱: 单一指标可能导致误判。例如,CPU 使用率低但请求延迟高,可能表明存在锁竞争或 I/O 瓶颈,此时扩容 CPU 无法解决问题。建议采用多指标组合策略。
2.2 基于指标的伸缩流程
一个典型的基于指标的弹性伸缩流程包含以下步骤:
- 指标采集: 通过 Agent 或 Sidecar 从实例中采集 CPU、内存、请求数等原始数据。
- 聚合与平滑: 将原始数据按时间窗口(如 1 分钟、5 分钟)聚合,去除噪声和瞬时尖峰。
- 阈值评估: 将聚合后的指标与预设的扩缩容阈值进行比较。
- 决策执行: 如果指标超过扩容阈值,则触发扩容操作;如果低于缩容阈值并持续一段时间,则触发缩容。
- 冷却与稳定: 执行扩缩容后,进入冷却期,等待新实例就绪或指标稳定,避免频繁震荡。
下图展示了基于 CPU 和请求数的混合伸缩决策流程:
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 表示在多种扩容策略中选择最大扩容数量,以快速响应突发流量。