在集群中启用容器水平伸缩HPA后,如果默认的扩缩容行为无法满足业务需求,您可以通过behavior
字段更细粒度地配置缩容(scaleDown
)和扩容(scaleUp
)行为。例如,您可以在流量急剧上升时实现快速扩容,负载波动频繁的场景下实现快速扩容和缓慢缩容,对状态敏感的应用实现禁止缩容等。
使用须知
behavior
字段于Kubernetes 1.23版本进入Stable状态。请确保您在1.24及以上版本的集群中完成了HPA的启用,请参见使用容器水平伸缩(HPA)。如需升级集群,请参见手动升级集群。如果您通过kubectl手动部署了HPA,您还需确保HPA的API版本为
v2beta2
及以上。
behavior
配置说明
在HPA配置中,behavior
是一个可选字段,支持对自动扩缩容行为进行更细粒度的控制。behavior
主要通过scaleDown
和scaleUp
子字段定义扩容和缩容的具体行为,以更好地满足应用的实际需求,避免资源的过度分配或不足,从而提高资源利用率和应用性能。
一个包括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会在扩容时选择增加副本数较多的策略。
scaleDown
和scaleUp
支持自定义字段及其说明如下。
参数 | 说明 |
| 稳定窗口用于在指标持续波动时避免副本数频繁增减。HPA会考虑可配置窗口时间内的所有建议副本数。如配置为 |
| 定义一个或多个缩容策略,每个策略包含 |
| 存在多个缩容策略可用时,指定选择哪个策略。可选值: |
下文结合不同场景示例介绍如何通过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数量最多的策略来执行扩容。