Docker容器中的JVM初始CPU峰值



我有几个Java项目在Kubernetes管理的Docker容器中运行。我想启用基于Kubernetes提供的CPU的Horizontal Pod Autoscaling(HPA),但我发现在初始化容器时很难处理JVM引起的初始CPU峰值。

我目前还没有在Kubernetes yaml文件中为任何项目设置cpu限制,这基本上意味着我让pod从环境中尽可能多地占用cpu(我知道这是一种糟糕的做法,但它可以让我在不到30秒内启动JVM pod)
这造成的问题是,在最初3-4分钟的pod创建过程中,CPU使用量会激增,以至于如果我设置了自动缩放规则,它会触发它。自动缩放的pod会旋转并导致相同的峰值,然后重新触发自动缩放,直到达到pod的最大数量,事情稳定下来
我试着在kubernetes yaml文件中设置一个cpu限制,但我的项目所需的cpu数量并没有那么大,所以通过将其设置为非过多数量,我的pod会在5分钟内启动,这是不可接受的
我也可以将自动缩放延迟增加到10分钟以上,但这是一条全局规则,也会影响我需要快速扩展的部署,所以这对我来说也是不可行的选择。

这是我的一个pod 的cpu和内存配置示例

env:
resources:
requests:
memory: "1300Mi"
cpu: "250m"
limits:
memory: "1536Mi"

我最近还迁移到了Java 10,它应该针对容器化进行了优化。如有任何建议或意见,我们将不胜感激。提前谢谢。

编辑:
我也可以根据自定义的prometheus指标(如http_requests)设置hpa,但该选项将更难维护,因为有很多变量会影响pod可以处理的请求量。

取决于您的K8版本。

< 1.12:
在这个版本中,正如您所解释的,只有Kube控制器的--horizontal-pod-autoscaler-upscale-delay标志或HPAv2中的自定义度量。https://v1-11.docs.kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/

=>1.12:
这里我们得到了一个新的HPA算法,它在计算中丢弃了unReadypods,从而减少了自动校正。

https://github.com/kubernetes/kubernetes/pull/68068

更改HPA中的CPU样本净化。如果以下情况,则忽略样本:
-Pod正在初始化-标志定义的开始后5分钟
-Pod未准备好
-pad已准备好,但此后尚未收集完整的度量窗口转换
-Pod被初始化-从标志定义的开始5分钟:
-Pod在初始准备期后从未准备好。

这应该对您有所帮助。

最新更新