Skip to content

Instantly share code, notes, and snippets.

@chenchun
Last active January 12, 2021 03:23
Show Gist options
  • Save chenchun/abf46092123783af148f8d406f5b6a4e to your computer and use it in GitHub Desktop.
Save chenchun/abf46092123783af148f8d406f5b6a4e to your computer and use it in GitHub Desktop.
kubernetes scheduler #kubernetes #k8s #kube-scheduler #preemption

前提条件:

  1. 集群打开优先级功能;
  2. 在尝试调度一个pod发生FitError时,才尝试preemption,其他error不尝试preemption
  3. 如果pod有NominatedNodeName annotation标记,并且标记的node上的pods有处于graceful termination period时,不尝试preemption

preemption逻辑

  1. 选择适合于被抢占的节点,从调度失败的结果中判断失败原因是否有下面的原因,有其中一个的不适合作为抢占的节点(抢占了也满足不了predict条件) predicates.ErrNodeSelectorNotMatch, predicates.ErrPodNotMatchHostName, predicates.ErrTaintsTolerationsNotMatch, predicates.ErrNodeLabelPresenceViolated, predicates.ErrNodeNotReady, predicates.ErrNodeNetworkUnavailable, predicates.ErrNodeUnschedulable, predicates.ErrNodeUnknownCondition, predicates.ErrVolumeZoneConflict, predicates.ErrVolumeNodeConflict, predicates.ErrVolumeBindConflict:

  2. 给所有候选的节点并行的计算会被抢占的pod,逻辑如下:

  • 如果节点上所有比当前pod优先级低的都被删除后,仍然无法满足所有的predict,排除这个节点;
  • 将节点上所有比当前pod优先级低的pod排序,并放入两个数组,一个数组是删除pod后会违反PodDisruptionBudget,一个数组是不会违反的。然后先尝试将会违反PodDisruptionBudget的pod挨个加回来,判断是否违反predict,如果不违反,则可以加回来。如果会违反PodDisruptionBudget的pod数组都加回来了,再用同样的办法尝试加入不会违反PodDisruptionBudget的pod
  1. 按下面的规则优先选择一个节点作为被抢占的节点,如果某个规则只有一个node符合,立即返回那个node
  • 需要删除最少的违反PodDisruptionBudget pods的node
  • 需要删除最低的优先级的pod的node
  • 需要删除pod的优先级之和最小的node
  • 需要删除最少的pod的node
  1. 将选择好的node和这个node要删除的pods发送给scheduler extender,extender返回是否能抢占,如果不行,则返回删除这个node,返回第3部再选一个node

  2. 给pod打上NominatedNodeName annotation标记,删除选择出的pods,并且将调度队列中带有NominatedNodeName=当前节点,且优先级低于这个pod的pod的标记删除,让调度器重新给这些pod调度。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment