k8s pod频繁自动重启

一 jvm导致的

原文:https://blog.csdn.net/zenglingmin8/article/details/117963136
问题描述:某个服务重启频率非常高,监控告警里产生了大量的“jvm内存超过limit 85%”和服务503告警
jvm内存超警戒告警
排查思路:

1 刚开始粗浅的认为是服务压力太大,于是增加pod数量,然而问题依旧

2  查看服务运行状态,发现服务频繁重启
服务频繁重启

3   查看该服务的pod资源配额配置
服务资源配额

4 进入容器,查看该服务的的jvm启动参数,发现最大堆内存设置竟然超过了pod资源配额的limit值
jvm堆内存

5 调整jvm最大堆内存(Xmx)的值不超过pod资源配额limit的85%,问题解决
jvm最大堆内存

总结:jvm参数设置的时候,要综合考虑pod资源配额limit的值和告警触发值,否则容器很容易因为不合理的jvm参数设置达到pod资源配额的上限而被kill掉,导致频繁的触发告警。

k8s集群环境下,docker容器中运行镜像方式启动springboot项目。由于制作的镜像未对JVM的内存进行配置,那么 JVM 会默认设置堆栈的大小,这个大小是根据物理机的内存进行分配的。 那么物理机的内存越大,默认分配的内存就越大(最大堆栈=1/4 * 物理机内存,初始堆栈=1/64 * 物理机内存)。
JVM 是不知道自己在Docker容器中运行的,jvm识别的是物理主机的内存,而不是k8s给pod分配的内存或docker容器的内存。

因此在没有给jvm指定内存大小的情况下,机器物理内存很大时,jvm默认占用的内存Xms超出了k8s分配给pod的内存,导致pod内存溢出,从而k8s不断重启pod。也可能是运行过程中,jvm不断申请内存直到最大堆内存Xmx,Xmx超出了k8s分配给pod的内存,从而k8s自动重启pod。

注意,jdk版本不同,配置参数可能也会不同。
————————————————
版权声明:本文为CSDN博主「zenglingmin8」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zenglingmin8/article/details/117963136

二 Kubernetes Pod不断自动重启–Exit Code = 0 没有pid=1 的进程导致
原文:https://blog.csdn.net/ibless/article/details/107630150

#获取pod信息
kubectl get pods -o wide -n <namespace-name>
#查看pod log
kubectl logs <pod-name>
#查看pod详细信息
kubectl describe <pod-name>

通过上述指令,我发现Pod是正常退出(即Exit code = 0)的,也就是说Pod是正常启动的,然后就运行结束了。由于k8s中Pod的默认restartPolicy为Always,也就是说Pod会不断进行重启。最后,通过执行一些脚本,我发现Pod不断自动重启的原因是没有Pid=1的进程,或者说Pod启动时执行的脚本是1号进程,但脚本执行完之后就没有1号进程了,所以Pod相当于运行结束了。可以查看如下链接:https://segmentfault.com/a/1190000009583997。
————————————————
版权声明:本文为CSDN博主「ibless」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ibless/article/details/107630150

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值