小编Daw*_*wel的帖子

如何正确管理 Kubernetes 中的 Java Spring 应用程序自动缩放?

我正在尝试在 Kubernetes(托管在 Google Kubernetes Engine 中)中为我的 Java Spring 应用程序设置自动缩放。我遇到了两个问题:

  1. Spring 应用程序在启动时使用大量 cpu(类似于 250mCPU*,但有时甚至是 500mCPU),这确实破坏了自动缩放,因为该应用程序的某些实例在或多或少不到 1 分钟后(Spring 上下文启动等),仅使用50mCPU。因为在某些环境下,应用程序使用少量的 mCPU(几乎在晚上的每个环境中),我想设置请求的 cpu=200mCPU max(= 80% 限制 cpu)(甚至更少!)。那么自动缩放就更有意义了。但我真的不能这么做,因为 Spring 的启动很繁重,如果我给他的 cpu 太少,它就不会完成。

  2. 当应用程序开始接收流量时(当由于自动缩放事件而创建新的 Pod 时),其 CPU 使用率可能会跳到标准使用率的 200% 之类的水平,然后又回到 100% - 看起来并不是因为太多的请求被推送到新的 pod,看起来更像是 JVM 在开始时速度较慢,并且在请求时收到了太多流量。看起来 JVM 需要诸如预热之类的东西(所以不要突然将 1/n 的流量推送到新 pod,而是将流量切换到新 pod 的速度更慢)。由于这种行为,自动缩放有时会变得疯狂 - 当它确实只需要多一个 Pod 时,它可以放大很多 Pod,然后缩小......

* 在 GKE 1000mCPU 中 = 1 个核心

在上传的图像上我们可以看到 cpu 图表。首先,我们可以看到启动后的cpu使用率比开始时要小得多。在第二个中,我们可以发现两个问题:开始时 CPU 使用率较高,然后是宽限期(就绪探测初始*延迟尚未完成),然后在接收流量开始时出现高选择。

* 我已将就绪探针初始延迟设置为比上下文加载更长。

图1 图2

我在互联网上找到的唯一一件事就是向该 Pod 添加容器,这只会“睡眠 x”,然后死掉。并将设置添加到该容器请求的 mCPU 数量,该数量将在 Spring 应用程序启动时使用(然后我必须增加该 Spring 应用程序容器的 cpu …

java spring jvm autoscaling kubernetes

5
推荐指数
1
解决办法
2284
查看次数

标签 统计

autoscaling ×1

java ×1

jvm ×1

kubernetes ×1

spring ×1