我正在运行一个带有HPA的Kubernetes集群v1.16(目前是GKE上的最新版本(,该集群基于自定义指标(特别是从谷歌云监控中获取的rabbitmqmessages计数(来扩展部署。
问题
当消息数量暂时较高时,部署会迅速扩展到最大pod数量。
信息
HPA——水平吊舱自动缩放器同步周期在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中有一个内置的自动日历冷却时间。引用Kubernetes在行动:
目前,只有在最后三分钟内没有发生重新缩放事件时,才会进行放大。缩减活动的执行频率更低——每五分钟执行一次。记住这一点,这样你就不会想知道为什么自动缩放器拒绝执行重新缩放操作,即使指标清楚地表明它应该执行。
这可能是因为这句话已经过时了,但除非它改变,否则这是硬编码的,每个向上/向下扩展的事件都不应该扩展到现有pod的100%以上。
也就是说,无论哪种方式,你都不会失去选择,以下是你可以采取的一些方法:
- 通过时间平均函数传递您的自定义缩放度量-上次我这样做是使用prometheus,promql可能与您使用的不同,但如果您在问题中共享更多配置,我相信我可以帮助找到语法
-
您可以尝试使用Keda-它有一个
cooldownPeriod
对象,您可以将其放置在附带的ScaledObject
自定义资源中
我们构建了一个可高度配置的开源自定义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导出器并将queue_messages_ready
设置为目标度量。