learning/k8s-advanced/schedule/index.md
参考文档: Kubernetes Scheduler
在Kubernetes中,调度(Scheduling),指的是为 Pod 找到一个合适的节点,并由该节点上的 kubelet 运行 Pod。
每当集群中有新的 Pod 创建时,Kubernetes 调度器将负责为其找到最合适的节点去运行。调度器按照本文后面描述的原则执行执行调度工作。如果您想了解为什么 Pod 被分配到了具体的某一个节点,或者您打算自己实现一个定制化的调度器,本文可以帮助您更好的理解 Kubernetes 的调度工作。
kube-scheduler 是 Kubernetes 中默认的调度器,并且运行在 Master 组件中。kube-scheduler 虽然是默认的调度器,但是,在您需要的时候,您可以实现自己的调度器以替代 kube-scheduler。
对于每一个新创建的或者未调度的 Pod,kube-scheduler 为其选择一个合适的节点去运行。问题是,每一个 Pod 以及其中的每一个容器,都有不同的资源需求,在调度时,必须选择那些能够满足 Pod 的资源需求的节点才可以。
集群中能够满足某一个 Pod 的资源需求的节点,我们称其为 可选节点(feasible node)。如果某一个 Pod 没有合适的 可选节点,则该 Pod 将一直停留在 Pending 状态,直到集群中出现了对于该 Pod 来说合适的 可选节点。
调度器在执行调度时,执行的步骤如下:
这个过程,我们称其为绑定(binding)在为 可选节点 评分时,需要考虑的因素有:
kube-schduler在执行调度时,将上述过程分成两个阶段来执行:
Filtering(筛选/过滤)阶段,kube-scheduler找出所有对待调度的 Pod 来说合适的 可选节点。例如,PodFitsResources 过滤器检查候选节点是否具备足够的资源可以满足 Pod 的资源需求。在筛选阶段结束后,通常可以找出多个 可选节点,如果没有找到,则 Pod 一直停留在 Pending 状态。
Scoring(评分)阶段,kube-scheduler 先按照当前可用的评分规则为每一个 可选节点 频分, 然后,按评分结果对所有的 可选节点 排序,以找出最适合 Pod 运行的节点。
最后,kube-scheduler 将 Pod 分配到评分最高的 可选节点。如果有多个节点评分一样且最高,kube-scheduler 将随机从中选择一个节点。
Filtering(筛选/过滤)阶段,使用的过滤器有:
hostPort 在该节点上是否可用文件系统已满、网络不可用、kubelet未就绪 等相关的条件weightedPodAffinityTerm 并求和,找出结果最高的节点scheduler.alpha.kubernetes.io/preferAvoidPods 评分。可使用此 annotation 标识哪些 Pod 不能够运行在同一个节点上PreferredDuringSchedulingIgnoredDuringExecution 指定的 node affinity 偏好评分。参考 将容器组调度到指定的节点