Kubernetes的scheduler是一个独立的组件,它负责监视集群中新建的未调度的Pod,根据预定义的调度策略和集群资源的可用性,选择最佳的节点进行调度。
Scheduler不会立即将Pod调度到一个节点上,而是会将Pod调度到一个未绑定(unbound)状态(如果一个Pod是unbound状态,那么它的状态将被列为"Pending")。这样,kubelet就可以在后续的时间里为该Pod绑定一个节点。
下面是Kubernetes Scheduler的工作流程:
- 监听API Server:Kubernetes Scheduler监听API Server的调度事件,包括新建的未调度的Pod以及已调度但未运行的Pod。
- 获取调度信息:Scheduler通过API Server获取未调度的Pod的调度信息,包括Pod的资源需求和节点亲和性/反亲和性约束等信息。
- 选择节点:Scheduler使用调度算法根据节点资源的可用性和约束条件,选择最佳的节点进行调度。调度算法通常考虑节点资源的负载情况、节点和Pod的亲和性/反亲和性约束等因素。具体如下:
Scheduler的工作可以分为三个阶段:预选(preemption)、优选(prioritization)和选择(selection)。
- 预选阶段
在预选阶段,Scheduler会对当前集群中所有的节点进行评分,计算每个节点可以分配给待调度的Pod的资源是否足够。如果某个节点的资源不足以满足Pod的需求,那么Scheduler会尝试从该节点上迁移一些低优先级的Pod,以便为高优先级的Pod腾出足够的资源。
- 优选阶段
在预选阶段完成之后,Scheduler会对所有可用的节点进行优选,选出最适合待调度的Pod的节点。在这个阶段,Scheduler会为每个节点计算一个优先级值,优先级值越高的节点越有可能被选中。优选的算法可以由用户自定义,Kubernetes提供了一些默认的算法。
- 选择阶段
在优选阶段完成之后,Scheduler会将Pod绑定到被选中的节点上,完成Pod的调度工作。如果调度失败,Scheduler会继续尝试调度,直到成功为止。
总体来说,Scheduler的工作流程可以用以下几个步骤概括:
- 获取所有待调度的Pod
- 针对每个Pod进行预选操作,以确定是否需要迁移其他Pod来释放资源
- 针对每个Pod进行优选操作,以确定最适合的节点
- 将Pod绑定到被选中的节点上
4.更新Pod状态:Scheduler将调度好的Pod的信息更新到API Server中,同时将Pod的调度信息发送到kubelet,让kubelet启动Pod所在的容器。
Kubernetes的Scheduler是一个高度可扩展的系统,用户可以自定义调度算法和插件来满足自己的需求。