Docker容器中的JVM初始CPU峰值

时间:2019-01-21 13:07:29

标签: java docker kubernetes jvm containers

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

我目前尚未在Kubernetes yaml文件中为任何项目设置cpu限制,这基本上意味着我让Pod尽可能多地从环境中获取CPU(我知道这是一种不好的做法,但这样做我可以在不到30秒的时间内启动JVM Pod。
这造成的问题是,在最初的3-4分钟内,在容器的创建过程中,CPU使用率会急剧上升,以至于如果我设置了自动缩放规则,它将触发它。自动缩放的广告连播会旋转并引起相同的峰值,然后重新触发自动缩放,直到达到最大数量的广告连播且一切稳定下来。
我尝试在kubernetes yaml文件中设置cpu限制,但是如果我的项目需要的cpu​​量不是那么大,那么将其设置为非过度杀伤量会使我的豆荚在5分钟以上旋转,这是不可接受的。
我还可以将自动扩展延迟增加到10分钟以上,但这是一个全局规则,该规则也会影响我需要快速扩展的部署,因此这对我来说也不可行。

这是我的一个Pod的示例CPU和内存配置

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

我最近还迁移到Java 10,该Java 10应该针对容器化进行了优化。 任何建议或评论将不胜感激。 预先感谢。

编辑:
我还可以基于自定义的Prometheus指标(例如http_requests)来设置hpa,但是由于存在很多会影响pod可以处理的请求量的变量,因此该选项将很难维护。

1 个答案:

答案 0 :(得分:1)

取决于您的K8版本。

< 1.12
正如您所解释的,在此版本中,只有Kube-Controller的--horizontal-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

  

更改HPA中的CPU样本消毒。   如果出现以下情况,请忽略样品:
  -Pod发出蜂鸣声-从标志定义的开始起5分钟内
  -吊舱尚未就绪
  -广告连播已准备好,但自此以来尚未收集完整的指标窗口   过渡
  -Pod已初始化-从标志定义的开始时间起5分钟:
  -在准备阶段过后,Pod从未准备就绪。

这应该对您有帮助。