java – Docker容器中的JVM初始CPU峰值

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

我目前还没有在任何项目的Kubernetes yaml文件中设置cpu限制,这基本上意味着我让pod从环境中获取尽可能多的CPU(我知道这是一个不好的做法,但它让我启动JVM豆荚不到30秒).
这会产生的问题是,在前3-4分钟创建pod时,CPU使用率将会大幅增加,如果我有自动缩放规则集,它将触发它.自动缩放的吊舱将旋转并导致相同的尖峰并重新触发自动缩放,直到达到最大数量的吊舱并且事情稳定下来.
我尝试在kubernetes yaml文件中设置一个cpu限制,但是如果我的项目所需的cpu数量不是那么大,那么通过将其设置为非过量的数量会使我的pods超过5分钟,这是不可接受的.
我还可以将自动缩放延迟增加到10分钟以上,但它的全局规则也会影响我需要快速扩展的部署,所以这对我来说也不是一个可行的选择.

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

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

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

编辑:
我也可以根据http_requests等自定义prometheus指标来设置hpa,但是由于存在许多可能影响pod可以处理的请求数量的变量,因此该选项将难以维护.

最佳答案 取决于您的K8版本.

< 1.12:
在这个版本中,您只能解释Kube-Controller的–horizo​​ntal-pod-autoscaler-upscale-delay标志或HPAv2中的自定义指标. https://v1-11.docs.kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/

=> 1.12:
在这里,我们获得了一种新的HPA算法,该算法在计算中丢弃了unReady pod,从而减少了自动纠正.

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

Change CPU sample sanitization in HPA.
Ignore samples if:
– Pod is beeing initalized – 5 minutes from start defined by flag
– pod is unready
– pod is ready but full window of metric hasn’t been colected since
transition
– Pod is initialized – 5 minutes from start defined by flag:
– Pod has never been ready after initial readiness period.

这应该对你有所帮助.

点赞