概述

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的任务是选择一个Pod放置到Node节点。 放置是一组Pod对一组Node的部分非注入式分配。

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

Kubernetes Scheduler是确保局部最优的多步调度程序,而不是确保全局最优的单步调度程序。

如下图所示,并不保证每个可用node都被分配到pod

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

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

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浅析的更多相关文章

  1. 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯云容器服务团队 源码为 k8s v1.6.1 版本,github 上对应的 commit id 为 b0b7a323cc5a4a ...

  2. 图解 kubernetes scheduler 架构设计系列-初步了解

    资源调度基础 scheudler是kubernetes中的核心组件,负责为用户声明的pod资源选择合适的node,同时保证集群资源的最大化利用,这里先介绍下资源调度系统设计里面的一些基础概念 基础任务 ...

  3. 【转】Kubernetes scheduler学习笔记

    简介 Kubernetes是一个强大的编排工具,可以用来很方便的管理许多台机器,为了使机器的资源利用率提高,同时也尽可能的把压力分摊到各个机器上,这个职责就是由scheduler来完成的. Kuber ...

  4. 图解kubernetes scheduler基于map/reduce无锁设计的优选计算

    优选阶段通过分离计算对象来实现多个node和多种算法的并行计算,并且通过基于二级索引来设计最终的存储结果,从而达到整个计算过程中的无锁设计,同时为了保证分配的随机性,针对同等优先级的采用了随机的方式来 ...

  5. 图解kubernetes scheduler基于map/reduce模式实现优选阶段

    优选阶段通过分map/reduce模式来实现多个node和多种算法的并行计算,并且通过基于二级索引来设计最终的存储结果,从而达到整个计算过程中的无锁设计,同时为了保证分配的随机性,针对同等优先级的采用 ...

  6. Kubernetes 学习(九)Kubernetes 源码阅读之正式篇------核心组件之 Scheduler

    0. 前言 继续上一篇博客阅读 Kubernetes 源码,参照<k8s 源码阅读>首先学习 Kubernetes 的一些核心组件,首先是 kube-scheduler 本文严重参考原文: ...

  7. kubernetes之Scheduler原理分析

    scheduler在整个系统承担了承上启下的重要功能 承上值负责接受Controller Manager创建新的pod,安排目标Node 旗下指安置工作完成后,目标Node上的kubelet服务进程接 ...

  8. 030.Kubernetes核心组件-Scheduler

    一 Scheduler原理 1.1 原理解析 Kubernetes Scheduler是负责Pod调度的重要功能模块,Kubernetes Scheduler在整个系统中承担了"承上启下&q ...

  9. kubernetes多节点部署解析

    注:以下操作均基于centos7系统. 安装ansible ansilbe可以通过yum或者pip安装,由于kubernetes-ansible用到了密码,故而还需要安装sshpass: pip in ...

随机推荐

  1. 基于SpringBoot+SpringDataJpa后台管理

    昨天朋友找我喝酒,说30岁了,比较焦虑,钱没赚到,整天被媳妇数落. 其实现在我们看到的不一定就事真实的情况,就算从高斯分布看,平平淡淡的人生才是大部分人的轨迹.当然抖音.知乎上的不能比,人均收入百万, ...

  2. spring:spring再总结(ioc、aop、DI等)

    IOC(Inversion of Control),即"控制反转",不是一种技术而是一种思想 1.IOC的理解 Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部 ...

  3. 实现select下拉框的无限加载(懒加载)

    在实际开发中我们有时无法避免select下拉功能数据过大导致页面卡顿(如在我在一次迭代中有一个select项接口返回了5000多条数据).用户体验差!结合实际开发给出了3个解决方案: 方案1.sele ...

  4. tomcat源码--springboot整合tomcat源码分析

    1.测试代码,一个简单的springboot web项目:地址:https://gitee.com/yangxioahui/demo_mybatis.git 一:tomcat的主要架构:1.如果我们下 ...

  5. python3 连接数据库~

    ~目前记录的是针对python3写的数据库连接,不适用于pyhon2.python3如果想要与数据库进行连接,则需要先下载对应各数据库的插件包,然后导入包.python3的插件下载地址:https:/ ...

  6. Linux 串口工具 lsz lrz 移植

    //之前写的,刚才不小心误删了,所以重新再发出来. 1 下载源码包 首先下载最新版的lrzsz,地址:https://ohse.de/uwe/software/lrzsz.html.下面以 0.12. ...

  7. 【Python】数字与运算符

    数据类型与运算符 数字 / 浮点除 // 整数除 ** 乘方 多种混合类型运算数的运算会把整数转换为浮点数 除了 int 和 float,Python也支持其他类型的数字,例如 Decimal 或者 ...

  8. matlab中nargin函数输入参数数目

    来源:https://ww2.mathworks.cn/help/matlab/ref/nargin.html?searchHighlight=nargin&s_tid=doc_srchtit ...

  9. C++派生类与基类的关系

    派生类与基类有这些关系: 1.公有派生类从基类继承所有成员和成员函数 2.公有派生类无法直接访问从基类继承的私有成员,但可以通过继承的公共接口访问. 3.公有派生类无法继承基类的友元函数. 4.基类先 ...

  10. Python+Appium自动化测试(7)-截图方法

    一,selenium模块的两种截图方法 get_screenshot_as_file(filename) 参数filename为截图文件保存的绝对路径,如: driver.get_screenshot ...