调度分为几个部分:首先是过滤掉不满足条件的节点,这个过程称为 predicate ;然后对通过的节点按照优先级排序,这个是 priority ;最后从中选择优先级最高的节点。如果中间任何一步骤有错误,就直接返回错误
Predicate 有一系列的算法可以使用:
代码语言:javascript复制PodFitsResources:节点上剩余的资源是否大于pod请求的资源
PodFitsHost:如果pod指定了NodeName,检查节点名称是否和NodeName匹配
PodFitsHostPorts:节点上已经使用的port是否和pod申请的port冲突
PodSelectorMatches:过滤掉和pod指定的label不匹配的节点
NoDiskConflict:已经mount的volume和pod指定的volume不冲突,除非它们都是只读
如果在predicate过程中没有合适的节点,pod会一直在pending状态,不断重试调度,直到有节点满足条件。经过这个步骤,如果有多个节点满足条件,就继续priorities过程: 按照优先级大小对节点排序