弹性伸缩原理:水平与垂直伸缩、触发条件与 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 规格。
2.2 弹性伸缩的触发条件
弹性伸缩并非随意触发,而是基于明确的指标阈值、时间窗口与策略规则。常见的触发条件分为三类:
- 资源指标触发:CPU 利用率、内存利用率、网络吞吐量等基础指标。例如:CPU 平均利用率超过 80% 持续 3 分钟则触发扩容。
- 业务指标触发:QPS(每秒请求数)、请求延迟 P99、队列深度、并发连接数等。这类指标更贴近用户体验。
- 自定义/外部指标触发:通过 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
2.4 三种控制器的选型对比
| 控制器 | 伸缩维度 | 指标来源 | 生效方式 | 典型场景 |
|---|---|---|---|---|
| HPA | 副本数 | CPU/内存/Prometheus 自定义指标 | 实时调整,无需重建 | 无状态 Web 服务、API 网关 |
| VPA | Pod 资源规格 | 历史资源使用数据 | 需重建 Pod | 有状态数据库、单体应用 |
| CPA | 副本数 | 集群节点数/总容量 | 实时调整,无需重建 | CoreDNS、ingress-nginx 等基础设施 |
故障排查要点:HPA 不生效时,优先检查 metrics-server 是否正常运行、Pod 是否设置了资源 Request、以及 HPA 的目标指标名称是否正确。VPA 常见问题包括推荐值不合理(需检查历史窗口长度)和与 HPA 冲突。CPA 则需确认集群节点数指标是否被正确暴露。