具有矩阵数量的 pubsub 未确认消息的尖峰 kubernetes HPA
Posted
技术标签:
【中文标题】具有矩阵数量的 pubsub 未确认消息的尖峰 kubernetes HPA【英文标题】:Spiky kubernetes HPA with metric number of pubsub unacked messsages 【发布时间】:2019-04-24 23:53:02 【问题描述】:目前我们有一个数据流管道:api call -> google pub/sub -> BigQuery。 api调用的数量将取决于网站的流量。
我们创建了一个 kubernetes 部署(在 GKE 中),用于将数据从 pub/sub 提取到 BigQuery。此部署有一个水平 pod 自动缩放器 (HPA),带有 metricName: pubsub.googleapis.com|subscription|num_undelivered_messages
和 targetValue: "5000"
。这种结构能够在流量突然增加时自动缩放。但是,它会导致尖锐的缩放。
我所说的尖尖是这样的:
-
未确认消息的数量将超过目标值
自动扩缩器将增加 pod 的数量
由于 unacked 的数量会慢慢减少,但由于它仍然高于目标值,因此自动扩缩器仍会增加 pod 的数量 --> 这种情况会发生,直到我们达到自动扩缩器中的最大 pod 数量
未确认的数量会减少,直到低于目标,并且会保持在非常低的水平
自动扩缩器会将 pod 数量减少到最小 pod 数量
未确认消息的数量将再次增加,并且会出现与 (1) 类似的情况,并且会进入峰值循环/循环
这是出现尖峰时的图表(流量正在上升,但稳定且非尖峰): The spiky number of unacknowledged message in pub/sub
如果未确认消息的数量超过 20k,我们会在 stackdriver 中设置警报,并且在这种情况下总是会频繁触发。
在这种情况下,有没有办法让 HPA 变得更稳定(无尖刺)?
非常感谢任何评论、建议或回答。
谢谢!
【问题讨论】:
您是否查看过 this 文档中的“自动缩放与 Kubernetes 对象无关的指标”?看看这是否适合你的场景。 是的,我已阅读文档。我使用External
公制类型并尝试了Value
和AverageValue
。不幸的是,自动缩放仍然非常尖锐......
这似乎是 GKE 版本中的一个缺陷。您使用的是哪个版本?根据documentation,这个问题已经在 kubernetes 1.12 版中得到解决。希望这同样适用于最新的 GKE 版本。可能是 GKE 1.12 或最新版本。
目前我仍在使用 1.10.6-gke.11 版本。 GKE 中可用的最新版本的 Kubernetes 是 1.11.3-gke.18。届时将尝试升级它。谢谢!
@YosuaMichael 何时选择自定义/外部指标?
【参考方案1】:
我一直在处理同样的行为。我最终做的是使用移动平均线平滑num_undelivered_messages
。我设置了一个 k8s cron,它每分钟将过去 20 分钟时间序列数据的平均值发布到自定义指标。然后配置 HPA 以响应自定义指标。
这效果很好,但并不完美。我观察到,一旦平均值收敛于实际值,HPA 就会将服务缩减得太低。所以我最终只是添加了一个常数,所以自定义指标只是平均值 + 常数。我发现对于我的具体情况,25,000 的值效果很好。
这样,在拨入targetAverageValue后,自动缩放已经很稳定了。
我不确定这是由于缺陷造成的,还是仅仅是由于负载非常高时 num_undelivered_messages
指标的性质。
编辑: 我使用了 stackdriver/monitoring golang 包。有一种聚合时间序列数据的简单方法;在“聚合数据”下查看此处https://cloud.google.com/monitoring/custom-metrics/reading-metrics
https://cloud.google.com/monitoring/custom-metrics/creating-metrics
【讨论】:
以上是关于具有矩阵数量的 pubsub 未确认消息的尖峰 kubernetes HPA的主要内容,如果未能解决你的问题,请参考以下文章