具有矩阵数量的 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_messagestargetValue: "5000"。这种结构能够在流量突然增加时自动缩放。但是,它会导致尖锐的缩放。

我所说的尖尖是这样的:

    未确认消息的数量将超过目标值 自动扩缩器将增加 pod 的数量 由于 unacked 的数量会慢慢减少,但由于它仍然高于目标值,因此自动扩缩器仍会增加 pod 的数量 --> 这种情况会发生,直到我们达到自动扩缩器中的最大 pod 数量 未确认的数量会减少,直到低于目标,并且会保持在非常低的水平 自动扩缩器会将 pod 数量减少到最小 pod 数量 未确认消息的数量将再次增加,并且会出现与 (1) 类似的情况,并且会进入峰值循环/循环

这是出现尖峰时的图表(流量正在上升,但稳定且非尖峰): The spiky number of unacknowledged message in pub/sub

如果未确认消息的数量超过 20k,我们会在 stackdriver 中设置警报,并且在这种情况下总是会频繁触发。

在这种情况下,有没有办法让 HPA 变得更稳定(无尖刺)?

非常感谢任何评论、建议或回答。

谢谢!

【问题讨论】:

您是否查看过 this 文档中的“自动缩放与 Kubernetes 对象无关的指标”?看看这是否适合你的场景。 是的,我已阅读文档。我使用External 公制类型并尝试了ValueAverageValue。不幸的是,自动缩放仍然非常尖锐...... 这似乎是 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的主要内容,如果未能解决你的问题,请参考以下文章

GCP 云功能未正确接收/确认 PubSub 消息

PubSub 不确认消息

在 PubSub 订阅确认截止日期和重新传递的上下文中,未发送给订阅者的消息是啥意思?

GCP Pubsub 主题持续时间中存在的消息数

PubSub:如何设置没有指数退避的重试策略?

Google Cloud PubSub 不确认消息