PPe*_*kov 7 java containers jvm docker kubernetes
我有几个 Java 项目在使用 Kubernetes 管理的 Docker 容器中运行。我想启用基于 Kubernetes 提供的 CPU 的 Horizontal Pod Autoscaling(HPA),但我发现在初始化容器时很难处理由 JVM 引起的初始 CPU 峰值。
我目前还没有在 Kubernetes yaml 文件中为任何项目设置 CPU 限制,这基本上意味着我让 pod 从环境中获取尽可能多的 CPU(我知道这是一个不好的做法,但它让我启动 JVM豆荚在不到 30 秒内)。
这造成的问题是,在前 3-4 分钟内创建 pod 期间,CPU 使用率会激增,如果我设置了自动缩放规则,它将触发它。Autoscaled pod 将旋转并导致相同的尖峰并重新触发自动缩放,直到达到最大数量的 pod 并且事情稳定下来。
我尝试在 kubernetes yaml 文件中设置 cpu 限制,但是如果我的项目需要的 cpu 数量不是那么大,那么通过将其设置为非过度杀伤量会使我的 pod 旋转超过 5 分钟,这是不可接受的。
我也可以将自动缩放延迟增加到 10 分钟以上,但这是一个全局规则,它也会影响我需要非常快速扩展的部署,所以这对我来说也不是一个可行的选择。
这是我的一个 Pod 的 CPU 和内存配置示例
env:
resources:
requests:
memory: "1300Mi"
cpu: "250m"
limits:
memory: "1536Mi"
Run Code Online (Sandbox Code Playgroud)
我最近还迁移到了 Java 10,它应该针对容器化进行优化。任何建议或评论将不胜感激。提前致谢。
编辑:
我也可以根据自定义 prometheus 指标(如 http_requests)设置 hpa,但该选项将更难维护,因为有很多变量会影响 pod 可以处理的请求量。
取决于您的 K8 版本。
< 1.12:
在这个版本中,正如您所解释的,只有--horizontal-pod-autoscaler-upscale-delayKube-Controller 的标志或 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 未就绪
- Pod 已就绪,但自转换以来尚未收集完整的指标窗口
- Pod 已初始化 - 从标志定义的开始起 5 分钟:
- Pod 在初始准备期后从未准备好。
这应该对你有帮助。
| 归档时间: |
|
| 查看次数: |
923 次 |
| 最近记录: |