【问题标题】:How can I prevent horizontal pod autoscaler from taking out pods which are actively doing work?如何防止水平 pod autoscaler 取出正在积极工作的 pod?
【发布时间】:2021-09-05 04:17:21
【问题描述】:

我想使用 Horizo​​ntal Pod Autoscaler 批量运行一组长时间运行的任务。在某些情况下,这些任务可能需要几分钟或几小时才能运行,并且始终使用 80~100% 的可用 CPU 资源。

我想了解 Autoscaler 在决定缩减队列规模时的行为。

  1. 假设有 4 个实例都在工作,它们的 CPU 利用率都为 95%。它无法再向上扩展,因为最大实例数设置为 4。向上扩展阈值设置为 75% 平均 CPU 利用率。
  2. 如果 2 个实例提前完成了工作,但另外 2 个实例还有几个小时的工作时间,那么队列的平均 CPU 利用率可能会下降到 50%。
  3. 然后 Autoscaler 决定是时候缩减了。但是,4 个实例中有 2 个仍在工作,因此 Autoscaler 有 50% 的可能性可能会选择正在工作的 Pod 并将其终止。
  4. 如果发生这种情况,该工作进度将丢失并标记为未完成,并且其中一个可用 pod 将获取工作并从头开始工作。

有没有办法通过优先选择 CPU 利用率最低的 Pod 来先缩减规模来防止这种情况发生?这样,那些正在处理工作的 pod 将保持不变。

【问题讨论】:

    标签: kubernetes google-kubernetes-engine


    【解决方案1】:

    我不知道如何自定义在缩减副本数量时应删除部署中的哪些副本。

    也许您可以通过设置terminationGracePeriodSeconds 并使用preStop 挂钩来解决您的问题。

    使用terminationGracePeriodSeconds,您可以指定在发送第一个SIGTERM 信号和发送SIGKILL 信号之间,pod 中的容器将等待多长时间。这对您来说不是最理想的,因为 AFAIU 您不知道 Pod 需要多长时间才能完成分配的任务。 但是,如果您将此值设置得足够高,您也可以利用 preStop 挂钩。来自documentation

    PreStop 在容器终止之前立即调用 API 请求或管理事件,例如 liveness/startup probe 失败、抢占、资源争用等。处理程序不是 如果容器崩溃或退出,则调用。终止原因 传递给处理程序。 Pod 的终止宽限期倒计时 在 PreStop hooked 被执行之前开始。不管 处理程序的结果,容器最终将在 Pod 的终止宽限期。容器的其他管理 阻塞直到钩子完成或直到终止宽限期 到达。

    如果您能够在容器内运行“阻塞”命令直到容器完成工作,那么您应该能够使其仅在它空闲时终止。

    让我也链接一个很好的博客文章来解释整个事情是如何工作的:https://pracucci.com/graceful-shutdown-of-kubernetes-pods.html

    【讨论】:

    • 是的,我考虑过使用terminationGracePeriodSeconds + preStop 组合。无论如何,我都必须这样做,因为 Kubernetes 可能会出于各种原因终止 Pod,而不是缩小规模。正如您所说,问题在于即使设置的宽限期很高,也不能保证剩余的工作将在宽限期内完成。
    • 不幸的是,kubernetes pod 在设计上是短暂的,我觉得您的基础架构中可能存在设计级别的问题。您是否可以尝试将您的任务分成更小的部分,并减少任务被中断的问题?
    猜你喜欢
    • 2018-03-01
    • 2021-06-01
    • 2018-10-09
    • 2020-05-07
    • 2018-11-21
    • 2020-01-12
    • 1970-01-01
    • 2020-03-16
    • 2020-01-16
    相关资源
    最近更新 更多