pod服务质量类别

读书笔记

kubernetes允许节点的pod对象过载使用资源,意味着节点无法同时满足绑定其上的所有pod以资源满载的方式运行。
内存紧缺情况下,按照什么次序终止pod对象成为问题。

kubernetes本身无法做出决策,要借助pod对象的服务质量和优先级完成判定。

根据pod对象的requests和limits属性,kubernetes将pod对象归类为BestEffort,Burstable,Guaranteed三个服务质量类别(Quality of Service,Qos)

  • Guaranteed: Pod对象为其每个容器都设置CPU资源需求request和资源限制limit,且二者值相同;同时为每个容器都设置了内存资源需求和资源限制,且二者具有相同值。这类pod对象具有最高级别服务质量
  • Burstable:至少有一个容器设置了CPU或内存资源的reqeusts属性,不满足Guaranteed类别的设定要求,这类pod对象具有中等级别服务质量
  • BestEffort:不为任何一个容器设置requests或limits属性,这类pod对象克获得的服务质量为最低级别。

内存资源紧缺时,besteffort类别容器将首先被终止,因为系统不提供任何级别的资源保证,好处是:它们能够尽可能多的占用资源。

若系统上不存在其他BestEffort类型的容器时,轮到Burstable类别的pod被终止。Guaranteed类别的容器拥有最高优先级,不会被杀死,除非其内存资源需求超限,或者OOM时没有其他更低优先级的Pod对象存在。

每个status为running的pod都有OOM评分,评分越高越先被杀死。OOM评分计算的两个维度:

  1. 由服务质量类别继承而来的默认分值
  2. 容器的可用内存资源比例

同等类别的pod默认分值相同,各种类别pod对象的OOM调节(Adjust)分值定义如下

  • Guaranteed类别pod资源Adjust分值为-998
  • BestEffort类别默认分值为1000
  • Buratable类别pod的Adjust分值由算法计算得出

同级别优先级的pod资源在OOM时,与自身的request属性相比,内存占用比例最大的pod对象会先被杀死。

ex:两个pod的优先级级别相同, pod A 当前内存占用比例 与requests值相比为95%,pod B 内存占用比例为80%,pod A先于pod B被kill。

参考:

Kubernetes进阶实战第二版 马永亮
https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/quality-service-pod/
https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/qos/policy.go

你可能感兴趣的:(Cloud,Native,k8s,kubernetes)