Scheduler调度器
Last updated
Was this helpful?
Last updated
Was this helpful?
Scheduler调度器用来决定Pod需要被部署在集群中的哪一个工作节点上。
之前说过,用来部署Pod的是工作节点上的kubelet
组件,但是在Kubernetes中,Scheduler并不会直接通知工作节点上的kubelet部署容器,而是通过API服务器将Pod定义的spec.nodeName
字段填充为工作节点名。
然后由API服务器通知监听的kubelet,由被选中的Node上的kubelet部署Pod。
Kubernetes提供了默认调度算法,其过程可以分为两步:
从所有Node中,过滤出可用的Node;
对可用Node按优先级排序,找出最优Node。若有多个最高优先级的Node,则循环分配;
Scheduler调度器有一组内置的预测函数(过滤器)用于判断一个Node是否可用:
是否能满足Pod对硬件资源的请求;
Node是否已经耗尽资源(是否报告过内存/硬盘压力参数);
Pod是否要求被调度到指定节点(通过名字),是否是当前Node;
Node是否有和Pod定义中的spec.nodeSelector
中一致的标签(如果定义了的话);
如果Pod要求绑定指定的Node的端口,这个Node上的这个端口是否已经被占用;
如果Pod要求有特定类型的卷,该Node是否能为此Pod加载该卷,或者说改Node上是否已经有Pod在使用该卷了;
Pod是否能容忍Node的污点;
Pod是否定义了Node、Pod的亲缘性以及非亲缘性规则?如果是,那么调度该Node给该Pod是否会违反规则;
只有通过了所有的预测函数,一个Node才可以成为可用Node之一。
在经过该步后,会得到一组可用Node的集合,接着进行下一步。
选择最优Node的算法更为复杂,这里就不作解释了。
Kubernetes的调度器是以插件的形式存在的,可以设计自己的调度器,并加载至Kubernetes中。
对于每一个Pod,若要使用其他调度器,可以在pod.spec.schedulerName
中指定,若没有指定的,则使用默认调度器,即pod.spec.schedulerName=default-scheduler
。