问题描述
我正在运行带有HPA的Kubernetes集群v1.16(当前是GKE的最新版本),该集群可基于自定义指标(具体来说是从Google云监控中获取的Rabbitmq消息计数)来扩展部署。
问题
信息
HPA --horizontal-pod-autoscaler-sync-period在GKE上设置为15秒,据我所知无法更改。
我的自定义指标每30秒更新一次。
我认为,导致这种现象的原因是,每15秒队列中有大量消息时,HPA会触发扩展,并在几个周期后达到最大容器容量。
在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
解决方法
我们已经构建了一个高度可配置的开源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仅支持普罗米修斯作为度量标准提供者,但是您可以使用RabbitMQ exporter并将queue_messages_ready
设置为目标度量标准。
首先,要了解的很多信息是,Kubernetes中内置了自动缩放器的冷却时间。引用Kubernetes的实际行动:
当前,只有在最近三分钟内没有发生重新缩放事件时,才会进行放大。按比例缩小事件的执行频率更低,每五分钟一次。请记住这一点,这样就不会奇怪,即使指标清楚地表明了自动缩放器为何拒绝执行重新缩放操作。
该语句可能已过时,但除非更改,否则将对其进行硬编码,并且每个向上/向下缩放事件的缩放比例均不应超过现有Pod的100%。
也就是说,您不会选择任何一种方式,以下是您可以采取的一些方法:
- 通过时间平均函数传递自定义指标以进行缩放-上一次我使用prometheus进行操作时,promql可能与您所使用的不同,但是如果您在问题中共享更多配置,我确定可以帮助您找到语法。
- 您可以尝试使用Keda -它有一个
import curses import time if __name__ == "__main__": stdscr = curses.initscr() curses.noecho() curses.cbreak() try: for i in range(10): stdscr.addstr(0,'Replace the numbers on multiple lines') stdscr.addstr(1,'Line ONE:' + str(i)) stdscr.addstr(2,'Line TWO:' + str(i)) stdscr.refresh() time.sleep(0.5) finally: curses.echo() curses.nocbreak() curses.endwin()
对象,您可以将其放置在随附的cooldownPeriod
自定义资源中。