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)等等
- Guaranteed(有保证的)
- Burstable (不稳定的)
- Best-Effort (尽最大努力)
对于 QoS 类为 Guaranteed 的 Pod:
- Pod 中的每个容器必须指定memory requests和memory limit ,CPU requests和 CPU limit ,并且requests 和 limit 要相等。
对于 QoS 类为 BestEffort 的 Pod:
- Pod 中的容器必须没有设置内存和 CPU 限制或请求
对于 QoS 类为Burstable 的 Pod:
- Pod 中的一个容器设置了 limit 并且 和 requests 不想等
QoS pods被kill掉场景与顺序
- Best-Effort pods:系统用完了全部内存时,该类型 pods 会最先被kill掉。
- Burstable pods:系统用完了全部内存,且没有 Best-Effort 类型的容器可以被 kill 时,该类型的 pods 会被 kill 掉。
- Guaranteed pods:系统用完了全部内存,且没有 Burstable 与 Best-Effort 类型的容器可以被 kill 时,该类型的 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。