kube-controller-manager 的 --horizontal-pod-autoscaler-downscale-stabilization-window 参数控制缩容时间窗口,默认 5 分钟,即负载减小后至少需要等 5 分钟才会缩容。kube-controller-manager 参数 --horizontal-pod-autoscaler-tolerance 决定,默认是0.1,即10%。apiVersion: autoscaling/v2beta2kind: HorizontalPodAutoscalermetadata:name: webspec:minReplicas: 1maxReplicas: 1000metrics:- pods:metric:name: k8s_pod_rate_cpu_core_used_limittarget:averageValue: "80"type: AverageValuetype: PodsscaleTargetRef:apiVersion: apps/v1kind: Deploymentname: webbehavior: # 这里是重点scaleDown:stabilizationWindowSeconds: 300 # 需要缩容时,先观察 5 分钟,如果一直持续需要缩容才执行缩容policies:- type: Percentvalue: 100 # 允许全部缩掉periodSeconds: 15scaleUp:stabilizationWindowSeconds: 0 # 需要扩容时,立即扩容policies:- type: Percentvalue: 100periodSeconds: 15 # 每 15s 最大允许扩容当前 1 倍数量的 Pod- type: Podsvalue: 4periodSeconds: 15 # 每 15s 最大允许扩容 4 个 PodselectPolicy: Max # 使用以上两种扩容策略中算出来扩容 Pod 数量最大的
behavior 配置是默认的,即如果不配置,会默认加上。scaleUp 和 scaleDown 都可以配置1个或多个策略,最终扩缩时用哪个策略,取决于 selectPolicy。selectPolicy 默认是 Max,即扩缩时,评估多个策略算出来的结果,最终选取扩缩 Pod 数量最多的那个策略的结果。stabilizationWindowSeconds 是稳定窗口时长,即需要指标高于或低于阈值,并持续这个窗口的时长才会真正执行扩缩,以防止抖动导致频繁扩缩容。扩容时,稳定窗口默认为0,即立即扩容;缩容时,稳定窗口默认为5分钟。policies 中定义扩容或缩容策略,type 的值可以是 Pods 或 Percent,表示每 periodSeconds 时间范围内,允许扩缩容的最大副本数或比例。behavior:scaleUp:policies:- type: Percentvalue: 900periodSeconds: 15 # 每 15s 最多允许扩容 9 倍于当前副本数
maxReplicas 的限制。
假如一开始只有1个Pod,如果遭遇流量突发,且指标持续超阈值9倍以上,它将以飞快的速度进行扩容,扩容时 Pod 数量变化趋势如下:1 -> 10 -> 100 -> 1000
behavior 配置示例如下:behavior:scaleUp:policies:- type: Percentvalue: 900periodSeconds: 15 # 每 15s 最多允许扩容 9 倍于当前副本数scaleDown:policies:- type: Podsvalue: 1periodSeconds: 600 # 每 10 分钟最多只允许缩掉 1 个 Pod
scaleDown 的配置,指定缩容时每10分钟才缩掉1个 Pod,极大降低了缩容速度,缩容时的 Pod 数量变化趋势如下:1000 -> … (10 min later) -> 999
behavior:behavior:scaleUp:policies:- type: Podsvalue: 1periodSeconds: 300 # 每 5 分钟最多只允许扩容 1 个 Pod
1 -> 2 -> 3 -> 4
behavior 配置来禁止自动缩容:behavior:scaleDown:selectPolicy: Disabled
behavior 配置示例如下:behavior:scaleDown:stabilizationWindowSeconds: 600 # 等待 10 分钟再开始缩容policies:- type: Podsvalue: 5periodSeconds: 600 # 每 10 分钟最多只允许缩掉 5 个 Pod
behavior 配置示例如下:behavior:scaleUp:stabilizationWindowSeconds: 300 # 扩容前等待 5 分钟的时间窗口policies:- type: Podsvalue: 20periodSeconds: 60 # 每分钟最多只允许扩容 20 个 Pod

kubectl api-versions | grep autoscalingautoscaling/v1autoscaling/v2beta1autoscaling/v2beta2

kubectl get horizontalpodautoscaler.v2beta2.autoscaling php-apache -o yaml# kubectl edit horizontalpodautoscaler.v2beta2.autoscaling php-apache
behavior:scaleUp:policies:- type: Percentvalue: 900periodSeconds: 10
kube-controller-manager 的 --horizontal-pod-autoscaler-sync-period 参数决定)。--metrics-relist-interval 参数决定监控指标刷新周期(从 prometheus 中查询),这两部分时长之和为监控数据更新的最长时间。--metrics-relist-interval。文档反馈