运维知识库-BigHead
  • 首页
  • 电子书-知识库老版本
  • VIP视频免费看
  • 联系作者
  • 随笔
https://github.com/yongxiaodong
  1. 首页
  2. K8S
  3. 正文

K8S-内存不足时哪个进程会被Kill?

2022年07月10日 558点热度 0人点赞 0条评论

1、场景

K8S中大部分情况下都会对系统进行超卖。超卖就意味着在高峰时间可能会发生资源抢占,此时Qos等级就决定着哪个容器第一个被杀死,释放出的资源可以提供给高优先级的容器使用。

涉及基础理论:

  • 一个pod可以包含多个容器,同一个pod中的容器一定会运行在同一个节点上

  • 容器的本质就是一个进程,所以容器的优先级等于后续章节提到的进程优先级

  • CPU使用量超过limits限制不会杀死容器,但是内存使用率超过limits限制会尝试重启容器


2、Qos等级分类

K8S中pod的优先级从低到高一共分为3个等级

  1. besteffort

  2. burstable

  3. guaranteed

besteffort等级的pod会优先杀死,其次是burstable

3、怎么定义Pod的Qos等级

其实pod的Qos等级就来源于YAML申明中的requests和limits配置,你要做的就是识别你的容器属于什么级别的Qos

bestoffort等级

  • 没有设置requests和limits的pod

这是最低优先级的pod,在极端情况下,该类型的pod可能分不到任何CPU时间,在其他等级的pod需要内存时,此类型的pod会被第一时间杀死释放资源。但是当有充足的可用内存时,此类型的pod可以占用任意内存

burstable等级

  • 至少有一个容器定义了requests资源
  • requests资源小于limits资源

guaranteed等级

  • 所有容器配置相等的requests和limits(假设requests没有被明确指定,默认与limits一致)

guaranteed的优先级最高,它只会在系统级别的进程需要内存时才会被杀死

案例总结:

实例-1

假设一个pod里包含两个容器,第一个容器没有设置reqeusts和limits(它属于最低优先级的besteffort策略),第二个容器设置了reqeusts资源而没有设置limits(它属于第二优先级的brustable策略)。众所周知同一个Pod中的所有容器一定会分布在同一个宿主节点上,当宿主机节点的内存已耗尽时,还有其它进程在尝试申请内存,系统就必须杀死一部分进程,此时besteffort等级运行的进程就会被优先杀死

实例-2

假设其中的两个容器评分得出了相同的Qos等级,那会发生什么?

系统会为每一个进程进行OOM评分,系统会将得分最高的进程优先杀死,OOM分数由:进程已消耗内存占可用内存的百分比,与一个基于qos等级的容器内存申请量固定的OOM分数调节因子,对比两个属于相同qos等级的单容器pod,系统会杀掉内存实际使用量占内存申请量比例更高的pod。

图解:
1. 没有配置requests和limits的pod a毫无疑问最先被杀死,因为它的qps优先级最低

  1. Pod B比Pod C先死亡的原因是,pod使用的内存占用已请求内存的90%

  2. Pod D中内存使用率虽然比Pod B更高,但pod D的requests和limits相等,所以是最高的Qos优先级,不会优于Pod C被杀死

原文地址:原文连接点这里

标签: 暂无
最后更新:2022年07月10日

BigHead

保持饥渴的专注,追求最佳的品质

点赞
< 上一篇

文章评论

取消回复
文章归档
  • 2022年7月
  • 2021年6月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2020年8月
  • 2020年7月
分类目录
  • ELK
  • Jenkins
  • K8S
  • Nginx
  • Openvpn
  • Python
  • 小技能
  • 未分类

COPYRIGHT © 2020 运维知识库-BigHead. ALL RIGHTS RESERVED.

蜀ICP备16012425号