背景
最近线上环境上出现了一个问题, k8s集群环境Pod中的tomcat容器运行一段时间后直接被killd,但有时一切看起来正常,不能准确判断在什么时机出现被Killd问题。html
本文就此问题介绍了Linux内存不足缘由以及为何特定进程会被杀死。并提供了Kubernetes集群环境故障排除指南教程。java
tomcat进程被杀死缘由分析
当这个应用程序被kill问题进行故障排除时,很大程度上肯定是操做系统杀死的, 由于整个过程确认没有进行kill操做。当我查看tomcat日志时发现,tomcat只是简单的提示了killd, 至于缘由, 日志中没有给出详尽的提示。紧接着我查看了syslog日志grep -i kill /var/log/messages*
, syslog给出比较详细的提示, 大概意思是该应用占用内存超过cgroup限制, 直接被Kill。以下所示:web
Oct 1 20:37:21 k8swork kernel: Memory cgroup out of memory: Kill process 13547 (java) score 1273 or sacrifice child
若是当服务已经挂掉, 使用free查看内存占用, 对咱们排除问题不会有太大帮助, 由于这个时候服务占用内存已经随着服务的挂掉而释放。以下所示:docker
[root@k8swork log]# free -lm
total used free shared buffers cached
Mem: 498 93 405 0 15 32
Low: 498 93 405
High: 0 0 0
-/+ buffers/cache: 44 453
Swap: 1023 0 1023
可是Linux vmstat可使用如下命令将的输出重定向到文件。咱们甚至能够调整持续时间和次数以监控更长的时间。当命令运行时,咱们能够随时查看输出文件以查看结果。咱们每120秒查看内存1000次。该&行末尾的容许咱们将其做为一个进程运行并从新得到终端。tomcat
vmstat -SM 120 1000 > memoryuse.out &
经过如上信息能够断定罪魁祸首是这个Java进程占用内存超过资源限制, 直接被系统杀死。为何会出现这个问题呢?微信
首先第一点,已经在编排文件中限制资源最大使用量为4G,理论上Pod中容器是不可能占用这么多资源, 默认状况下Java占用物理资源的1/4左右, 可是既然出现了这个问题,说明Java进程占用资源超过了这个限制。架构
因而在网上找到了以下信息,大概意思是说,jdk从131版本以后开始经过选项支持对容器对内存和CPU 的限制,以下图所示:oracle
当我打开131版本更新信息以后,没有看到任何关于容器相关的更新, 因而开始查找以后的版本, 最后找到191版本, 能够看到Java对容器作出了支持。app
核对了目前出现问题的Java版本, 明显是低于这个版本的, 肯定了问题所在。编辑器
“Java虚拟机感知不到Pod中资源限制,因此直接占用了宿主机1/4左右内存(宿主机是32G内存), cgroup检测到Pod占用内存超过限制(Pod限制为4G),进行了Kill操做。
”
解决方式也很简单,直接在tomcat服务中配置最大最小内存占用, 在Java层面限制其内存占用。可是具体Java进程为何占用这么高的内存就须要业务开发人员排查解决了。
总结
经过本文能够看出基于Java虚拟机构建项目, 在容器化过程当中要尽可能适配高版本或者对docker容器有亲和性的Jdk版本, 若是没有, 必定要在虚拟机层面限制Java服务占用内存大小。另一定要在服务上添加存活探针,若是没有添加存活探针,相似于tomcat这种容器类服务,即便内部服务挂了了, Kubernetes不会自动帮你拉起的,缘由很简单,它没法感知到你的服务是否存活。因此服务必定要添加Http存活探针(基于TCP层面的探针只是检测端口是否存活,大多数状况下,服务会出现假死问题,但端口依然能够正常访问)。
问题故障排查指南教程推荐
首先这本书是阿里云同窗总结的<<深刻浅出Kubernetes>>, 里面不只用通俗易懂语言介绍了Kubernetes核心概念, 并且介绍了Kubernetes集群出现问题解决思路,值得借鉴。好比其中一个案例半夜两点Ca证书过时问题
它不只详细介绍了整个故障排除和解决方式, 另外给出了集群环境证书认证体系流程介绍, 很是赞!
若是须要请在公众号后台回复[
k8s
]获取下载地址。
推荐
从Ice到Kubernetes容器技术,微服务架构经历了什么?
原创不易,随手关注或者”在看“,诚挚感谢!
本文分享自微信公众号 - 云原生技术爱好者社区(programmer_java)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。