减少负载后防止K8S HPA删除Pod

时间:2019-12-30 08:29:49

标签: kubernetes kubernetes-hpa

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

所以我要实现的是停止hpa删除正在执行作业的pod。此外,我希望即使在负载减小到最小后,hpa也不要按比例缩小,而是在sidekiq指标中队列中的作业为0时删除pod。

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

2 个答案:

答案 0 :(得分:1)

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

实际上,无法实现所需的目标,因为常见的行为是支持不断增加的负载以应对工作量。达到此目的的唯一等待时间(,建议不要这样做)是将horizontal-pod-autoscaler-downscale-stabilization Kubernetes Controller Manager的flag更改为更高的值。

JFI,文档警告您:

  

注意:调整这些参数值时,集群操作员应意识到可能的后果。如果将延迟(冷却时间)值设置得太长,则可能会抱怨Horizo​​ntal Pod Autoscaler对工作负载的变化没有响应。但是,如果将延迟值设置得太短,则副本集的规模可能会像往常一样不断波动。

答案 1 :(得分:0)

根据#Hb_1993的讨论和所做的工作,可以使用预停止钩来延迟逐出,该延迟是基于操作时间或某种逻辑来确定游行是否完成的。

停止前钩子是一种生命周期方法,在收回Pod之前会调用它,然后我们可以附加到此事件并执行一些逻辑,例如执行ping检查,以确保我们的Pod已完成当前请求的处理

PS-将此溶液与少量盐一起使用,因为这可能无法在所有情况下都起作用或产生意想不到的结果。

为此,我们在preStop钩子中引入了sleep状态,这会延迟 关闭顺序。

更多详细信息可以在本文中找到。

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