Kubernetes-POD的QoS

news/2024/11/16 16:33:29/文章来源:https://www.cnblogs.com/Unstoppable9527/p/18351519

目录
  • 背景
    • 问题分析
    • 进一步排查
    • 问题原因
  • Pod的QoS服务质量等级
  • 结论

背景

今天开发团队反馈,测试环境中部分业务功能无法正常使用。经过初步排查,发现某个业务Pod在一天内重启了10次,因此需要进一步调查原因。

问题分析

首先,我查看了Pod的日志,发现JVM并未抛出任何错误,服务却直接重启了。这表明进程是被强制终止的,初步判断可能是Pod达到内存上限后被Kubernetes触发了OOM(Out Of Memory)杀死进程的机制。
接下来,我检查了Pod的事件信息,发现以下关键点:

  • Last State: Terminated
  • Exit Code: 137
Containers:container-prod--:Container ID:   --Image:          --Image ID:       docker-pullable://--Port:           8080/TCPHost Port:      0/TCPState:          RunningStarted:      Thu, 08 Aug 2024 11:40:01 +0800Last State:     TerminatedReason:       ErrorExit Code:    137Started:      Thu, 08 Aug 2024 11:27:38 +0800Finished:     Thu, 08 Aug 2024 11:39:58 +0800Ready:          TrueRestart Count:  8Limits:cpu:     8memory:  7GiRequests:cpu:        100mmemory:     512Mi

这个错误码表示Pod的进程被SIGKILL信号强制终止。通常情况下,这是因为Pod达到了内存上限而被Kubernetes杀死。但是,当我查看Pod的内存监控时,发现Pod被杀前的内存使用量仅为3G左右,远未达到设置的7G上限。此时,问题变得更加复杂。

进一步排查

为了找出原因,我查询了Pod所在的节点,并进入该节点查看其内存使用率。结果发现,宿主机的内存使用率已经达到了98%。

问题原因

这就引出了关键问题:为什么Pod的内存未达到上限,却依然被Kubernetes杀死?
经过分析,得出了以下几点结论:

  1. 内存上限未达,Exit Code 137:
    • 如果Pod因内存上限被杀,虽然Exit Code依然是137,但Reason会显示为OOMKilled,而不是Error
  2. 宿主机内存耗尽,触发Kubernetes保护机制:
    • 宿主机内存耗尽时,Kubernetes会启动保护机制,开始驱逐(evict)一些Pod来释放资源。
  3. QoS机制的影响:
    • 为什么在整个集群中,只有这个Pod反复被驱逐,而其他服务未受影响?原因在于Kubernetes的QoS(Quality of Service)机制。当宿主机资源耗尽时,Kubernetes会按照QoS的优先级,选择驱逐低优先级的Pod来释放资源。

最终,定位到的原因是这个Pod的QoS优先级较低,因此在宿主机资源紧张时,成为了驱逐的首选。
那么问题来了,什么是Pod的QoS?

Pod的QoS服务质量等级

QoS,指的是Quality of Service,也就是k8s用来标记各个pod对于资源使用情况的质量,QoS会直接影响当节点资源耗尽的时候k8s对pod进行evict的决策
image.png
QoS(Quality of Service),可译为 "服务质量等级",或者译作 "服务质量保证",是作用在 Pod 上的一个配置,当 Kubernetes 创建一个 Pod 时,它就会给这个 Pod 分配一个 QoS 等级。
k8s会以pod的描述文件里的资源限制,对pod进行分级:
Guaranteed (该策略下,设置的requests 等于 limits)

  • pod.spec.containers[].resources中会存在cpu或memory的request和limit。顾名思义是该容器对资源的最低要求和最高使用量限制。如果我们配置了limit,没有配置request,默认会以limit的值来定义request。

BestEffort(该策略下,没有设置requests 、 limits)

  • 当pod的描述文档中没有resource.limit、resource.request相关的配置时,意味着这个容器想跑多少资源就跑多少资源,其资源使用上限实际上即所在node的capacity。

Burstable(该策略下,设置的requests 小于 limits)

  • 当resource.limit和resource.request以上述两种方式以外的形式配置的时候,就会采用本模式。 QoS目前只用cpu和memory来描述,其中cpu可压缩资源,当一个容器的cpu使用率超过limit时会被进行流控,而当内存超过limit时则会被oom_kill。这里kubelet是通过自己计算容器的oom_score,确认相应的linux进程的oom_adj,oom_adj最高的进程最先被oom_kill。 Guaranteed模式的容器oom_score最小:-998,对应的oom_adj为0或1,BestEffort模式则是1000,Burstable模式的oom_score随着其内存使用状况浮动,但会处在2-1000之间。

当节点资源耗尽的时候,k8s会按照BestEffort->Burstable(该策略的pods如有多个,也是按照内存使用率来由高到低地终止)->Guaranteed这样的优先级去选择杀死pod去释放资源。

结论

通过这次排查,我们确认了Pod被频繁重启的原因是宿主机内存不足,而非Pod本身的问题。要解决这个问题,可以考虑以下优化措施:

  • 调整Pod的资源请求和限制,以提高其QoS优先级。
  • 监控和优化集群资源的分配,防止节点内存耗尽的情况发生。
  • 在必要时,增加集群的资源,以应对更高的负载需求。

通过这些措施,可以减少类似问题的发生,确保服务的稳定运行。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.8.9 鲜花

几张图?推歌:早安大森林 ![](https://baike.baidu.com/pic/%E6%97%A9%E5%AE%89%E5%A4%A7%E6%A3%AE%E6%9E%97/64160919/1/b17eca8065380cd791236bebf51cba345982b2b72b26?fr=lemma&fromModule=lemma_content-image#aid=1&pic=b17eca8065380cd791236bebf51cba345982b2…

赋值运算符和+号的用法(两个练习)

string strName = "kakaxi";string strVillage = "huoyingcun";int iAge = 20;string strEmail = "1287195315@qq.com";decimal deSalary = 2000m;Console.WriteLine("大家好,我叫{0},我今年{1}岁了, 我住在{2},我的邮箱是{3}, 我的工资有足…

中国四大软件外包公司

今天我们来聊聊国内的四大软件外包公司。这些公司不仅在国内市场中占据重要地位,还对全球软件外包行业产生了影响。部分数据来源网络排名,按照职位量、增长速度排名,排名仅供参考,去某家公司一定要多方位参考,比如企查查、脉脉等。要说软件外包这块大蛋糕,谁不想来一口呢…

六、决策树

决策1:如何选择在每个节点上分割什么特征?最大限度地提高纯度(或最小限度地减少不纯)。决策2:什么时候停止拆分?当一个节点是一个单一类时 当拆分一个节点会导致树超过最大的深度 当纯度分数的改进低于一个阈值(获得的信息增益很小小于阈值) 当一个节点中的例子数量低于…

性能测试面试题大曝光,让你如何迅速拿下 offer!

性能测试面试题精选1、 以前做过性能测试么?请结合例子具体说明性能测试的流程 面试考察点:性能测试的流程首选做性能测试的需求分析,明确性能测试的目标、范围、场景和性能指标(如响应时间、吞吐量、并发用户数等)。测试性能测试环境搭建:搭建与生产环境尽可能一致的测试…

[Java并发]ThreadLocal补充

ThreadLocal缺点及解决方案 每个Thread上都有一个threadLocals属性,它是一个ThreadLocalMap,里面存放着一个Entry数组,key是ThreadLocal类型的弱引用,value是对用的值。所有的操作都是基于这个ThreadLocalMap操作的。 但是它有一个局限性,就是不能在父子线程之间传递。 即…

NuminaMath 是如何荣膺首届 AIMO 进步奖的?

今年,Numina 和 Hugging Face 合作角逐 AI 数学奥林匹克 (AI Math Olympiad,AIMO) 的首届进步奖。此次比赛旨在对开放 LLM 进行微调,以使其能解决高中难度的国际数学奥林匹克训练题。我们很高兴向大家报告: 我们的模型 - NuminaMath 7B TIR - 在比赛中脱颖而出,成功解决了私…

【题解】ABC365(A~E)

前四题30min切,然后T5死磕70min+几发小唐错,距离比赛结束还有16s交最后一发,AC了。 目录A. Leap Year题目描述思路代码B. Second Best题目描述思路代码C. Transportation Expenses题目描述思路代码D. AtCoder Janken 3题目描述思路代码E. Xor Sigma Problem题目描述思路代码…

洛谷 P3870 开关之线段树板子

洛谷P3870题解传送锚点摸鱼环节 [TJOI2009] 开关 题目描述 现有 \(n\) 盏灯排成一排,从左到右依次编号为:\(1\),\(2\),……,\(n\)。然后依次执行 \(m\) 项操作。 操作分为两种:指定一个区间 \([a,b]\),然后改变编号在这个区间内的灯的状态(把开着的灯关上,关着的灯打开…

OI学习笔记(C++)

一些蒟蒻整理的OI笔记笔记完整版链接(洛谷)——暂无,正在维护 笔记完整版链接(博客) 参照 oi.wiki 整理的一些笔记: 学习笔记+模板(Adorable_hly) (自己结合网络和做题经验总结的,dalao勿喷) 第一大板块:DP 动态规划适用场景: 1. 最优化原理:若该问题所包含的子问…

静电场 恒定电流场 知识梳理

最近琢磨了一下Markdown插入LaTeX数学公式,感觉效果确实很不错🧐刚好最近比较闲,正想把新概念物理电磁学仔细看一遍,那就拿它来练手好了。下面主要把自己不太熟悉的知识详细解释了一下,比较简单的就一笔带过了。前言 最近琢磨了一下Markdown插入LaTeX数学公式,感觉效果确…