调节HPA扩缩容灵敏度

在集群中启用容器水平伸缩HPA后,如果默认的扩缩容行为无法满足业务需求,您可以通过behavior字段更细粒度地配置缩容(scaleDown)和扩容(scaleUp)行为。例如,您可以在流量急剧上升时实现快速扩容,负载波动频繁的场景下实现快速扩容和缓慢缩容,对状态敏感的应用实现禁止缩容等。

使用须知

  • behavior字段于Kubernetes 1.23版本进入Stable状态。请确保您在1.24及以上版本的集群中完成了HPA的启用,请参见使用容器水平伸缩(HPA)。如需升级集群,请参见手动升级集群

  • 如果您通过kubectl手动部署了HPA,您还需确保HPA的API版本为v2beta2及以上。

behavior配置说明

在HPA配置中,behavior是一个可选字段,支持对自动扩缩容行为进行更细粒度的控制。behavior主要通过scaleDownscaleUp子字段定义扩容和缩容的具体行为,以更好地满足应用的实际需求,避免资源的过度分配或不足,从而提高资源利用率和应用性能。

一个包括behavior字段的HPA配置示例如下。示例中behavior配置均为默认配置。您可需按需配置自定义字段的取值,未指定的字段将使用默认值。

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: sample-hpa
spec:
  minReplicas: 1
  maxReplicas: 100
  metrics:
  - pods:
      metric:
        name: http_requests_per_second
      target:
        averageValue: 50
        type: AverageValue
    type: Pods
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: sample-app
  behavior:  # 以下配置为默认配置,您可以按需自定义字段。
    scaleDown: # 通过此字段配置自定义的缩容行为。
      stabilizationWindowSeconds: 300
      policies: 
      - type: Pods
        value: 10 
        periodSeconds: 15
    scaleUp:  # 通过此字段配置自定义的扩容行为。
      stabilizationWindowSeconds: 0
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15
      - type: Pods
        value: 4
        periodSeconds: 15
      selectPolicy: Max

在示例YAML中,通过scaleDown字段定义了稳定窗口(stabilizationWindowSeconds)为300秒,并在policies中声明了具体的缩容策略。这表明HPA缩容时会考虑5分钟内所有建议的副本数,从中选择最大值,且每15秒最多缩容10个Pod,避免指标波动而导致的频繁缩容。

同时,在scaleUp字段中,稳定窗口为0,即当指标表明需要扩容时HPA会立即进行扩容操作。定义了两种扩容策略以及策略的选择方式:每15秒最多添加当前运行副本数的100%,或每15秒最多添加4个Pod,HPA会在扩容时选择增加副本数较多的策略。

scaleDownscaleUp支持自定义字段及其说明如下。

参数

说明

stabilizationWindowSeconds

稳定窗口用于在指标持续波动时避免副本数频繁增减。HPA会考虑可配置窗口时间内的所有建议副本数。如配置为scaleDown,HPA会从所有副本数中选择最大值;如配置为scaleUp,HPA则会选择最小值。单位为秒(s)。

policies

定义一个或多个缩容策略,每个策略包含type(例如PercentPods)和value,用于详细说明在满足缩容条件时如何减少Pod的数量,例如每次减少百分比或固定数量的Pod。

selectPolicy

存在多个缩容策略可用时,指定选择哪个策略。可选值:MinMaxDisabled。如配置为scaleDownMax代表在符合条件的情况下,选择减小最多副本数的策略进行缩容;如配置为scaleUp,则选择增加最多副本数的策略进行扩容。

下文结合不同场景示例介绍如何通过behavior字段来对扩缩容行为进行更细粒度的配置。

快速扩容

在特定事件(例如促销、产品发布等)期间,应用可能会经历突然的流量激增。当需要快速扩容时,您可以参见如下配置实现快速扩容。

behavior:
  scaleUp:
    policies:
    - type: Percent
      value: 900
      periodSeconds: 15

在上方配置中,扩容行为不受maxReplicas的限制,将在15秒的时间窗口内尝试将当前Pod数量增加900%,从而使副本数达到当前的10倍。假如您初始Pod数量为1,在流量突发并且指标持续超出阈值时,扩容时Pod数量变化将呈如下趋势。

1 -> 10 -> 100 -> 1000

快速扩容,缓慢缩容

在对应用性能要求高且负载波动频繁的场景,为避免在流量高峰后执行缩容时有不易预测的流量高峰再次到来,继而保障系统的稳定运行、及时响应请求,您可以参见如下配置实现快速扩容和缓慢缩容。

behavior:
  scaleUp:
    policies:
    - type: Percent
      value: 900
      periodSeconds: 60
  scaleDown:
    policies:
    - type: Pods
      value: 1
      periodSeconds: 600 # 每10分钟减少一个pod。

在上方配置中,当扩容时,在60秒的时间窗口内,每次将增加当前Pod数量的900%。如果指标持续低于阈值,当缩容时,在600秒(即10分钟)的时间窗口内,最多缩容1个Pod。

禁止缩容

对于运行中的关键任务或状态敏感的应用,缩容可能导致不必要的中断或负载迁移。您可以参见下方配置实现禁止缩容,确保任务应用的高可用性和稳定性。

behavior:
  scaleDown:
    selectPolicy: Disabled

延长或缩短缩容时间窗口

在资源有限或成本敏感的场景中,快速扩容可能导致资源耗尽或成本激增。您可以参见下方配置使用stabilizationWindowSeconds来限制扩容的速度,减少因短暂波动导致的频繁调整,从而控制资源消耗,降低集群成本。

behavior:
  scaleDown:
    stabilizationWindowSeconds: 600
    policies:
    - type: Pods
      value: 5
      periodSeconds: 600

在上方配置中,即使缩容阈值低于目标值,HPA也不会立即进行缩容操作,而会等待600秒(即10分钟)的时间窗口期,确认指标是否持续低于目标值。在时间窗口期内,每次缩容至多缩容5个Pod。 如果您希望指标达到阈值后立即执行扩缩容,无须等待稳定窗口,可以将stabilizationWindowSeconds配置为0

同时配置多个扩容策略

如果您的业务流量增长模式多变且不可预测,您可以参见下方配置同时定义多个扩缩容策略,确保系统能够灵活地应对各种不同的流量模式,从而实现快速而有效的扩展。

  behavior:
    scaleUp:
      policies:
      - type: Pods # 基于Pod数量的扩容策略。
        value: 4
        periodSeconds: 60
      - type: Percent  # 基于百分比的扩容策略。
        value: 50
        periodSeconds: 60
      selectPolicy: Max

在上方配置中,scaleUp中配置了两个策略。

  • 一个策略基于Pod数量,每1分钟最多扩容4个Pod。

  • 一个策略基于百分比,每1分钟最多增加当前Pod数量50%的Pod。

selectPolicy设置为Max,表示HPA会选择policies中增加Pod数量最多的策略来执行扩容。

相关文档

  • 推荐您在启用HPA后,搭配节点伸缩使用,保证工作负载Pod总能获得足够的计算资源,请参见节点伸缩概述

  • 如您在使用HPA的过程中遇到问题,可以参见工作负载伸缩FAQ进行排查。