【问题标题】:HPA scale down not happening properlyHPA 缩减未正确发生
【发布时间】:2020-02-20 10:19:29
【问题描述】:

我已经为我的部署创建了 HPA,它可以很好地扩展到最大副本(在我的情况下为 6),当负载将其规模缩小到 5 但它应该达到我的原始副本状态(在我的情况下为 1情况下)随着负载变得正常。我在 30-40 分钟后验证了我的应用程序仍然有 5 个副本.. 它应该是 1 个副本。

[ec2-user@ip-192-168-x-x ~]$ kubectl describe hpa admin-dev -n dev

Name: admin-dev
Namespace: dev
Labels: <none>
Annotations: <none>
CreationTimestamp: Thu, 24 Oct 2019 07:36:32 +0000
Reference: Deployment/admin-dev
Metrics: ( current / target )
resource memory on pods (as a percentage of request): 49% (1285662037333m) / 60%
Min replicas: 1
Max replicas: 10
Deployment pods: 3 current / 3 desired
Conditions:
  Type           Status Reason             Message
  ----           ------ ------             -------
  AbleToScale    True   ReadyForNewScale   recommended size matches current size
  ScalingActive  True   ValidMetricFound   the HPA was able to successfully calculate a replica count from memory resource utilization (percentage of request)
  ScalingLimited False  DesiredWithinRange the desired count is within the acceptable range 

Events:
  Type   Reason            Age   From                      Message
  ----   ------            ----  ----                      -------
  Normal SuccessfulRescale 13m   horizontal-pod-autoscaler New size: 2; reason: memory resource utilization (percentage of request) above target
  Normal SuccessfulRescale 5m27s horizontal-pod-autoscaler New size: 3; reason: memory resource utilization (percentage of request) above target

【问题讨论】:

  • 但是 CPU 负载的百分比是多少?是否低于阈值?
  • @suren 是的,它是正常的,仅低于我的目标。
  • @LakshmiReddy 你能粘贴kubectl describe hpa &lt;your-hpa&gt; 的输出吗?
  • @vesna , [ec2-user@ip-192-168-xx ~]$ kubectl describe hpa admin-dev -n dev 名称:admin-dev 命名空间:dev 标签: 注释: CreationTimestamp: Thu, 24 Oct 2019 07:36:32 +0000 Reference: Deployment/admin-dev Metrics: ( current / target ) Pod 上的资源内存(占请求的百分比):49% (1285662037333m) / 60 % 最小副本:1 最大副本:10 部署 pod:3 个当前 / 3 个期望
  • @vesna,条件:类型状态原因消息 ---- ------ ------ -------- AbleToScale True ReadyForNewScale 推荐大小与当前大小匹配 ScalingActive True ValidMetricFound HPA 能够成功地从内存资源利用率(请求的百分比)计算副本计数 ScalingLimited False DesiredWithinRange 所需的计数在可接受的范围内

标签: kubernetes kubernetes-hpa


【解决方案1】:

当负载减少时,HPA 会在缩减应用程序之前有意等待一段时间。这被称为cooldown delay,有助于应用程序过于频繁地放大和缩小。这样做的结果是,即使指标值远低于目标,应用程序也会在一定时间内以先前的高副本数运行。这可能看起来 HPA 对减少的负载没有响应,但它最终会。

但是,冷却延迟的默认持续时间是 5 分钟。所以,如果 30-40 分钟后应用程序仍然没有缩小,那就奇怪了。除非使用controller manager--horizontal-pod-autoscaler-downscale-stabilization 标志将冷却延迟设置为其他值。

在您发布的输出中,指标值为 49%,目标为 60%,当前副本数为 3。这实际上看起来 还不错。

问题可能是您使用 内存利用率 作为指标,这不是一个好的自动缩放指标。

自动扩缩指标应线性响应应用副本中的当前负载。如果副本数加倍,度量值应该减半,如果副本数减半,度量值应该加倍。在大多数情况下,内存利用率不会显示这种行为。例如,如果每个副本使用固定数量的内存,那么无论添加或删除多少副本,副本的平均内存利用率大致保持不变。在这方面,CPU 利用率通常会更好。

【讨论】:

  • 在缩减时,Kubernetes 是否会尝试移除 CPU 使用率最低的 Pod,以避免中断 CPU 使用率高的 Pod 正在进行的工作?还是纯粹是随机选择?
  • HPA 的缩放是通过缩放子资源 API 完成的(请参阅github.com/kubernetes/community/blob/master/contributors/…)。您需要查看此 API 的实现。我不确定是否有特定的逻辑来选择要删除的 Pod,但我想这只是随机的。
【解决方案2】:

在这种情况下,Horizontal Pod Autoscaler 按设计工作。

Autoscaler 可以configured 使用一个或多个指标。

  1. 基于单个指标的自动缩放 - 将所有 pod 的指标值相加,除以在HorizontalPodAutoscaler 资源上设置的目标值,然后将其向上舍入为下一个更大的整数。

desired_replicas = sum(utilization) / desired_utilization.

示例:将其配置为考虑 CPU 进行扩展时。如果目标设置为 30% 且 CPU 使用率为 97%:97%/30%=3.23,HPA 会将其四舍五入为 4(下一个更大的整数)。

  1. 基于多个 pod 指标的自动缩放 - 分别计算每个指标的副本数,然后取最大值。

示例:如果需要三个 pod 才能达到目标 CPU 使用率,而需要两个 pod 才能达到目标内存使用率,则 Autoscaler 将扩展到三个 pod - 达到目标所需的最高数量。

  1. 自定义指标的自动扩缩 - 允许您根据非资源指标类型进行扩缩容,例如根据每秒查询数扩缩前端应用程序。

希望对你有帮助。

【讨论】:

  • 感谢您的详细解释。我的情况在这里有点不同,就像我在部署文件中请求了 2000 Mi 和 1 个副本的内存,并且 HPA 配置为 80% 的利用率,所以第一次启动应用程序时显示 HPA 46% 的使用率,1 个副本最初是在部署文件中配置的,突然,当内存峰值发生时,HPA 扩展工作正常,它启动其他 Pod 如此缓慢,我的负载减少,内存变为 45%,理想情况下它应该是 1,因为没有负载,但我的副本仍然是 2。我希望 HPA 带来它降到 1. 任何建议!
  • @LakshmiReddy 你能发布部署和 hpa yaml 吗?
猜你喜欢
  • 1970-01-01
  • 2020-04-16
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 2021-04-18
  • 2020-10-13
  • 2021-07-01
相关资源
最近更新 更多