kubernetes允许节点的pod对象过载使用资源,意味着节点无法同时满足绑定其上的所有pod以资源满载的方式运行。
内存紧缺情况下,按照什么次序终止pod对象成为问题。
kubernetes本身无法做出决策,要借助pod对象的服务质量和优先级完成判定。
根据pod对象的requests和limits属性,kubernetes将pod对象归类为BestEffort,Burstable,Guaranteed三个服务质量类别(Quality of Service,Qos)
内存资源紧缺时,besteffort类别容器将首先被终止,因为系统不提供任何级别的资源保证,好处是:它们能够尽可能多的占用资源。
若系统上不存在其他BestEffort类型的容器时,轮到Burstable类别的pod被终止。Guaranteed类别的容器拥有最高优先级,不会被杀死,除非其内存资源需求超限,或者OOM时没有其他更低优先级的Pod对象存在。
每个status为running的pod都有OOM评分,评分越高越先被杀死。OOM评分计算的两个维度:
同等类别的pod默认分值相同,各种类别pod对象的OOM调节(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