Kubernetes HPA-扩大冷却时间

问题描述

我正在运行带有HPA的Kubernetes集群v1.16(当前是GKE的最新版本),该集群可基于自定义指标(具体来说是从Google云监控中获取的Rabbitmq消息计数)来扩展部署。

问题

当消息数量暂时很高时,部署会迅速扩展到最大pod数量

信息

HPA --horizo​​ntal-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%。

也就是说,您不会选择任何一种方式,以下是您可以采取的一些方法:

  1. 通过时间平均函数传递自定义指标以进行缩放-上一次我使用prometheus进行操作时,promql可能与您所使用的不同,但是如果您在问题中共享更多配置,我确定可以帮助您找到语法。
  2. 您可以尝试使用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自定义资源中。