当集群出现资源压力时,调度器会移除优先级低的pod来为优先级高的pod腾出资源,如果用户错误地给分配给一些pod过高的优先权,这些无意分配的高优先权会导致集群抢占.像上面提到的,pod的优先权通过设置podSpec字段的priorityClassName来实现的,优先级的整数字段然被解析后传入到podSpec字段的priority字段里
为了解决这个问题,priorityClassName字段必须改变到更小的优先级或者留空,priorityClassName字段留空会被解析为0
当一个pod被抢占,则它会产生一条event记录来记录这个事件.仅当集群没有足够的资源时抢占才会发生.这种情况仅发生在(挂起)的pod的优先级高于受害pod.如果没有挂起的pod,则抢占事件一定不能发生.如果没有挂起pod,或者挂起pod的优先级等于或小于受害pod时发生抢占事件,则是系统bug,请提交一个issue给我们.
pod被抢占,但是抢占的pod并没有被调度当pod被抢占,他们将接收到一个优雅停止的时间段,默认是30秒,但是也可以是任意在podSpec里指定的值.如果受害pod没有在指定的时段里停止,他们会被强行终止.当所有受害者都被移除,优先pod可以被调度.
当优先pod等待受害者被移除时,一个适合调度到这个节点上的更高优先级的pod被创建.这时候调度器会优先调度这个更高优先级的pod
高优先级的pod比优先级更低的pod被抢占调度器会尽力寻找适合的节点来调度挂起的pod,如果找不一节点来调度,调度器会从一个包含低优先级的节点上移除pod来为挂起的pod腾出空间.如果有低优先级pod的节点不适合被调度,调度器可能会选择一个更高优先级的节点来抢占(这里说的更高是相对前面找到的低优先级的pod而言的,而不是对优先pod而言的).被抢占的pod仍然必须要比优先pod(指挂起的需要调度的pod)优先级别低
当有多个节点可以被抢占时,调度器会尝试选择有最低优先级pod的节点来调度.但是如果pod有PodDisruptionBudget并且抢占可能会违反PodDisruptionBudget时,调度器可能会选择一个更高优先级的pod来抢占.
当有多个节点可以被抢占并且没有出现以上情形,则调度器会选择优先级最低的pod来抢占,如果不是这样的,则意味着调度器本身存在bug.
pod优先级和Qos交互pod优先级和QoS是两个正交的功能,几乎没有交叉.调度器的抢占逻辑当选择抢占对象时不会考虑QoS.抢占会考虑pod的优先级并选择出一系列低优先级抢占目标.只有当即便移除低优先级pod也不足以运行挂起的pod或者低优先级的pod被PodDisruptionBudget保护时,调度器才会选择更高优先级的pod作为抢占对象.
仅有Kubelet的 out-of-resource eviction组件才会同时考虑pod优先级和QoS,kubelet首先会根据使用的资源是否超过请求的值来对要驱离的pod进行排序,然后根据优先级.Kubelet out-of-resource eviction 不会驱离使用资源低于请求资源的pod,如果一个低优先级的pod使用的资源没有超过它请求的,则它不会被驱离.其它的使用资源超过其申请资源的更高优先级的pod可能会被驱离.