Kubernetes HPA - 扩大冷却时间
Kubernetes HPA - Scale up cooldown
我是 运行 Kubernetes 集群 v1.16(目前是 GKE 上的最新版本),带有 HPA,可根据自定义指标扩展部署(特别是从 google 云监控中获取的 rabbitmq 消息计数) .
问题
当消息数暂时很高时,部署会非常快速地扩展到最大 pod 数。
信息
HPA --horizontal-pod-autoscaler-sync-period 在 GKE 上设置为 15 秒,据我所知无法更改。
我的自定义指标每 30 秒更新一次。
我认为导致此行为的原因是,当每 15 秒队列中的消息计数很高时,HPA 会触发扩展并在几个周期后达到最大 pod 容量。
在 kubernetes api v1.18 中你可以控制放大稳定时间,但我在 v1.16 中找不到类似的功能。
我的问题
如何让 HPA 逐渐扩大?
编辑 1
我的一个部署的示例 HPA:
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: my-deployment-hpa
namespace: production
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deployment
minReplicas: 6
maxReplicas: 100
metrics:
- type: External
external:
metricName: "custom.googleapis.com|rabbit_mq|v1-compare|messages_count"
metricSelector:
matchLabels:
metric.labels.name: production
targetValue: 500
首先,有一个很好的信息要知道,Kubernetes 中有一个 built-in 自动缩放器的冷却时间。引用 Kubernetes in Action:
Currently, a scale-up will occur only if no rescaling event occurred in the last three minutes. A scale-down event is performed even less frequently—every five minutes. Keep this in mind so you don’t wonder why the autoscaler refuses to perform a rescale operation even if the metrics clearly showthat it should.
可能是这个声明已经过时了,但除非它改变了,否则这是硬编码的,每个规模 up/down 事件的规模不应超过现有 pods 的 100%。
也就是说,您并非没有选择,这里有一些您可以采取的方法:
- 通过时间平均函数传递您的自定义指标 - 我上次这样做是使用 prometheus 和 promql 可能与您使用的不同,但如果您分享您的问题中有更多配置,我相信我可以帮助找到语法。
- 您可以尝试使用 Keda - 它有一个
cooldownPeriod
对象,您可以将其放置在它附带的 ScaledObject
自定义资源中.
我们构建了一个高度可配置的开源 Custom HPA。
特别适合您的情况,您可以将 HPA 设置为在缩小事件之间进行冷却。
要使用自定义 HPA,您需要做的就是:
; add nanit helm repo
$ helm repo add nanit https://nanit.github.io/helm-charts
; install the chart in the cluster
helm install nanit/custom-hpa \
--version 1.0.7 \
--set target.deployment=<deployment> \
--set target.namespace=<namespace> \
--set target.value=100 \
--set minReplicas=10 \
--set maxReplicas=50 \
--set behavior.scaleDownCooldown=120 \
--set prometheus.url=<prometheus-url> \
--set prometheus.port=<prometheus-port> \
--set prometheus.query=<prometheus-target-metric>
您正在寻找的设置是 behavior.scaleDownCooldown
,它指示 HPA 在再次缩小之前应等待的时间(以秒为单位)。
目前自定义 HPA 仅支持 prometheus 作为指标提供者,但您可以使用 RabbitMQ exporter and set queue_messages_ready
作为目标指标。
我是 运行 Kubernetes 集群 v1.16(目前是 GKE 上的最新版本),带有 HPA,可根据自定义指标扩展部署(特别是从 google 云监控中获取的 rabbitmq 消息计数) .
问题
当消息数暂时很高时,部署会非常快速地扩展到最大 pod 数。
信息
HPA --horizontal-pod-autoscaler-sync-period 在 GKE 上设置为 15 秒,据我所知无法更改。
我的自定义指标每 30 秒更新一次。
我认为导致此行为的原因是,当每 15 秒队列中的消息计数很高时,HPA 会触发扩展并在几个周期后达到最大 pod 容量。
在 kubernetes api v1.18 中你可以控制放大稳定时间,但我在 v1.16 中找不到类似的功能。
我的问题
如何让 HPA 逐渐扩大?
编辑 1
我的一个部署的示例 HPA:
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: my-deployment-hpa
namespace: production
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deployment
minReplicas: 6
maxReplicas: 100
metrics:
- type: External
external:
metricName: "custom.googleapis.com|rabbit_mq|v1-compare|messages_count"
metricSelector:
matchLabels:
metric.labels.name: production
targetValue: 500
首先,有一个很好的信息要知道,Kubernetes 中有一个 built-in 自动缩放器的冷却时间。引用 Kubernetes in Action:
Currently, a scale-up will occur only if no rescaling event occurred in the last three minutes. A scale-down event is performed even less frequently—every five minutes. Keep this in mind so you don’t wonder why the autoscaler refuses to perform a rescale operation even if the metrics clearly showthat it should.
可能是这个声明已经过时了,但除非它改变了,否则这是硬编码的,每个规模 up/down 事件的规模不应超过现有 pods 的 100%。
也就是说,您并非没有选择,这里有一些您可以采取的方法:
- 通过时间平均函数传递您的自定义指标 - 我上次这样做是使用 prometheus 和 promql 可能与您使用的不同,但如果您分享您的问题中有更多配置,我相信我可以帮助找到语法。
- 您可以尝试使用 Keda - 它有一个
cooldownPeriod
对象,您可以将其放置在它附带的ScaledObject
自定义资源中.
我们构建了一个高度可配置的开源 Custom HPA。
特别适合您的情况,您可以将 HPA 设置为在缩小事件之间进行冷却。
要使用自定义 HPA,您需要做的就是:
; add nanit helm repo
$ helm repo add nanit https://nanit.github.io/helm-charts
; install the chart in the cluster
helm install nanit/custom-hpa \
--version 1.0.7 \
--set target.deployment=<deployment> \
--set target.namespace=<namespace> \
--set target.value=100 \
--set minReplicas=10 \
--set maxReplicas=50 \
--set behavior.scaleDownCooldown=120 \
--set prometheus.url=<prometheus-url> \
--set prometheus.port=<prometheus-port> \
--set prometheus.query=<prometheus-target-metric>
您正在寻找的设置是 behavior.scaleDownCooldown
,它指示 HPA 在再次缩小之前应等待的时间(以秒为单位)。
目前自定义 HPA 仅支持 prometheus 作为指标提供者,但您可以使用 RabbitMQ exporter and set queue_messages_ready
作为目标指标。