Scheduler

Scheduler会监视新创建的没有分配节点的 Pod。对于Scheduler发现的每个 Pod, Scheduler都负责为该 Pod 找到最佳的运行节点

kube-scheduler

kube-scheduler 是 Kubernetes 的默认调度程序,作为控制平面。如果愿意并且需要的话,可以编写自己的调度组件并使用它。

对于每个新创建的 pod 或其他未调度的 pod,kube-scheduler 都会选择一个最佳节点供它们运行。然而,Pod 中的每个容器对资源都有不同的要求,每个 Pod 也有不同的要求。因此,需要根据具体的调度需求对现有节点进行过滤。

在集群中,满足 Pod 调度要求的节点称为“可行(feasible)”节点。如果没有合适的节点,则 Pod 将保持未调度状态,直到调度程序能够放置它。

Scheduler为 Pod 找到可行的 Node,然后运行一组函数对可行的 Node 进行评分,并在可行的 Node 中选择得分最高的 Node 来运行 Pod。然后,调度程序在称为“绑定(binding)”的过程中将此决定通知 API Server。

调度决策需要考虑的因素包括个体和集体资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据局部性、工作负载间干扰等。

Scheduling with kube-scheduler

kube-scheduler 通过两步操作为 pod 选择节点:

  1. 过滤
  2. 评分

过滤步骤找到可以调度 Pod 的节点集。例如,PodFitsResources 过滤器检查候选节点是否有足够的可用资源来满足 Pod 的特定资源请求。在这一步之后,节点列表包含任何合适的节点;通常,会有不止一个。如果列表为空,则该 Pod(尚)不可调度。

评分步骤中,调度程序对剩余节点进行排名,以选择最合适的 Pod 放置位置。调度程序根据活动评分规则为每个通过过滤的节点分配一个分数。

最后,kube-scheduler 将 Pod 分配给排名最高的 Node。如果存在多个具有相同分数的节点,kube-scheduler 会随机选择其中之一。

调度示例

下面以一个简单的例子介绍调度的过程:

image-20200317113233391

有一个新创建的pod,需要10个CPU。

四个节点中,只有第三个和第四个满足要求,所以第一个和第二个节点就被过滤掉。


image-20200317113339918

过滤完后,如果将pod部署到第三个节点上,则第三个节点剩余cpu额度为2.

如果将pod部署到第四个节点上,则剩余cpu额度为6。

所以scheduler决定将pod部署到第四个节点上,以保证拥有最多资源的节点优先部署pod。(这只是其中一个考虑因素,实际上还有其他因素)