弹性伸缩原理:水平与垂直伸缩、触发条件与 Kubernetes HPA/VPA/CPA 概述

弹性伸缩是云原生架构应对负载波动的核心能力,其本质是根据预设策略自动调整计算资源数量或规格,在保证服务质量的前提下实现成本最优。本章从伸缩模式、触发条件与 Kubernetes 原生控制器三个维度展开。

2.1 水平伸缩与垂直伸缩

弹性伸缩按资源调整维度分为水平伸缩(Scale Out/In)和垂直伸缩(Scale Up/Down)。两者在适用场景、生效速度与资源利用率上存在显著差异。

对比维度 水平伸缩(HPA) 垂直伸缩(VPA)
调整对象 Pod 副本数量 Pod 的 CPU/内存 Request & Limit
扩容速度 快(秒级启动新 Pod) 慢(需重建 Pod 生效)
适用负载 无状态、可水平拆分 有状态、单体应用、启动重
资源利用率 按需增减副本,利用率高 单 Pod 规格固定,易碎片
集群容量影响 消耗节点剩余资源 可能触发节点级资源竞争
关键原则:水平伸缩优先于垂直伸缩。在无状态服务中,优先通过 HPA 调整副本数;仅当单体应用或无法水平拆分时,才考虑 VPA 调整单 Pod 规格。
水平伸缩 vs 垂直伸缩 水平伸缩(Scale Out/In) Pod A Pod B Pod C Pod D Pod E 副本数 3 → 5 每个 Pod 规格不变 垂直伸缩(Scale Up/Down) Pod (1C/2G) Pod (4C/8G) 副本数不变 单 Pod 资源翻倍 垂直伸缩通常需要重建 Pod,存在短暂中断

2.2 弹性伸缩的触发条件

弹性伸缩并非随意触发,而是基于明确的指标阈值、时间窗口与策略规则。常见的触发条件分为三类:

  1. 资源指标触发:CPU 利用率、内存利用率、网络吞吐量等基础指标。例如:CPU 平均利用率超过 80% 持续 3 分钟则触发扩容。
  2. 业务指标触发:QPS(每秒请求数)、请求延迟 P99、队列深度、并发连接数等。这类指标更贴近用户体验。
  3. 自定义/外部指标触发:通过 Prometheus Adapter、KEDA 等接入的任意指标,如 Kafka 消费积压、数据库连接池使用率。
最佳实践:生产环境建议组合使用资源指标与业务指标。单一 CPU 指标容易因应用锁竞争或 IO 等待产生误判;加入 QPS 或延迟指标可提高伸缩决策的准确性。

2.3 Kubernetes HPA / VPA / CPA 概述

Kubernetes 原生提供了三种弹性伸缩控制器,分别对应不同的伸缩维度与策略。理解其工作原理是编排与故障排查的基础。

2.3.1 HPA(Horizontal Pod Autoscaler)

HPA 是 Kubernetes 最常用的水平伸缩控制器。它周期性地采集 Pod 的 CPU/内存利用率或自定义指标,与目标值比较后计算期望副本数,然后更新 Deployment/StatefulSet 的 replicas 字段。

# HPA 示例:基于 CPU 利用率自动伸缩
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

2.3.2 VPA(Vertical Pod Autoscaler)

VPA 负责调整 Pod 的 CPU/内存 Request 与 Limit。它通过分析历史资源使用数据,推荐或自动设置更合理的资源规格。VPA 有三种运行模式:

  • Off:仅生成推荐值,不自动修改。
  • Auto:自动更新 Pod 资源规格,需要重建 Pod 生效。
  • Initial:仅在 Pod 创建时设置推荐值,运行中不调整。
注意:VPA 与 HPA 在 CPU/内存指标上存在冲突。如果同时使用 HPA 和 VPA 针对同一指标进行伸缩,会导致震荡。通常建议:HPA 负责水平伸缩,VPA 负责初始资源推荐或仅用于有状态服务。

2.3.3 CPA(Cluster Proportional Autoscaler)

CPA 是一种特殊的水平伸缩控制器,专门用于集群基础设施组件(如 CoreDNS、ingress-nginx 等)。它根据集群节点数量或总容量按比例调整副本数,而非基于实时负载指标。

# CPA 示例:CoreDNS 按节点数比例伸缩
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: coredns-cpa
  namespace: kube-system
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: coredns
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metric:
        name: kube_node_count
      target:
        type: AverageValue
        averageValue: 50
Kubernetes 弹性伸缩控制器工作流程 HPA 水平伸缩 采集 Pod 指标 计算期望副本数 更新 Deployment 创建/删除 Pod VPA 垂直伸缩 分析历史资源使用 生成推荐资源规格 驱逐并重建 Pod 新 Pod 使用新规格 CPA 比例伸缩 采集集群节点数 按比例计算副本数 更新组件 Deployment 调整基础设施副本

2.4 三种控制器的选型对比

控制器 伸缩维度 指标来源 生效方式 典型场景
HPA 副本数 CPU/内存/Prometheus 自定义指标 实时调整,无需重建 无状态 Web 服务、API 网关
VPA Pod 资源规格 历史资源使用数据 需重建 Pod 有状态数据库、单体应用
CPA 副本数 集群节点数/总容量 实时调整,无需重建 CoreDNS、ingress-nginx 等基础设施
故障排查要点:HPA 不生效时,优先检查 metrics-server 是否正常运行、Pod 是否设置了资源 Request、以及 HPA 的目标指标名称是否正确。VPA 常见问题包括推荐值不合理(需检查历史窗口长度)和与 HPA 冲突。CPA 则需确认集群节点数指标是否被正确暴露。