GKE:如何处理 CPU 密集型初始化的部署?

Posted

技术标签:

【中文标题】GKE:如何处理 CPU 密集型初始化的部署?【英文标题】:GKE: How to handle deployments with CPU intensive initialization? 【发布时间】:2019-11-08 08:26:17 【问题描述】:

我有一个 GKE 集群(n1-standard-1,主版本 1.13.6-gke.13),有 3 个节点,我有 7 个部署,每个运行一个 Spring Boot 应用程序。为每个部署创建了一个默认的 Horizo​​ntal Pod Autoscaler,目标 CPU 为 80%,最小 1/最大 5 个副本。

在正常运行期间,通常每个部署有 1 个 pod,CPU 使用率为 1-5%。但是当应用程序启动时,例如在执行滚动更新之后,CPU 使用率会达到峰值,并且 HPA 会扩展到报告 CPU 使用率达到 500% 或更多的最大副本数。

当同时启动多个部署时,例如集群升级后,经常会导致各种 Pod 因 CPU 不足而无法调度,并且一些 Pod 处于“Preemting”状态。

我已将 HPA 更改为最多 2 个副本,因为目前这已经足够了。但是我将来会添加更多的部署,很高兴知道如何正确处理这个问题。我对 Kubernetes 和 GCP 还很陌生,所以我不知道如何处理这个问题。

这是今天早些时候集群升级后其中一个容器的 CPU 图表:

一切都在默认命名空间中运行,我还没有触及默认的 LimitRange 和 100m 默认 CPU 请求。我应该修改这个并设置限制吗?鉴于初始化需要资源,适当的限制是什么?还是我需要升级机器类型以增加 CPU?

【问题讨论】:

初始化突发需要多长时间?您是否考虑过将部署部署参数更改为 maxSurge: 1minReadySeconds: 60,以便每 60 秒只会激增一个 pod?这样,虽然您的部署速度较慢,但​​您可以在不需要少量备用节点的情况下完成它们。 感谢您的建议。Spring Boot 应用程序通常需要大约 30 秒来初始化。似乎 maxSurge 已经默认为 1,但我尝试将 minSecondsReady 从 0 更改为 60,不幸的是它似乎没有帮助,因为 CPU 仍然爆裂并且 HPA 扩大了。 如果有两个副本并假设 CPU 阈值为 50%,如果一个副本为 100%,HPA 总是会从 1 变为 2。但是对于 10 个副本和一个 maxSurge 以及 50% 的阈值,它不应该。 您能否将就绪探测配置为仅在 CPU 使用率下降后启动?通过设置一个只能在初始化后才能成功启动的探针,或者通过设置“initialDelaySeconds”使探针只启动一个,CPU 使用率已经下降。 HPA 不应考虑未就绪的 pod @PatrickW 似乎准备探测正是我所需要的。将对此进行更多研究,谢谢! 【参考方案1】:

HPA only takes into account ready pods。由于您的 pod 只会在早期阶段经历 CPU 使用率的峰值,因此最好的办法是配置一个 readiness 探针,该探针仅在 CPU 使用率下降或将 initialDelaySeconds 设置为长于启动周期时才显示为就绪,以确保HPA 未考虑 CPU 使用率的峰值。

【讨论】:

以上是关于GKE:如何处理 CPU 密集型初始化的部署?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理“IllegalStateException:BeanFactory 未初始化或已关闭”?

KnockoutJS:我应该如何处理繁重的小部件初始化代码?

28 | 新特性:Tomcat和Jetty如何处理Spring Boot应用?

C编译器如何处理使用未初始化的变量?

libc库 与 MYSQL 不兼容 如何处理?

如何处理 Property<T>、更改监听器和属性的初始化?