解决k8s集群环境内存不足导致容器被kill问题

2023-11-18


背景

最近线上环境上出现了一个问题, k8s集群环境Pod中的tomcat容器运行一段时间后直接被killd,但有时一切看起来正常,不能准确判断在什么时机出现被Killd问题。

本文就此问题介绍了Linux内存不足原因以及为什么特定进程会被杀死。并提供了Kubernetes集群环境故障排除指南教程。

tomcat进程被杀死原因分析

当这个应用程序被kill问题进行故障排除时,很大程度上确定是操作系统杀死的, 因为整个过程确认没有进行kill操作。当我查看tomcat日志时发现,tomcat只是简单的提示了killd, 至于原因, 日志中没有给出详尽的提示。紧接着我查看了syslog日志grep -i kill /var/log/messages*, syslog给出比较详细的提示, 大概意思是该应用占用内存超过cgroup限制, 直接被Kill。如下所示:

Oct 1 20:37:21 k8swork kernel: Memory cgroup out of memory: Kill process 13547 (java) score 1273 or sacrifice child

如果当服务已经挂掉, 使用free查看内存占用, 对我们排除问题不会有太大帮助, 因为这个时候服务占用内存已经随着服务的挂掉而释放。如下所示:

[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次。该&行末尾的允许我们将其作为一个进程运行并重新获得终端。

vmstat -SM 120 1000 > memoryuse.out &

通过如上信息可以判定罪魁祸首是这个Java进程占用内存超过资源限制, 直接被系统杀死。为什么会出现这个问题呢?

首先第一点,已经在编排文件中限制资源最大使用量为4G,理论上Pod中容器是不可能占用这么多资源, 默认情况下Java占用物理资源的1/4左右, 但是既然出现了这个问题,说明Java进程占用资源超过了这个限制。

于是在网上找到了如下信息,大概意思是说,jdk从131版本之后开始通过选项支持对容器对内存和CPU 的限制,如下图所示:

https://blogs.oracle.com/java-platform-group/java-se-support-for-docker-cpu-and-memory-limits

当我打开131版本更新信息之后,没有看到任何关于容器相关的更新, 于是开始查找之后的版本, 最后找到191版本, 可以看到Java对容器做出了支持。

https://www.oracle.com/java/technologies/javase/8u191-relnotes.html

核对了目前出现问题的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证书过期问题 它不仅详细介绍了整个故障排除和解决方式, 另外给出了集群环境证书认证体系流程介绍, 非常赞!

Citadel 证书体系

如果需要请在公众号后台回复[k8s]获取下载地址。

推荐


云原生时代Java面临的不适与挑战

Kubernetes入门培训(内含PPT)

从Ice到Kubernetes容器技术,微服务架构经历了什么?


原创不易,随手关注或者”在看“,诚挚感谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决k8s集群环境内存不足导致容器被kill问题 的相关文章

随机推荐

  • 指针和数组笔试题

    目录 一维数组 字符数组 二维数组 指针笔试题 一维数组 数组和指针 数组 能够存放一组相同类型的元素 数组的大小取决于数组的元素个数和元素类型 指针 地址 指针变量 大小是4 8个字节 数组是数组 指针是指针 二者不等价 数组名是数组首元
  • replace和replaceAll的区别

    String对象中的replace和replaceAll的区别 replace方法 支持字符和字符串的替换 public String replace char oldChar char newChar public String repl
  • Avue

    Avue中 avue crud的事件调用
  • c语言程序小时工资计算,C语言入门之工资计算

    includeint main 1 请输入税前工资 int money 0 printf 请输入您的税前工资 scanf d money 2 养老保险 个人8 单位12 double yangLao1 money 0 08 double y
  • 微信支付逻辑图

    微信支付时序图 微信支付官方文档https pay weixin qq com wiki doc api index html xml与对象的互转 微信使用xml格式而不使用json通信 也确实有点奇葩 签名 千万不要以为只是MD5一下 要
  • 前端实现图片悬浮_悬浮图片之上效果实现

    其实很简单 就是一个margin top的问题 但是需要relative的定位方式才能悬在上面 html部分 草帽的创新 聚集国内外优秀人才 聚焦新技术及产品研究 以开放互联的理念 驱动企业创新发展 实现怎样的创新 服务全国品牌用户 实现多
  • Anchor-Free目标检测模型

    FCOS Fully Convolutional One Stage Object Detection 已开源 FoveaBox Beyond Anchor based Object Detector 未开源 FCOS 摘要 我们提出了一种
  • Android2023暑期实习---网易游戏一面面经

    Android2023暑期实习 网易游戏一面面经 2022 03 28 14 00 网易游戏一面 个人感觉网易游戏面试 题目有一定难度特别考验基础 自己基础不太行 加之开盘就慌了 肯定后面就是全局崩溃 主要是那些算法和操作系统 还有一些框架
  • Nginx配置-开启Http认证basic authentication

    Nginx配置 开启Http认证basic authentication txt 生成密码 将密放置于配置文件 修改nginx conf 重新加载nginx配置生效 认证测试 生成密码 可以使用htpasswd 或者使用openssl 比如
  • Android APP安装后在桌面上不显示应用图标

    前几天在写项目的时候运行的时候突然Android桌面上没有了应用图标 但是应用里面下载的应用有 调试版本和发布正式的版本都没有 之前以为是因为用了不同的keystore发布了两个不同的正式版本造成的问题 后来在看别人的文章才知道是什么问题
  • Win10中将WSL Ubuntu20.04设置普通用户为默认用户

    直接通过Microsoft Store安装的Ubuntu默认安装于C盘中 会占用一定空间 在导出wsl至本人电脑E盘后 每次登录都是root用户 参考网上教程使用 Ubuntu 20 04 config default user 用户名来更
  • prometheus通过node_exporter抓取的数据准确计算磁盘使用率

    公司使用的openstack的备份服务组件karbor 要查询所使用的备份nas磁盘使用率的需求 根据以前的查询语句 很快写出如下的prom sql 100 topk 1 node filesystem free device 100 no
  • SDRAM详解(结构框图、容量计算、寻址方式、初始化)

    1 SDRM介绍 SDRAM Syncronized Dynamic Ramdam Access Memory 是同步动态随机存储器 是DRAM的升级版 在SDRAM的基础上又发展出DDR double rate 即双倍速度的SDRAM D
  • vue-cli 工程中 访问插槽 数据

    具体解释参考文档 这个插槽啊 怎么说呢 如果你不开发组件 几乎很少用到 甚至用不到 访问插槽呢 使用方法vm slots 插槽名字 如果有的插槽没有名字 则使用vm slots default 访问 打印得到都是数组 得到dom 元素 vm
  • make_moons函数

    生成半环形数据 sklearn datasets make moons n samples 100 shuffle True noise None random state None 参数 n samples 整数型 可选 默认为100 产
  • Java中return、continue和break的区别

    之前一直对return continue break用法有混淆 今日特此学习 1 return 直接跳出当前的方法 返回到该调用的方法的语句处 继续执行 2 break 在循环体内结束整个循环过程 3 continue 结束本次的循环 直接
  • Flame Graphs 火焰图安装与使用

    一 火焰图概述 火焰图 flame graph 是性能分析的利器 通过它可以快速定位性能瓶颈点 perf 命令 performance 的缩写 是 Linux 系统原生提供的性能分析工具 会返回 CPU 正在执行的函数名以及调用栈 stac
  • 380. O(1) 时间插入、删除和获取随机元素

    实现RandomizedSet 类 RandomizedSet 初始化 RandomizedSet 对象 bool insert int val 当元素 val 不存在时 向集合中插入该项 并返回 true 否则 返回 false bool
  • [机缘参悟-74]:沟通技巧-无论在职场还是在家,尽量少用反问句

    目录 反问句的案例 尽量不要使用反问句 避免使用反问词 把反问句改为陈述句 反问句的案例 那天闲聊 邻居老贾向老友们诉苦 老伴今天又用反问句 款待 他了 中午炒菜时 老伴让他拿一瓶油来 老贾问 油瓶在哪里 你觉得油瓶会在哪里 老贾又问 是不
  • 解决k8s集群环境内存不足导致容器被kill问题

    背景 最近线上环境上出现了一个问题 k8s集群环境Pod中的tomcat容器运行一段时间后直接被killd 但有时一切看起来正常 不能准确判断在什么时机出现被Killd问题 本文就此问题介绍了Linux内存不足原因以及为什么特定进程会被杀死