QoS是Quality of Service的缩写,即服务质量。为了在资源被有效调度和分配的同时,提高资源利用率,Kubernetes针对不同服务质量的预期,通过QoS类来决定Pod的调度和驱逐策略。对于一个pod来说,服务质量体现在两个具体的指标:CPU和内存。当节点上资源紧张时,Kubernetes会根据预先设置的不同QoS类进行相应处理。
QoS主要分为Guaranteed、Burstable和BestEffort三类,优先级从高到低。
Guaranteed(有保证的):Pod中的每个容器都设置了CPU和内存的requests(请求)和limits(限制),并且两者要相等。
如果为容器指定了内存limits,但没有指定内存requests,Kubernetes会自动为它指定与内存limits匹配的内存requests。同样,如果为容器指定了CPU limits,但没有指定CPU requests,Kubernetes会自动为它指定与CPU limits匹配的CPU requests。 |
Burstable(不稳定的):Pod不符合Guaranteed QoS类的标准,且Pod中至少一个容器具有内存或CPU requests。
BestEffort(尽最大努力):Pod中所有容器均没有设置内存和CPU limits和requests。
当节点资源紧张时,QoS类优先级高的Pod可获得更高的性能保证。例如,当内存资源紧张时,优先级越低的Pod会越先被kill掉,具体场景举例:
BestEffort Pods:全部内存用完时,该类型Pods会最先被kill掉。
Burstable Pods:全部内存用完,且没有BestEffort类型的Pods可以被kill时,该类型的Pods会被kill掉。
Guaranteed Pods:全部内存用完,且没有Burstable与BestEffort类型的Pods可以被kill时,该类型的Pods会被kill掉。
如果资源充足,可将Pods的QoS类型均设置为Guaranteed,用计算资源换业务性能和稳定性,减少排查问题时间和成本。
如果想更好的提高资源利用率,推荐如下配置方式:
关键服务Pod的所有容器的requests和limit值相等,以确保Pod的QoS类为Guaranteed级别。