背景介绍
K8S调度器(kube-scheduler)是K8S调度pod的控制器,它作为K8S核心组件运行。调度器基于一定的调度策略为pod找到合适的运行节点。
调度流程
K8S调度器调度一个pod时候主要分为三个阶段
- 过滤阶段:调用一系列predicate函数或者叫filter函数过滤掉不合适的节点,比如说某些节点上不满足pod声明的运行所需要的资源,如CPU,内存等资源,那么这些节点会在这个阶段被过滤掉。
- 打分阶段:调用一系列priority函数或者叫score函数给通过第一步过滤的节点打分排序。比如有三个节点通过了过滤阶段,当三个节点通过资源均衡函数的打分,那么最终剩余CPU,内存等资源更多的节点会获得更高的优先级评分。
- 调度阶段:把pod调度到选择优先级最高的节点上
调度过程如下图所示:
调度算法
前文提到,K8S调度器会调用一系列filter函数和priority函数,这些函数是K8S内置的调度算法, K8S会根据默认的调度算法将pod调度到最合适的节点上。filter函数的目的是过滤掉不符合pod要求的节点,通常会有多个节点通过filter阶段,prioriry函数的目的就是在剩下的节点中选出最合适的节点。
我们来介绍一下K8S默认的调度策略有哪些。
filter策略:
- PodFitsResources: 这条策略是过滤掉所剩资源不满足pod要求的节点
- MatchNodeSelector: 这条策略是过滤掉不匹配pod nodeSelector要求的节点
- PodFitsHostPorts: 这条策略是过滤掉pod声明的HostPort已经被占用的节点
- 等等