spring-boot - GKE : How to handle deployments with CPU intensive initialization?

标签 spring-boot kubernetes google-kubernetes-engine autoscaling

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

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

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

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

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

CPU usage

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

最佳答案

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

关于spring-boot - GKE : How to handle deployments with CPU intensive initialization?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56771994/

相关文章:

java - 如何验证 pojo 集合

java - Lombok,仅使用 getter setter 不等于或 tostring

java - 只允许预定义包中的类调用构造函数/方法?

kubernetes - 实时监控k8s容器中的CPU使用率/CPU限制

java - 升级到Spring boot 2.1.0 Data Jpa + Batch,遇到ORA-00942

ruby - 运行 Redis 作为 Redmine 的外部缓存服务器

docker - 为什么Docker容器可以看到主机上的所有GPU设备?

kubernetes - <.Chart.name> : can't evaluate field name in type interface {}

kubernetes - 是否可以在Google容器引擎中打开ABAC模式(授权)?

kubernetes - k8 入口和谷歌负载均衡器之间的胶水是什么