aws eks 节点驱逐和OOMkill

news2024/10/7 12:28:31

资料

  • 解决 K8s 调度不均衡问题
  • kubernetes pod内容器状态OOMKilled和退出码137全流程解析

集群中pod触发oom的原因

默认pod能够使用节点的全部可用资源。节点的可分配资源如下

Allocatable = Node Capacity - (kube-reserved) - (system-reserved) - (eviction-threshold)

容量资源( Capacity )是指 kubelet 获取的计算节点当前的资源信息。

  • CPU 是从 /proc/cpuinfo 文件中获取的节点 CPU 核数;
  • memory 是从 /proc/memoryinfo 中获取的节点内存大小;
  • ephemeral-storage 是指节点根分区的大小

容器的qos介绍略过,需要在container上分别设置

spec.containers[].resources.limits.cpu
spec.containers[].resources.limits.memory
spec.containers[].resources.requests.cpu
spec.containers[].resources.requests.memory

pod调度时使用request(下限),设置cgroups限制时使用limits(上限),目的是提升整体资源利用效率

驱逐行为和oom kill的关系

  • Eviction 阈值达到后,节点进入 MemoryPressure 或者 DiskPressure 状态,避免新的pod调度。并且会按照Qos级别对pod进行驱逐具体驱逐优先级是:BestEffort -> Burstable -> Guaranteed。集群的默认阈值如下

    memory.available<100Mi
    nodefs.available<10%
    nodefs.inodesFree<5%
    imagefs.available<15%
    
  • 由于内存是不可压缩资源,由于内存使用量突增导致内存不足时,pod会因为oom被内核kill掉(此时节点的驱逐状态可能还没来得及触发)。

    kubelet 默认每 10 秒抓取一次 cAdvisor 的监控数据,所以有可能在 kubelet 驱逐 Pod 回收内存之前发生内存使用量激增的情况,这时就有可能触发内核 OOM killer。

    当内存资源不足时,kubelet 在驱逐 Pod 时只会考虑 requests 和 Pod 的内存使用量

    常见的服务oom分值如下。oom分值越高,被oom kill的优先级越高,-999 和-1000的进程不会被oom kill。

    -1000  => sshd
    -999   => Kubernetes管理进程
    -998   => Guaranteed Pod
    0      => 其他进程 0
    2~999  => Burstable Pod  
    1000   => BestEffort Pod  
    

oom kill的简单测试

为了查看节点的压力指标,部署metric-server

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

pod的使用量等于其所有业务容器的总和,不包括 pause 容器。执行kubectl top命令得到的结果并不等于pod的总和,也不等于在node上直接运行top命令获得的结果

使用 metrics-server 时,apiserver 通过 /apis/metrics.k8s.io/ 的地址访问 metric

kubectl top node
kubectl top pod pod-name
kubectl top pod pod-name --containers

任务使用内存超出限制,会导致objscore计算kill分数

指定qos之后pod获取资源的行为受到了限制

在这里插入图片描述

节点触发驱逐状态
在这里插入图片描述

pod长时间超出pod的资源limit就会触发oom killed,可见pod已经重启了10次
在这里插入图片描述

在实例上运行dmesg查看日志,看到系统对容器进行了oom kill,在/var/log/message中还能看到那个容器触发了oom kill。此处oom_score_adj打分为-997,尽管优先级很低,由于该进程使用的资源能持续超过cgroup的限制从而被oom kill

在这里插入图片描述

如果放开cpu的qos,则会最大程度上使用节点的资源
在这里插入图片描述

最终可能会导致节点失联,oom的原因需要具体分析

在这里插入图片描述

以上过程存在两个问题

  • kubelet和容器的OOMkilled有什么关系

  • 容器的OOMkilled状态最终是如何被apiserver获取?

kubelet和容器的OOMkilled的关系

Kubernetes Pod 驱逐详解

kubelet 默认每 10 秒抓取一次 cAdvisor 的监控数据,可能在 kubelet 驱逐 Pod 回收内存之前发生内存使用量激增的情况,这时就有可能触发内核 OOM killer。

容器的删除从kubelet交接到内核,但是kubelet会决定oom_score_adj的值,从而决定oom_score

容器使用的内存占系统内存的百分比 + oom_score_adj = oom_score

OOM killer 会杀掉 oom_score_adj 值最高的容器,oom_score_adj相同就干掉内存使用最多的容器(oom_score高)

kubect如何获取pod的oom状态

kubernetes pod内容器状态OOMKilled和退出码137全流程解析

  • cgroup中的进程运行过程中申请内存并触发缺页异常,如果无法通过在cgroup中回收足够内存就会选择进程kill
  • 触发oom时,内核向进程发送SIGKILL信号
  • 内核修改进程task_struct,程序对信号进行处理
  • containerd-shim监听cgroup内进程的oom事件,进程退出时,内核会向containerd-shim发送SIGCHILD信号,将容器id,进程id,退出码,退出时间等信息通过GRPC消息转发到containerd中
  • containerd处理进程和容器退出事件
  • kubelet定期对比pod状态的变化,获取容器的退出码/原因,将新的pod状态通过patch方法更新到apiserver

节点问题的监控和修复

pic_center

problem detect

npd(node-problem-detector)是kubernetes的插件,主要目的是检测节点上可能出现的故障,避免pod调度到故障节点上

  • 基础设施守护进程故障
  • 硬件故障:cpu,内存和磁盘损坏
  • 内核故障:内核死锁,文件系统损坏
  • 容器运行时故障:未响应的守护进程运行时

npd使用EventNodeCondition向apiserver汇报

  • NodeCondition:永久性的节点不可用

  • Event:对pod的临时故障影响有限

npd包括子进程(作为goroutine )监控特定类型的节点故障,已经支持的类型如下:

  • SystemLogMonitor
  • SystemStatsMonitor
  • CustomPluginMonitor
  • HealthChecker

默认的启动脚本如下

/bin/sh -c exec /node-problem-detector \
    --logtostderr \
    --config.system-log-monitor=/config/kernel-monitor.json,/config/docker-monitor.json  \
    --prometheus-address=0.0.0.0 \
    --prometheus-port=20257 \
    --k8s-exporter-heartbeat-period=5m0s   

部署方式如下

helm repo add deliveryhero https://charts.deliveryhero.io/
helm install --generate-name deliveryhero/node-problem-detector

向内核设备测试写入

sudo sh -c "echo 'kernel: BUG: unable to handle kernel NULL pointer dereference at TESTING' >> /dev/kmsg"

查看eks集群节点的event能够发现相关错误信息,及时追踪和排查

在这里插入图片描述

remedy system

npd仓库推荐了两个插件用来对故障集群进行补救

Draino

能够根据节点的标签和条件自动排空节点。需要和npd共同使用。当 Node Problem Detector检测到节点故障,draino发现故障后立即cordon节点并排空。之后通过ca替换节点

Descheduler

能够对不均衡的调度

kube-scheduler的调度是静态的,pod一旦完成调度旧不会重新触发调度,由于pod在运行过程中会不断消耗内存,集群中运行过程中可能会出现资源使用不均衡的问题。

descheduler能够对由于新加入节点,节点故障和污点标签重新调度的pod进行再平衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux基本指令(2)

Linux基本指令(2) &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客将展示25-30个LInux中常用的命令&#xff0c;…

计算机网络第9章 无线网络和移动网络

目录 9.1 无线局域网 WLAN 9.1.1 无线局域网的组成 1. 无线局域网 WLAN (Wireless Local Area Network) 2. IEEE 802.11 3. 移动自组网络 9.1.2 802.11 局域网的物理层 9.1.3 802.11 局域网的 MAC 层协议 1. CSMA/CA 协议 2. 时间间隔 DIFS 的重要性 3. MAC两个子层…

fpga实操训练(按键消抖)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前我们谈到按键输入&#xff0c;其中涉及的功能就是&#xff0c;当按键按下的时候&#xff0c;led灯亮起来。等到按键弹起来的时候&#xff0c;l…

NLP领域表达退化各向异性理解及对应策略总结

前言&#xff1a;今年8月份在与同学撰写deepfake相关论文的过程中偶然听导师提到各向同性与各向异性这两个词&#xff0c;当时以为这是cv领域的概念&#xff0c;回去一查发现是物理领域的&#xff0c;就没再深究。最近看到一篇使用对比学习解决开放式长文本生成中模型退化问题的…

在 Spring Boot 中使用 HikariCP 连接池

目前星标 12K&#xff0c;被使用次数更是达到了 43.1K。再来看看它的自我介绍。 牛逼的不能行啊&#xff0c;原来 Hikari 来源于日语&#xff0c;“光”的意思&#xff0c;这意味着快得像光速一样吗&#xff1f;讲真&#xff0c;看简介的感觉就好像在和我的女神“汤唯”握手一样…

基于SSM的企业管理系统

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

[ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

软件测试面试必看,资深测试工程师面试题集锦 全网首发

全网首发&#xff0c;最牛的全套软件测试 &#xff0c;自动化测试面试题&#xff0c;这些面试题都在文章末尾&#xff0c;有需要的可以自取 废话少说直接开始咱们今天的整体内容&#xff0c; 1.自我介绍&#xff1f; 我是谁、工作几年、你上家公司做什么、负责什么、你的优势…

史上最全事件相机DVS/Event-based Camera的介绍和分析综述文章

史上最全事件相机DVS/Event-based Camera的介绍和分析1. DVS 的一些介绍2. 基于事件的视觉传感器发展现状与趋势3. 事件相机的动态范围&#xff1a;信噪比动态范围DR结论4. 新型相机DVS/Event-based camera的发展及应用应用点传统相机的缺点事件相机的优点5. 事件相机在无人驾驶…

[技巧]还在使用RDP远程windows?OpenSSH远程win10操作系统!

文章目录前言一、Win10开启OpenSSH服务1.1 查看本机是否安装了openssh1.2 下载openssh1.3 查看ssh是否安装1.4 安装openssh服务端1.5 启动openssh服务1.6 查看openssh服务是否启动正常二、开始远程2.1 在目标机器上查看用户名2.2 使用ssh命令远程三、常见问题3.1 ssh命令登陆提…

C# 接口

一 接口 接口&#xff08;interface&#xff09;实际上是一个约定。 如&#xff1a;ICloneable,IComparable; 接口是抽象成员的集合&#xff1b; ICIonable含有方法clone(); IComparable含有方法compare(); 接口是一个引用类型&#xff0c;比抽象类更抽象。 帮助实现多重继承…

配置本地Git从Gitlab上拉取项目

配置本地Git从Gitlab上拉取项目 安装git&#xff1a; https://git-scm.com/downloads git官网下载安装包&#xff0c;安装时一路next即可 ①配置用户名&#xff0c;邮箱 创建一个文件夹&#xff0c;任意位置即可鼠标右键选择&#xff0c;git bash here配置提交人姓名、邮箱 g…

一起学习用Verilog在FPGA上实现CNN----(二)卷积层设计

1 打开Vivado工程 Vivado工程文件如图&#xff1a; 打开Vivado软件&#xff0c;打开工程&#xff0c;如图&#xff1a; 自动升级到当前版本&#xff0c;如图&#xff1a; 暂时选择现有开发板的型号&#xff0c;如图&#xff1a; 出现一条警告性信息&#xff0c;暂时先不管&…

2023年第五届人工智能与机器学习国际会议(FAIML 2023)

2023年第五届人工智能与机器学习国际会议(FAIML 2023) 重要信息 会议网址&#xff1a;www.faiml.org 会议时间&#xff1a;2023年4月14-16日 召开地点&#xff1a;中国北京 截稿时间&#xff1a;2023年3月15日 录用通知&#xff1a;投稿后2周内 收录检索&#xff1a;EI,S…

差分进化算法在图像处理中的应用研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 本文为Storn和Price制定的著名差分进化计算智能算法的实现。该算法使用Otsu准则作为适应度函数&#xff0c;可用于使用多个阈值…

为什么球的表面积不能用周长积分而体积可以用面积积分?

问题描述&#xff1a; 将面积从最底下一层层叠到最上面可以得到球体积的正确公式 但是将周长从最底下一层层叠到最上面会得到错误结果&#xff0c;错误结果的几何意义是什么&#xff1f;以及是在什么地方积错了&#xff1f; 解答一&#xff1a; 首先&#xff0c; ∫−RR2πR2…

计算机研究生就业方向之去央企(国企)信息化部门

我一直跟学生们说你考计算机的研究生之前一定要想好你想干什么&#xff0c;如果你只是转码&#xff0c;那么你不一定要考研&#xff0c;至少以下几个职位研究生是没有啥优势的&#xff1a; 1&#xff0c;软件测试工程师&#xff08;培训一下就行&#xff09; 2&#xff0c;前…

C语言:星期一问题

题目需求 整个20世纪&#xff08;1901年1月1日至2000年12月31日之间&#xff09;&#xff0c;一共有多少个星期一&#xff1f; (不要告诉我你不知道今天是星期几哈) 请用一段程序实现了这一功能。 算法思路 判断1901年1月1日到2000年12月31的每一天是星期几&#xff0c;如果是星…

前端开发:JS中关于正则表达式的使用汇总

前言 在前端开发过程中&#xff0c;关于正则表达式的使用也是必备技能&#xff0c;尤其是在实际业务需求的时候&#xff0c;需要处理一些不能按照正常语句操作的逻辑&#xff0c;如前端开发中的字符匹配、参数处理等都需要正则表达式来匹配截取处理。虽然正则表达式在程序开发中…

01-18-spark-入门简介-部署入门

01-spark-入门简介&#xff1a; Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 一次性数据计算&#xff1a;框架在处理数据的时候&#xff0c;从存储设备中读取数据&#xff0c;进行逻辑操作&#xff0c;然后将结果存储到介质中。 Hadoop 的 MR 框架和 S…