1、场景
K8S中大部分情况下都会对系统进行超卖。超卖就意味着在高峰时间可能会发生资源抢占,此时Qos等级就决定着哪个容器第一个被杀死,释放出的资源可以提供给高优先级的容器使用。
涉及基础理论:
- 一个pod可以包含多个容器,同一个pod中的容器一定会运行在同一个节点上
-
容器的本质就是一个进程,所以容器的优先级等于后续章节提到的进程优先级
-
CPU使用量超过limits限制不会杀死容器,但是内存使用率超过limits限制会尝试重启容器
2、Qos等级分类
K8S中pod的优先级从低到高一共分为3个等级
- besteffort
-
burstable
-
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优先级最低
- Pod B比Pod C先死亡的原因是,pod使用的内存占用已请求内存的90%
-
Pod D中内存使用率虽然比Pod B更高,但pod D的requests和limits相等,所以是最高的Qos优先级,不会优于Pod C被杀死
原文地址:原文连接点这里
文章评论