k8s资源配置过大导致资源不足引起spring初始化问题
环境明两个应用, springbootA springbootBk8s方面, helm charts配置,管理界面 rancher主机,32gb内存,此主机上原生运行一个4G的jvm,另加springbootA springbootB各一个PodspringbootA helm chart 资源配置resources:limits:cpu: 4memory: 8Girequests:cpu: 2m
环境说明
两个应用, springbootA springbootB
k8s方面, helm charts配置,管理界面 rancher
主机,32gb内存,此主机上原生运行一个4G的jvm和一些其它组件,另加springbootA springbootB各一个Pod
springbootA helm chart 资源配置:
resources:
limits:
cpu: 4
memory: 8Gi
requests:
cpu: 2
memory: 4Gi
springbootB helm chart 资源配置:
resources:
limits:
cpu: 4
memory: 8Gi
requests:
cpu: 2
memory: 4Gi
错误表象
应用方面
某beanA 是一个configuration bean,以prefix方式从yml中读取配置并注入到bean的属性上
某beanB依赖beanA中的属性,但在k8s环境中启动时检查此属性为null报错
本地启动没有问题,比较简单的问题,理论上应该不难排查,但…
k8s rancher方面
springbootA 报running 一个pod, scheduling 一个pod (upgrading workload)
springbootB 报Deplovment does not have minimum availability,unavailable一个pod
原因&解决方案
32gb内存,一些组件和4Gjvm,剩下的按k8s的配置,资源确实是不足的
请教之前成功搭建环境的同事,他说感觉是资源问题,后来找运维同事改了下配置如下
limits:
cpu: 4
memory: 4Gi
requests:
cpu: 100m
memory: 1Gi
结论
正常快速启动成功,springbootA springbootB各一个pod running
思考
为什么?有大佬能指点迷津吗?感觉问题和解决方案都莫名其妙
资源不足会导致一个pod 处于scheduling 状态,另一个pod因资源不足导致springcontext启动失败,资源不足为什么不直接让pod启动失败,而是启动了jvm内存不足让app失败呢?
难道是内存不足spring bean 不给注入值了??
参考资料
为容器管理资源 | Kubernetes
https://kubernetes.io/zh/docs/concepts/configuration/manage-resources-containers/
更多推荐
所有评论(0)