目录
前言
它能解决什么问题?
scheduler是kubernetes的调度器,主要的任务是把定义的pod分配到集群的节点上,听起来非常简单,但有很多要考虑的问题:
公平:如何保证每个节点都能被分配资源
资源高效利用:集群所有资源最大化被使用
效率:允许用户根据自己的需求控制调度的逻辑
灵活:允许用户根据自己的需求控制调度的逻辑
如何实现调度过程?
调度分为几个部分:
首先过滤掉不满足条件的节点,这个过程为predicate;
然后对通过的节点按照优先级排序,这个过程为priority;
最后从中选择优先级最高的节点,如果中间步骤有错误,直接报错。
Predicate的算法:
PodFitsResources: 节点上剩余的资源是否大于pod请求的资源
PodFitsHost: 如果pod指定了nodename,检查节点名称是否和nodename匹配
PodFitsHostPorts: 节点上已经使用的port是否和pod申请的port冲突
PodSelectorMatches: 过滤掉和pod指定的label不匹配的节点
NoDiskConflict:已经mount的volume和pod指定的volume不冲突,除非都是只读
如果predicate过程中没有合适的节点,pod会一直在pending状态,不断重试调度,直到有节点满足条件。经过这个步骤,如果有多个节点满足条件,就据需priorities过程:按照优先级大小对节点排序。
优先级由一系列键值对组成,键是该优先级项的名称,值是权重,优