4. 自动扩缩容原理:水平Pod自动扩缩(HPA)、垂直Pod自动缩(VPA)、集群节点自动扩缩(CA)
在Serverless集群中,自动扩缩容是保障服务稳定性与资源利用率的核心机制。Kubernetes原生提供了三种互补的自动扩缩维度:水平Pod自动扩缩(HPA)、垂直Pod自动扩缩(VPA)和集群节点自动扩缩(CA)。理解这三者的原理、适用场景及协同关系,是进行容量规划的基础。
4.1 水平Pod自动扩缩(HPA)
HPA通过动态调整工作负载的Pod副本数量,来应对业务流量的变化。其核心逻辑是一个控制循环,周期性地采集指标,计算期望副本数,并更新Deployment或StatefulSet的replicas字段。
4.1.1 工作原理
- 指标采集:HPA控制器通过Metrics Server或自定义指标API(如Prometheus Adapter)获取Pod的当前资源使用率(如CPU、内存)或自定义业务指标(如QPS、请求延迟)。
- 期望副本计算:使用公式
期望副本数 = ceil(当前副本数 × (当前指标值 / 目标指标值))进行计算。 - 更新与冷却:HPA将计算结果写入目标工作负载的spec.replicas,并遵循冷却窗口(--horizontal-pod-autoscaler-downscale-stabilization-window,默认5分钟)防止频繁抖动。
关键公式:
desiredReplicas = ceil[currentReplicas * (currentMetricValue / desiredMetricValue)]
desiredReplicas = ceil[currentReplicas * (currentMetricValue / desiredMetricValue)]
4.1.2 典型配置示例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: serverless-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: serverless-app
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Pods
pods:
metric:
name: requests_per_second
target:
type: AverageValue
averageValue: 1000
4.1.3 适用场景与局限
| 维度 | 说明 |
|---|---|
| 适用场景 | 无状态服务、Web应用、API网关、微服务等流量波动明显的场景。 |
| 主要局限 | 无法解决单个Pod资源不足导致的性能瓶颈;扩容存在延迟(指标采集周期+冷却窗口)。 |
| 容量规划要点 | 需合理设置minReplicas保证基础容量,maxReplicas防止资源耗尽,目标利用率需结合业务SLA设定。 |
容量规划建议: 对于延迟敏感型Serverless应用,建议将HPA的目标CPU利用率设置在50%-70%之间,预留足够的突发缓冲空间,避免因扩容延迟导致请求超时。
4.2 垂直Pod自动扩缩(VPA)
VPA专注于调整单个Pod的CPU和内存资源请求(requests)与限制(limits),使Pod获得与其实际负载匹配的资源配额,避免资源浪费或不足。
4.2.1 工作模式
- Recommender(推荐器):基于历史指标和OOM事件,生成资源推荐值。
- Updater(更新器):驱逐需要调整资源的Pod,使其在重新创建时应用新的资源规格。
- Admission Controller(准入控制器):在Pod创建时,自动注入VPA推荐的资源值。
4.2.2 更新策略
| 策略 | 行为 | 适用场景 |
|---|---|---|
| Auto | 自动驱逐Pod并更新资源,需要Pod支持原地重启或重建。 | 无状态服务,可接受短暂中断。 |
| Recreate | 与Auto类似,但明确要求重建Pod。 | 需要完全重新调度的工作负载。 |
| Initial | 仅在Pod创建时设置推荐值,之后不再更新。 | 避免运行时驱逐,适合有状态服务。 |
| Off | 仅提供推荐值,不执行任何自动操作。 | 人工审核推荐值后再手动调整。 |
重要限制: VPA目前不能与HPA同时基于CPU/内存指标使用。如果HPA已基于CPU利用率进行扩缩,启用VPA会导致两者相互冲突。通常建议:HPA负责水平扩缩,VPA负责优化Pod资源规格,两者通过不同的指标维度(如HPA用QPS,VPA用CPU)或错开使用来避免冲突。
4.3 集群节点自动扩缩(CA)
CA负责在集群层面管理计算节点(Node)的数量。当集群资源不足,Pod无法被调度时,CA会触发节点扩容;当节点利用率过低且Pod可以被重新调度到其他节点时,CA会缩容节点。
4.3.1 触发条件
- 扩容触发:Pod处于Pending状态,原因是资源不足(CPU、内存、端口等),且该Pod不属于DaemonSet或已设置容忍度。
- 缩容触发:节点上所有Pod的CPU和内存请求总和低于阈值(默认50%),且所有Pod都可以被调度到其他节点。
4.3.2 与HPA/VPA的协同关系
在Serverless集群中,三种扩缩容机制形成完整的资源供给链路:
4.3.3 容量规划中的关键配置
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 缩容阈值 | 50% 节点资源利用率 | 低于此值时CA考虑缩容节点,避免资源碎片。 |
| 扩容缓冲 | 10%-20% 额外资源 | 在节点资源使用率达到80%-90%时提前扩容,应对突发流量。 |
| 节点组最小/最大 | 根据业务波峰波谷设定 | 最小节点数保障基础容量,最大节点数控制成本上限。 |
| 缩容冷却时间 | 10-15分钟 | 避免因短暂流量下降导致节点频繁上下线。 |
4.4 三种扩缩容机制的对比总结
| 维度 | HPA | VPA | CA |
|---|---|---|---|
| 扩缩对象 | Pod 副本数 | Pod 资源规格(requests/limits) | 集群节点数 |
| 响应速度 | 秒级到分钟级 | 分钟级(需Pod重建) | 分钟级到十分钟级(需云商接口) |
| 主要指标 | CPU、内存、自定义指标 | 历史资源使用率、OOM事件 | Pod调度状态、节点资源利用率 |
| 成本影响 | 间接影响(Pod数量变化) | 直接影响(Pod资源单价变化) | 直接影响(节点数量变化) |
| 容量规划角色 | 应对流量波动,保障SLA | 优化资源规格,减少浪费 | 保障集群整体资源池充足 |
核心结论: 在Serverless集群容量规划中,HPA、VPA和CA三者缺一不可。HPA解决“需要多少个Pod”的问题,VPA解决“每个Pod需要多少资源”的问题,CA解决“集群是否有足够节点”的问题。合理的配置顺序是:先通过VPA优化Pod资源规格,再通过HPA设置合理的扩缩阈值,最后通过CA保障底层资源池的弹性供给。