2

我有来自 prometheus 适配器的 sidekiq 自定义指标。使用普罗米修斯的队列指标我已经设置了 HPA。当 sidekiq 队列中的作业超过 1000 个作业时,HPA 会触发 10 个新 pod。然后每个 pod 将在队列中执行 100 个作业。当工作减少到 400 个时。HPA 将按比例缩小。但是当缩减发生时,hpa 杀死 pod 说 4 个 pod 被杀死。Thoes 4 pods 仍在运行作业,说每个 pod 正在运行 30-50 个作业。现在,当 hpa 删除这 4 个 pod 时,在它们上运行的作业也会终止。并且这些工作在 sidekiq 中被标记为失败。

所以我想要实现的是阻止 hpa 删除正在执行作业的 pod。此外,我希望 hpa 即使在负载降至最低后也不会缩小,而是在 sidekiq 指标中队列中的作业为 0 时删除 pod。

有什么办法可以做到这一点?

4

2 回答 2

1

老实说,奇怪的用法:即使您的流量处于冷却阶段,您也在浪费资源,但是由于您没有提供更多详细信息,所以在这里。

实际上,不可能实现您想要的,因为常见的行为是支持您的工作负载不断增长的负载。实现这一点的唯一等待(不推荐这样做)是将horizontal-pod-autoscaler-downscale-stabilizationKubernetes 控制器管理器的标志更改为更高的值。

JFI,文档警告您:

注意:在调整这些参数值时,集群操作员应该意识到可能的后果。如果延迟(冷却)值设置得太长,可能会抱怨 Horizo​​ntal Pod Autoscaler 无法响应工作负载的变化。但是,如果延迟值设置得太短,则副本集的规模可能会像往常一样持续颠簸。

于 2019-12-30T08:50:02.913 回答
0

根据讨论和#Hb_1993 所做的工作,可以使用 pre-stop hook 来延迟驱逐,其中延迟基于操作时间或某些逻辑来了解游行是否完成。

pre-stop hook 是一个生命周期方法,在 pod 被驱逐之前调用,然后我们可以附加到这个事件并执行一些逻辑,比如执行 ping 检查,以确保我们的 pod 已经完成了当前请求的处理。

PS-将此溶液与少许盐一起使用,因为这可能不适用于所有情况或产生意想不到的结果。

为此,我们在 preStop 钩子中引入了 sleep 来延迟关闭序列。

更多细节可以在这篇文章中找到。

https://blog.gruntwork.io/delaying-shutdown-to-wait-for-pod-deletion-propagation-445f779a8304

于 2020-01-07T06:08:33.590 回答