繁体   English   中英

Kube.netes HPA - 扩大冷却时间

[英]Kubernetes HPA - Scale up cooldown

我正在运行带有 HPA 的 Kube.netes 集群 v1.16(目前是 GKE 上的最新版本),它根据自定义指标(特别是从谷歌云监控中获取的 rabbitmq 条消息计数)来扩展部署。

问题

当消息数暂时很高时,部署会非常快速地扩展到最大 pod 数。

信息

HPA --horizontal-pod-autoscaler-sync-period 在 GKE 上设置为 15 秒,据我所知无法更改。

我的自定义指标每 30 秒更新一次。

我相信导致这种行为的原因是,当每 15 秒队列中的消息计数很高时,HPA 会触发扩展,并在几个周期后达到最大 pod 容量。

在 kube.netes 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 仅支持 prometheus 作为指标提供者,但您可以使用RabbitMQ 导出器并将queue_messages_ready设置为目标指标。

首先,需要知道的一条很好的信息是,Kube.netes 中有一个用于自动缩放器的内置冷却时间。 引用 Kube.netes in Action:

目前,只有在过去三分钟内没有发生重新缩放事件时才会进行缩放。 缩减事件的执行频率更低——每五分钟一次。 记住这一点,这样你就不会奇怪为什么自动缩放器拒绝执行重新缩放操作,即使指标清楚地表明它应该这样做。

可能这个声明已经过时了,但除非它改变了,否则这是硬编码的,并且每个扩展/缩减事件不应扩展超过 100% 的现有 pod。

也就是说,您并非没有选择,这里有一些您可以采取的方法:

  1. 通过时间平均值 function 传递您的自定义指标以进行缩放- 上次我这样做是使用 prometheus 和 promql 可能与您使用的不同,但如果您在问题中共享更多配置,我相信我可以帮助找到句法。
  2. 您可以尝试使用Keda - 它有一个cooldownPeriod object,您可以将其放置在它附带的ScaledObject自定义资源中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM