Kubernetes中Pod的驱逐和调度顺序详解
Kubernetes中Pod的驱逐和调度顺序详解
在Kubernetes集群中,资源管理和调度是确保系统稳定运行的关键。本文将深入探讨Pod的驱逐和调度机制,帮助读者理解如何通过设置资源请求、限制以及优先级来优化集群资源分配。
在Kubernetes中,当资源不足需要驱逐Pod时,系统会根据Pod的优先级(由PriorityClass的value决定)和Pod的Quality of Service (QoS)类别等进行决策。而调度优先级主要由Priority值确定。可以先熟悉下以下概念,然后会给出结论。
资源请求和限制
Requests(请求):Requests是指容器在运行时所需的资源的最小数量。它们用于告诉Kubernetes调度器在选择节点时要为Pod预留多少资源。如果没有足够的请求资源可用,Pod可能无法被调度到节点上。
Limits(限制):Limits是指容器在运行时所允许使用的资源的最大数量。它们用于限制容器的资源使用,以防止容器占用过多的资源导致其他容器或节点受到影响。如果容器尝试使用超过其限制的资源量,Kubernetes将会限制其资源使用,并可能触发容器的重新启动。
QoS类别
BestEffort:没有设置resource requests和limits的Pod。
Burstable:设置了requests或者limits,但不完全相同。
Guaranteed:requests和limits都设置了,并且两者值相等。
就比如说下图容器的QoS类别为Guaranteed。
驱逐顺序:BestEffort(lowest) -> Burstable -> Guaranteed(highest)。不影响调度的优先级。
PriorityClass和Priority
PriorityClass(优先级类):PriorityClass是一种用于调度和优先级管理的对象。它允许您为Pod分配优先级。PriorityClass定义了一个优先级类别,其中包含一个整数值value表示优先级的相对值。较高的value值表示较高的优先级。通过将Pod与特定的PriorityClass关联,可以影响Pod的调度和驱逐顺序。
Priority(优先级):Priority是一个整数值,直接应用于Pod对象。它表示Pod的绝对优先级。较高的Priority值表示较高的优先级。同样可以影响Pod的调度和驱逐顺序。
查看PriorityClass
查看系统组件controller-manager使用的PriorityClass
当集群中没有默认的PriorityClass,也没有手动指定Priority,那优先级的值就为0。优先级的值越小,驱逐顺序越靠前,调度顺序越靠后。
还有一种情况是:尽管PriorityClass的value值大,但是BestEffort类型的qos class会比Burstable或Guaranteed类别更容易被驱逐。当然还会有其他因素也会影响pod的驱逐顺序,但是影响力不如上面两种大,例如:Pod资源使用量越接近limits,和pod运行时长越短等,那么这些Pod会被优先考虑驱逐。
当集群内有比较重要的服务时,可以把Qos Class设置为Guaranteed,也就是都指定了requests和limits并且二者值相等,会有长时间运行稳定性的优势。且Priority的值尽可能设置大些,会有优先占用集群资源资源的优势。