Kubernetes Scheduler是负责Pod调度的进程(组件),随着Kubernetes功能的不断增强和完善,Pod调度也变得越来越复杂。Kubernetes Scheduler内部实现机制也不断优化,从最初的两阶段调度机制(Predicates&Priorities)发展到后来的升级版调度框架,以满足负责的调度场景。
一、Scheduler调度流程
Kubernetes Scheduler在整个系统中承担了“承上启下”的重要功能,“承上”是指它负责接收Controller Manager创建新的Pod,为其安排一个目标Node;“启下”是指安置工作完成后,目标Node上的kubelet服务进程接管后续工作,负责Pod生命周期中的“下半生”。
Kubernetes Scheduler的作用是将待调度的Pod(API新创建的Pod、Controller Manager为补足副本而创建的Pod等)按照特定的调度算法和调度策略绑定(Binding)到集群中某个合适的Node上,并将绑定信息写入etcd中。在整个调度过程中涉及三个对象,分别是待调度Pod列表、可用Node列表以及调度算法和策略。就是通过调度算法和调度策略将待调度Pod列表中的每个Pod都从Node列表中选择一个最合适的Node。
目标节点上的kubelet通过API Server监听到Kubernetes Scheduler产生的Pod绑定事件,随后获取对应的Pod清单,下载Image镜像并启动容器。
Scheduler只与API Server交互,其输入和输出如下:
- 输入:待调度的Pod和全部计算节点的信息
- 输出:目标Pod要”安家“的最优节点(或者暂时不存在)。
旧版本的Kubernetes Scheduler的调度总体包括两个阶段:过滤(Filtering)+打分(Scoring),随后就是绑定目标节点,完成调度。
- 过滤阶段,遍历所有目标Node,删选出符合要求的候选节点。在此阶段,Scheduler将所有不符合的Node过滤,只留下符合条件的候选节点。具体实现通过一系列的Filter对每个Node进行筛选,筛选完成后通常会有多个节点供调度,从而进入打分阶段;如果结果为空,则表示当前还没有符合条件的Node节点,Pod会维持在Pending状态。
- 打分阶段,在过滤阶段的基础上,采用优选策略(xxx Priorities)计算出每个候选节点的积分,积分最高者胜出,因为积分最高者表示最佳候选人。挑选最佳节点后,Scheduler会把目标Pod安置次节点上,调度完成。
在过滤阶段Predicates是一系列过滤器,每种过滤器都实现一种节点特征的监测。比如磁盘、主机、节点上的可用端口、节点标签、CPU和内存资源、服务亲和性。
在打分阶段Priorities则用来对满足条件的Node节点进行打分,常见的Priorities包含LeastRequestedPriority(选出资源消耗最小的节点)、BalanceResourceAllocation(选出资源使用率最均衡的节点)。将 Predicates和Priorities合并为Kubernetes Scheduling Policies。