https://kubernetes.io/zh/docs/concepts/workloads/pods/pod-topology-spread-constraints/
https://kubernetes.io/blog/2020/05/introducing-podtopologyspread/
前提条件:
preemption逻辑
选择适合于被抢占的节点,从调度失败的结果中判断失败原因是否有下面的原因,有其中一个的不适合作为抢占的节点(抢占了也满足不了predict条件) predicates.ErrNodeSelectorNotMatch, predicates.ErrPodNotMatchHostName, predicates.ErrTaintsTolerationsNotMatch, predicates.ErrNodeLabelPresenceViolated, predicates.ErrNodeNotReady, predicates.ErrNodeNetworkUnavailable, predicates.ErrNodeUnschedulable, predicates.ErrNodeUnknownCondition, predicates.ErrVolumeZoneConflict, predicates.ErrVolumeNodeConflict, predicates.ErrVolumeBindConflict:
给所有候选的节点并行的计算会被抢占的pod,逻辑如下:
将选择好的node和这个node要删除的pods发送给scheduler extender,extender返回是否能抢占,如果不行,则返回删除这个node,返回第3部再选一个node
给pod打上NominatedNodeName annotation标记,删除选择出的pods,并且将调度队列中带有NominatedNodeName=当前节点,且优先级低于这个pod的pod的标记删除,让调度器重新给这些pod调度。