环境说明

两个应用, 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 availabilityunavailable一个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/

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐