Scheduler调度器

Scheduler调度器用来决定Pod需要被部署在集群中的哪一个工作节点上。

之前说过,用来部署Pod的是工作节点上的kubelet组件,但是在Kubernetes中,Scheduler并不会直接通知工作节点上的kubelet部署容器,而是通过API服务器将Pod定义的spec.nodeName字段填充为工作节点名。

然后由API服务器通知监听的kubelet,由被选中的Node上的kubelet部署Pod。

默认调度算法

Kubernetes提供了默认调度算法,其过程可以分为两步:

  1. 从所有Node中,过滤出可用的Node;

  2. 对可用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

选择最优Node的算法更为复杂,这里就不作解释了。

自定义调度器

Kubernetes的调度器是以插件的形式存在的,可以设计自己的调度器,并加载至Kubernetes中。

对于每一个Pod,若要使用其他调度器,可以在pod.spec.schedulerName中指定,若没有指定的,则使用默认调度器,即pod.spec.schedulerName=default-scheduler

Last updated

Was this helpful?