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 会从中随机选取一个。函数

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

首先来看下Pod生命周期

调度示意图

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

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

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

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后续再介绍)。

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

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

1.3 节点选择器(Node Selector)

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

1.4 Node Taints and Pod Tolerations

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

1.5 亲和力(Required Affinity)

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

  • 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的生存能力进行评估。

更多详情,请参见官网

相关文章
相关标签/搜索