k8s QoS设计实现

2020-07-10  本文已影响0人  _1900

QoS介绍

QoS是 Quality of Service 的缩写,即服务质量。为了实现资源被有效调度和分配的同时提高资源利用率,kubernetes针对不同服务质量的预期,通过 QoS(Quality of Service)来对 pod 进行服务质量管理。对于一个 pod 来说,服务质量体现在两个具体的指标:CPU 和内存。当节点上内存资源紧张时,kubernetes 会根据预先设置的不同 QoS 类别进行相应处理。

QoS 等级划分

QoS 划分的主要应用场景,是当宿主机资源紧张的时候,kubelet 对 Pod 进行 Eviction(即资源回收)时需要用到的,

具体地说,当 Kubernetes 所管理的宿主机上不可压缩资源短缺时,就有可能触发 Eviction。比如,可用内存(memory.available)、可用的宿主机磁盘空间(nodefs.available),以及容器运行时镜像存储空间(imagefs.available)等等

对于 QoS 类为 Guaranteed 的 Pod:

对于 QoS 类为 BestEffort 的 Pod:

对于 QoS 类为Burstable 的 Pod:

QoS pods被kill掉场景与顺序

如何处理相同Qos等级的容器

k8s 为每个Pod 分配一个OOM分数值,用来计算kill的顺序,当需要释放内存的时候,分数最高的进程将被杀死。

OOM 分数由两个参数计算得出:进程已消耗内存占可用内存的百分比,与一个基础pod QoS 等级分数值相乘,得出结果最大值将被Kill

等级分数值:

对于Guaranteed级别的 Pod,OOM参数设置成了-998,对于Best-Effort级别的 Pod,OOM参数设置成了1000,对于Burstable级别的 Pod,OOM参数取值从2到999

对于 kuberntes 保留资源,比如kubelet,docker,OOM参数设置成了-999,表示不会被OOM kill掉。OOM参数设置的越大,计算出来的OOM分数越高,表明该pod优先级就越低,当出现资源竞争时会越早被kill掉,对于OOM参数是-999的表示kubernetes永远不会因为OOM将其kill掉。

内部实践

目前所有服务Pod 等级为 Burstable , 当出现资源不足的情况,被Kill调的 Pod 有可能是重要的服务,这是一种很危险的操作。

为了避免高优先级的服务被Kill 掉,针对这类服务的等级调整为Guaranteed。

上一篇 下一篇

猜你喜欢

热点阅读