弹性伸缩基础:什么是弹性伸缩、弹性伸缩的度量指标与伸缩粒度

大家好,我是你们的讲师。今天我们来聊聊弹性伸缩的基础。说实话,这个概念听起来挺高大上的,但说白了,就是让系统能像橡皮筋一样,拉得开、缩得回。

我刚开始接触云原生时,对弹性伸缩的理解很肤浅。以为就是多开几个Pod完事。后来线上出了几次事故,才真正明白——弹性伸缩不是简单的加减法,而是一门平衡的艺术。

什么是弹性伸缩?

弹性伸缩,英文叫 Auto Scaling。它的核心思想很简单:根据业务负载,自动调整计算资源的数量

你想想看,一个电商网站,白天流量大,晚上流量小。如果一直开着100台机器,晚上就是浪费。如果只开10台,白天又扛不住。弹性伸缩就是来解决这个矛盾的。

我个人习惯把弹性伸缩分成两个维度:

  • 水平伸缩:增加或减少实例数量。比如Pod从3个变成10个。
  • 垂直伸缩:调整单个实例的规格。比如把CPU从1核升到4核。

在云原生场景下,我们主要关注水平伸缩。因为Pod的启停成本很低,而且可以做到秒级响应。

核心要点:弹性伸缩的目标是——负载高时自动扩容,保证服务质量;负载低时自动缩容,节省成本。

弹性伸缩的度量指标

有了伸缩的能力,接下来要解决的是:什么时候该伸缩?这就涉及到度量指标了。

我见过不少团队,一上来就拍脑袋定指标。结果要么频繁抖动,要么反应迟钝。这里我分享三个最常用的指标,也是我在项目中踩过坑的。

1. QPS(每秒查询数)

QPS 是最直观的业务指标。它直接反映了系统正在承受的压力。

举个例子,你的服务单机能扛1000 QPS。当QPS涨到3000时,你就需要3个Pod。当QPS降到500时,缩到1个就够了。

但这里有个坑:QPS的采集和计算有延迟。我曾经遇到过,QPS已经飙升到5000了,监控系统还在显示2000。等触发扩容时,服务已经挂了。

我的建议:使用QPS做指标时,一定要配合预测性伸缩。比如根据历史流量曲线,提前扩容。别等到QPS真的上来了再动手。

2. CPU 使用率

CPU 是最容易获取的指标。每个Pod都能轻松暴露CPU使用率。Kubernetes 的 HPA(Horizontal Pod Autoscaler)默认就支持CPU指标。

CPU 指标的优点是实时性好,采集成本低。但缺点也很明显——它不能完全代表业务压力

我记得有一次,一个Java应用因为Full GC导致CPU飙升到90%。HPA触发了扩容,结果新Pod启动后也被GC拖垮了。扩容反而加剧了问题。

注意:CPU 指标适合计算密集型服务。对于IO密集型或网络密集型服务,CPU可能无法准确反映真实负载。

3. 内存使用率

内存指标和CPU类似,也是系统级指标。但它有一个特殊之处:内存是“有记忆”的

什么意思呢?CPU用完就释放,但内存不会。一个Pod即使没有请求,它占用的内存也不会自动归还。这就导致内存使用率往往只升不降。

我建议,内存指标更适合用来做缩容保护,而不是扩容触发。比如,当内存使用率超过80%时,禁止缩容。但扩容还是用QPS或CPU更靠谱。

指标 优点 缺点 适用场景
QPS 直接反映业务压力 采集有延迟,需要预测 Web服务、API网关
CPU 实时性好,采集简单 不能代表所有负载 计算密集型服务
内存 反映资源占用 只升不降,不适合扩容 缩容保护、内存敏感型应用

伸缩的粒度:Pod级 vs Node级

聊完指标,我们来看看伸缩的粒度。说白了,就是你伸缩的最小单位是什么

Pod级伸缩

Pod级伸缩,也叫工作负载伸缩。它调整的是应用实例的数量。

在Kubernetes中,我们通常用 HPA 来实现。HPA 会监控Pod的CPU、内存或自定义指标,然后自动调整 Deployment 或 StatefulSet 的副本数。

举个例子,一个典型的 HPA 配置:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Pods
    pods:
      metric:
        name: qps_per_pod
      target:
        type: AverageValue
        averageValue: 1000

这个配置的意思是:当Pod的平均CPU超过70%,或者单个Pod的QPS超过1000时,就自动扩容。最多10个Pod,最少2个。

避坑指南:我曾经把 minReplicas 设成1,结果Pod被驱逐后,新Pod还没启动,服务就断了。现在我的习惯是,关键服务至少保留2个副本。

Node级伸缩

Node级伸缩,也叫集群伸缩。它调整的是工作节点的数量。

你想想看,如果所有Pod都扩容到上限了,但集群的节点资源不够了,怎么办?这时候就需要Node级伸缩了。

在云原生环境中,我们通常用 Cluster Autoscaler 来实现。它会检查集群中是否有Pending状态的Pod(因为资源不足而无法调度),如果有,就自动向云厂商申请新的节点。

Node级伸缩的粒度更大,成本也更高。启动一个Node可能需要几分钟,而启动一个Pod只需要几秒。所以,Node级伸缩通常作为Pod级伸缩的后备

维度 Pod级伸缩 Node级伸缩
伸缩对象 应用实例(Pod) 工作节点(Node)
响应速度 秒级 分钟级
成本影响 较小 较大
触发条件 Pod负载过高 集群资源不足
常用工具 HPA Cluster Autoscaler

总结

好了,今天的内容就到这里。我们来回顾一下:

  • 弹性伸缩就是根据负载自动调整资源,核心是平衡性能和成本。
  • 度量指标有QPS、CPU、内存,各有优劣。我建议组合使用,不要依赖单一指标。
  • 伸缩粒度分Pod级和Node级。Pod级响应快,Node级解决资源瓶颈。两者配合使用效果最好。

下一章,我们会深入HPA的实战配置。到时候我会分享一些我在生产环境中调优HPA的经验。咱们下节课见。