Kubernetes HPA(带有自定义指标)扩展策略

Posted

技术标签:

【中文标题】Kubernetes HPA(带有自定义指标)扩展策略【英文标题】:Kubernetes HPA (with custom metrics) scaling policies 【发布时间】:2020-10-15 10:10:48 【问题描述】:

从 Kubernetes v1.18 开始,v2beta2 API 允许通过 Horizo​​ntal Pod Autoscalar (HPA) 行为字段配置缩放行为。 我打算将带有自定义指标的 HPA 应用到 StatefulSet

我正在查看的用例是使用自定义指标(例如我的应用程序上的用户会话数)进行横向扩展,但 HPA 根本不会缩减。 K8s SIG-Autoscaling 增强功能也描述了这个用例 - "Configurable scale velocity for HPA >> Story 4: Scale Up As Usual, Do Not Scale Down"。

behavior:
  scaleDown:
    policies:
    - type: pods
      value: 0

用户会话可以保持活跃几分钟到几小时。从 StatefulSet 的 1 个副本开始,随着用户会话数达到上限(使用 Prometheus 收集器公开,然后使用 HPA 自定义指标选项进行配置),应用程序 pod 将横向扩展。新的 pod 将开始为新用户提供服务。

由于这是一个 StatefulSet 并且不能只是突然缩小,我正在寻求有关在新副本上的用户会话降至 0 时缩小规模的方法。上面的链接说缩小可以通过一个单独的过程来控制。不知道该怎么做?求指点。

谢谢。

【问题讨论】:

出于好奇,您使用 StatefulSets 有什么原因吗? 应用程序是有状态的(不是无状态的)。它处理来自用户的传入请求,存储其用户参数,并使用它来处理后续请求。 在哪里存储用户和参数? 它将用户数据本地存储在 Pod 上,并将其写入数据库。 如果最终的持久状态在数据库中(事实来源)并且本地数据更多的是缓存,那么我认为这更多的是无状态服务,通常只需使用部署即可。 【参考方案1】:

您可以使用 periodSecondsstabilizationWindowSeconds 值来管理 pod 终止之间的时间间隔,例如:

  behavior:
    scaleDown:
      stabilizationWindowSeconds: 10
      policies:
      - type: Pods
        value: 1
        periodSeconds: 20

这样,它将每约 30 秒缩小 1 个 pod(或 periodSecondsstabilizationWindowSeconds 中使用的任何值)。随着时间的推移,时间可能会因stabilizationWindowSeconds 的值而异。

periodSeconds 描述了每个 pod 终止之间的时间间隔,最大值为 1800 秒(30 分钟)。

stabilizationWindowSeconds 当指标表明目标应按比例缩小时,此算法会查看先前计算的所需状态并使用指定间隔中的最大值。缩减默认值为 300,最大值为 3600(一小时)。

【讨论】:

以上是关于Kubernetes HPA(带有自定义指标)扩展策略的主要内容,如果未能解决你的问题,请参考以下文章

HPA 缩减 kubernetes pod

Kubernetes HPA 为自定义指标获取错误的当前值

Kubernetes AWS Cloudwatch 适配器未获取 EKS HPA 自动缩放的自定义指标值

Kubernetes 指标服务器不提供所有指标或扩展 HPA

在 Kubernetes 中使用多个自定义指标适配器

具有 2 个或更多指标的 kubernetes HPA 的行为如何——尤其是副本数计算?