post-mortem机制

生产问题从不有趣。 它们似乎总是在您不上班时发生,原因似乎总是很愚蠢。 我们最近在生产Kubernetes集群中遇到了节点内存不足的问题,但是该节点很快恢复了,没有任何明显的中断。 在这个故事中,我们将探讨集群中发生的特定问题,影响是什么以及将来如何避免该问题。

首先,有一点背景。 我为Blue Matador工作,这是AWS和Kubernetes的监视警报自动化服务。 我们在带有Kubernetes的AWS中运行的自己的系统上使用我们的产品。 这个故事是由我们一位才华横溢的软件工程师创建的,用他自己的话说。

第一次发生

下午5:12-2019年6月15日星期六

Blue Matador创建了一个警报,说我们的生产集群中的一个Kubernetes节点发生了SystemOOM事件。

下午5:16

Blue Matador创建一个警告,指出发生SystemOOM事件的节点的EBS突发平衡在根卷上较低。 虽然突发突发事件是在SystemOOM事件之后发生的,但实际的CloudWatch数据显示突发均衡处于下午5:02的最低点。 延迟的原因是EBS指标始终落后10-15分钟,因此我们的系统无法实时捕获所有内容。

下午5:18

这是我实际上开始注意到警报和警告的时间。 我快速kubectl让pods看到了影响,并很惊讶地发现我们的零个 app pods死亡了。 使用kubectl顶级节点也不会表明所讨论的节点存在内存问题-它已经恢复,内存使用率约为60%。 就在5点钟之后,我不希望Session IPA变热。 在确认该节点运行状况良好并且没有豆荚受到影响之后,我认为一定有幸。 绝对可以在星期一进行调查。

这是那天晚上我和CTO之间的整个Slack对话:

第二次发生

下午6:02-2019年6月16日星期日

蓝色斗牛士生成警报,指出另一个节点发生SystemOOM事件。 我的CTO一定一直在盯着他的手机,因为他会立即做出响应,并且由于他无法访问计算机(让我重新安装Windows?),我不得不参加这次活动。 再一次,一切似乎都很好。 我们的所有Pod都没有被杀死,节点内存使用率略低于70%。

下午6:06

蓝色斗牛士再次为EBS胸围平衡发出警告。 由于这是我们遇到问题的第二天,所以我不能放过这张幻灯片。 CloudWatch看起来与以前相同,突发问题在问题发生前约2.5小时内下降。

下午6:11

我登录Datadog并查看内存消耗。 我注意到有问题的节点确实在SystemOOM事件发生之前确实具有很高的内存使用率,并且能够快速地将其跟踪到我们熟练的豆荚舱。

在SystemOOM事件发生时,您可以清楚地看到内存使用量的急剧下降。 我推断这些Pod是占用所有内存的内存,当SystemOOM发生时,Kubernetes能够确定这些Pod可以被杀死并重新启动以回收它所需的所有内存,而不会影响我的其他Pod。 Kubernetes非常令人印象深刻。

那么,为什么在星期六尝试查看哪些豆荚已重新启动时却没有注意到这一点? 我在一个单独的命名空间中运行流畅的Sudologic Pod,但我并不认为要匆匆忙忙地看那里。

要点1:检查重新启动的Pod时,请检查所有命名空间

有了这些信息,我能够计算出其他节点在接下来的24小时内不会用完内存,但是我继续进行并重新启动所有Sumicologic Pod,以便它们在内存不足时开始使用。 Sprint计划是第二天早上,因此我可以将这个问题纳入我的正常工作时间,而不必在周日晚上过分强调。

下午11:00

刚刚完成了《黑镜》的新剧集之一(我实际上很喜欢麦莉的那一集),并决定进行检查。 内存使用情况看起来不错,我绝对可以让事情整夜解决。

修复

在星期一,我可以花一些时间解决这个问题。 我绝对不想每天晚上处理这个问题。 我到目前为止所知道的:

1.流畅的容器使用了很多内存

2.在SystemOOM之前,有很多磁盘活动,但是我不知道是什么

起初,我认为如果突然涌入日志,流利的容器将占用大量内存。 在检查了Sumologic之后,我可以看到我们的日志使用情况相当稳定,并且在出现问题的时间里日志数据没有增加。

一些快速的搜索使我想到了这个github问题 ,这表明可以使用一些Ruby配置来降低内存使用量。 我继续将环境变量添加到我的pod规范中并进行了部署:

env:- name: RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTORvalue: "0.9"

在查看流利的摘要清单时,我注意到我没有指定任何资源请求或限制。 我已经怀疑RUBY_GCP_HEAP修复会做任何令人惊奇的事情,因此在这一点上指定内存限制很有意义。 即使这次我无法解决内存问题,至少也可以仅将这组Pod的内存使用情况包含在内。 使用kubectl顶部吊舱| grep的fluentd-sumologic我能得到多少资源的一个好主意,要求:

resources:requests:memory: "128Mi"cpu: "100m"limits:memory: "1024Mi"cpu: "250m"

要点2:指定资源限制,尤其是对于第三方应用程序

跟进

几天后,我能够确认上述修复程序有效。 节点上的内存使用情况稳定,而且Kubernetes,EC2或EBS中的任何组件都没有任何问题。 我意识到为我运行的所有Pod设置资源请求和限制是多么重要,因此实现默认资源限制和资源配额的某种组合现在就在我们的积压工作中。

剩下的最后一个谜是与SystemOOM事件相关的EBS突发平衡问题。 我知道,当内存不足时,操作系统将使用交换空间来避免完全耗尽内存。 但这不是我的第一个牛仔竞技表演,而且我知道Kubernetes甚至不会在启用了交换功能的服务器上启动。 可以肯定的是,我通过SSH进入我的节点,以查看是否同时使用freeswapon -s启用了交换功能,而没有启用交换功能。

由于交换不是问题,实际上,在节点内存不足时,导致磁盘IO增加的原因实际上我没有更多线索。 我目前的理论是,流利的Sud pod本身当时正在编写大量日志消息,也许是与Ruby GC配置有关的日志消息? 当内存不足时,还有其他Kubernetes或日志日志源也可能变得闲谈,我可能会在流畅的配置中将它们过滤掉。 不幸的是,我再也无法在问题发生之前立即访问日志文件,并且目前没有办法进行更深入的研究。

要点3:在仍然可以解决所有问题的同时,更深入地挖掘根本原因

结论

即使我并非所见到的每个问题都有根本原因,但我相信我无需付出更多努力来再次预防此问题。 时间很宝贵,我已经在这个问题上花了足够的时间,然后写这篇文章分享。 由于我们使用Blue Matador ,因此实际上我们对这类问题有很好的报道,这使我可以揭开一些谜团,以支持重新使用我们的产品。

翻译自: https://hackernoon.com/post-mortem-kubernetes-node-oom-5ft9m38yz

post-mortem机制

post-mortem机制_发布Mortem:Kubernetes节点OOM相关推荐

  1. Redis 学习笔记-NoSQL数据库 常用五大数据类型 Redis配置文件介绍 Redis的发布和订阅 Redis_事务_锁机制_秒杀 Redis应用问题解决 分布式锁

    1.NoSQL数据库 1.1 NoSQL数据库概述 NoSQL(NosQL = Not Only sQL ),意即"不仅仅是sQL",泛指非关系型的数据库.NoSQL不依赖业务逻辑 ...

  2. Atlassian发布Kubernetes节点自动化扩展工具Escalator

    \ 看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料! \ \\ Atlassian把他们的内部工具Escalator发布为开源项目.该工具针对Kuberne ...

  3. Spring5源码 - 13 Spring事件监听机制_@EventListener源码解析

    文章目录 Pre 概览 开天辟地的时候初始化的处理器 @EventListener EventListenerMethodProcessor afterSingletonsInstantiated 小 ...

  4. Spring5源码 - 12 Spring事件监听机制_异步事件监听应用及源码解析

    文章目录 Pre 实现原理 应用 配置类 Event事件 事件监听 EventListener 发布事件 publishEvent 源码解析 (反推) Spring默认的事件广播器 SimpleApp ...

  5. Spring5源码 - 11 Spring事件监听机制_源码篇

    文章目录 pre 事件监听机制的实现原理[观察者模式] 事件 ApplicationEvent 事件监听者 ApplicationEvent 事件发布者 ApplicationEventMultica ...

  6. 6000个边缘Kubernetes节点驱动城市80万次智能停车,如何成为可能?

      城市的街道因为汽车数量的增长越来越繁忙,对于驾车一族而言,在热门区域寻找停车场更是无比头痛的事情.然而与此同时,其实也许很多办公楼.住宅楼.酒店和公共车库中仍有许多付费停车的资源未被充分利用. P ...

  7. NETGEAR拒绝连接请求_破案:Kubernetes/Docker 上无法解释的连接超时

    编译:bot(才云) 技术校对:星空下的文仔(才云) 编者按:将应用迁移到 Kubernetes 时,有时候工程师们会发现一些令人费解的连接超时,无论怎么排查都找不到原因.在这篇文章中,软件架构师 M ...

  8. Android驱动学习-内部机制_回顾binder框架关键点

    内部机制_回顾binder框架关键点 server注册服务时, 对每个服务都提供不同的ptr/cookie, 在驱动程序里对每个服务都构造一个binder_node, 它也含有ptr/cookie c ...

  9. kubernetes节点NotReady

    kubernetes节点NotReady 集群搭建后, 安装网络插件后,各节点都是 NotReady 状态. 查看服务运行日志 查看服务状态 查看详细信息 集群搭建后, 安装网络插件后,各节点都是 N ...

最新文章

  1. import javax.servlet 出错(真的很管用)
  2. WP7 开发(二) 通过Geometries来绘制形状
  3. CentOS 6.5 x86_64升级内核到最新版2.6.32-696.1.1.el6.x86_64
  4. Canny边缘检测算法原理及其VC实现详解(二)
  5. 设计模式示例_状态设计模式示例
  6. mysql.ini环境配置_MySQL配置文件mysql.ini参数详解
  7. 【今日CV 计算机视觉论文速览 第112期】Mon, 6 May 2019
  8. 微信公众平台开发问答 【转发】
  9. 三星Galaxy S22系列国行版获3C认证:依旧祖传25W快充
  10. Java线程学习笔记(两) 线程异常处理
  11. [改善Java代码]避免对象的浅拷贝
  12. centos7网卡配置文件详解与固定服务器ip
  13. Android(安卓)手机变砖复活的三种恢复方法
  14. MYSQL中ALTER命令
  15. Python多进程反而变慢
  16. 支付宝接口调用出现INVALID_PARAMETER错误,订单信息无法识别
  17. EPICS -- sequencer第一部分--介绍
  18. 论珊瑚虫并不光彩的历史
  19. SPSS是什么?SPSS软件的功能有哪些?
  20. 5款超级无敌好用的电脑软件 建议收藏!

热门文章

  1. mysql是单独使用的_MYSQL简单使用
  2. workman实现websocket
  3. mysql 乱码问题详解
  4. 双约束重力模型python实现,以物流需求预测为例
  5. unity 打包安卓UI自适应
  6. Python入门文件处理
  7. python控制流教程_python从入门到入土教程(2)——控制流和函数
  8. 前端必备英语单词(学习参考)
  9. 政企HTTPS加密国产化替代的四要素
  10. NPOI 导出xlsx 出现的问题解决方案