Kubernetes Scheduler浅析

概述

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

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

本文主要对Kubernetes Scheduler作一个简单介绍,让你们理解 Pod 为何会被调度到特定的 Node 上。函数

首先来看下Pod生命周期

Kubernetes Scheduler浅析

调度示意图

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

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

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

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

调度步骤

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

抢占步骤

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

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

####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反亲和性要求。

###二、可行性
对于每一个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浅析
更多详情,请参见官网

相关文章
相关标签/搜索