Kubernetes Scheduler浅析

概述

Kubernetes 调度器(Scheduler)是Kubernetes的核心组件;用户或者控制器创建Pod之后,调度器通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node 上的 Pod。调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。调度器会依据下文的调度原则来做出调度选择。

kube-scheduler 给一个 pod 做调度选择包含两个步骤:过滤、打分
过滤阶段会将所有满足 Pod 调度需求的 Node 选出来。例如,PodFitsResources 过滤函数会检查候选 Node 的可用资源能否满足 Pod 的资源请求。在过滤之后,得出一个 Node 列表,里面包含了所有可调度节点;通常情况下,这个 Node 列表包含不止一个 Node。如果这个列表是空的,代表这个 Pod 不可调度。
打分阶段,调度器会为 Pod 从所有可调度节点中选取一个最合适的 Node。根据当前启用的打分规则,调度器会给每一个可调度节点进行打分。
最后,kube-scheduler 会将 Pod 调度到得分最高的 Node 上。如果存在多个得分最高的 Node,kube-scheduler 会从中随机选取一个。

本文主要对Kubernetes Scheduler做一个简单介绍,让大家理解 Pod 为什么会被调度到特定的 Node 上。

首先来看下Pod生命周期

Kubernetes Scheduler浅析

调度示意图

Kubernetes Scheduler的任务是选择一个Pod放置到Node节点。 放置是一组Pod对一组Node的部分非注入式分配。
Kubernetes Scheduler浅析

调度是一个优化问题:首先,调度程序确定可行的放置节点集合,即满足一组给定约束的节点集合。 然后,调度程序确定可行的节点集合,这是得分最高的可用节点的集合。
Kubernetes Scheduler浅析

Kubernetes Scheduler是确保局部最优的多步调度程序,而不是确保全局最优的单步调度程序。
如下图所示,并不保证每个可用node都被分配到pod
Kubernetes Scheduler浅析

Kubernetes Scheduler监视Kubernetes对象存储并选择具有最高优先级的未绑定Pod来执行调度步骤或抢占步骤。

调度步骤

对于给定的Pod,如果存在至少一个节点,则启用调度步骤,以使该节点可用于托管Pod。
如果启用了“调度步骤”,则调度程序会将Pod绑定到可行的节点,这样绑定将实现最高的生存能力。
如果未启用“调度步骤”,则调度程序将尝试执行抢占步骤。

抢占步骤

对于给定的Pod,如果存在至少一个节点,则启用抢占步骤,以便如果要删除绑定到该节点的优先级较低的Pod子集,则该节点可用于托管Pod。
如果启用了抢占步骤,则调度程序将触发删除绑定到一个节点的具有较低优先级的Pod子集,抢占步骤将造成最低的人员伤亡。
(造成的人员伤亡是根据Pod中断预算(PDB)违规情况进行评估的)
注意,调度程序不保证触发抢占步骤的Pod将在后续的调度步骤中绑定到该节点。

###1、过滤器
对于每个Pod,Kubernetes Scheduler都会确定可行节点的集合,这是满足Pod约束的节点的集合。
从概念上讲,Kubernetes Scheduler定义了一组过滤器函数,这些过滤器函数在给定Pod和Node的情况下,确定Node是否满足Pod的约束。 所有过滤器函数都必须对节点托管Pod产生true。

####1.1 可调度性和生命周期阶段(Schedulability and Lifecycle)
此过滤器功能根据节点的可调度性和生命周期阶段认为该节点可行。 节点条件是通过taints和tolerations考虑的(taints和tolerations后续再介绍)。
Kubernetes Scheduler浅析

1.2 资源需求和资源可用性(Resource)

此过滤器功能根据Pod的资源要求和Node的资源可用性将Node视为可行。
Kubernetes Scheduler浅析

1.3 节点选择器(Node Selector)

该过滤器功能根据Pod的节点选择器值和Node的标签值将Node视为可行。
Kubernetes Scheduler浅析

1.4 Node Taints and Pod Tolerations

此筛选器功能根据Pod的污点的键值对和Node的Tolerations的键值对将Node视为可行。
Kubernetes Scheduler浅析

1.5 亲和力(Required Affinity)

此过滤器功能根据Pod所需的Node Affinity条件,Pod Affinity条件和Pod Anti Affinity条件将Node视为可行。
Kubernetes Scheduler浅析

  • Node Affinity
    必须将Pod分配给Node,以使Node的标签与Pod的Node Affinity Requirements匹配。 此外,不得将Pod分配给节点,以使节点的标签不符合Pod节点亲和性要求。
  • Pod Affinity
    必须将Pod分配给一个节点,以使节点上至少有一个与TopologyKey匹配的Pod符合Pod的Pod相似性要求。
  • Pod Anti-Affinity
    必须将Pod分配给节点,以使与TopologyKey匹配的节点上没有Pod符合Pod的Pod反亲和性要求。

###2、可行性
对于每个Pod,Kubernetes Scheduler都会确定可行节点的集合,这是满足Pod约束的节点的集合。 然后,Kubernetes Scheduler确定具有最高生存能力的可行节点集。
从概念上讲,Kubernetes Scheduler定义了一组评估函数,给定Pod和Node,它们确定Pod和Node对的生存能力。 评分相加。

2.1 首选亲和力

此过滤器功能根据Pod的首选Node Affinity条款,Pod Affinity条款和Pod Anti Affinity条款对Node的生存能力进行评估。
Kubernetes Scheduler浅析
更多详情,请参见官网

猜你喜欢

转载自blog.51cto.com/1648324/2545146