1.调度过程简介

Scheduler的调度算法是可以自定义的,默认是default Scheduler
当用户请求向api-server创建pod的时候,检查权限等等都没有任何问题的情况下,接下来他会把请求交给Scheduler,由Scheduler从众多节点当中选择一个适用、匹配的节点,来作为接下来运行此Pod的节点,选择结果并不是直接反应在节点之上,而是会告诉api-server,并把结果记录在etcd中,这个结果会在一段时间内成为一个持久的状态,如果节点不发生故障,Pod不会因为资源紧缺而被omkill或者驱逐的话,这个Pod资源将一直在这个节点上运行,哪怕重启也在此节点,这也是存储在etcd中持久存储的目的。由api-server指挥着被选中节点的kubelet,或者说kubelet一直wach着api-server中与当前
节点相关联的事件变动,如果scheduler调度的结果已经被api-server输出出来,那么这个节点的kubelet一定可以wach到跟这个节点相关联的资源变动状态。因此,这个节点就要尝试着获取到api-server中定义这个Pod的配置清单也就是规范和模板,根据配置清单来创建这个Pod,而Pod是运行容器的,要根据镜像拉取策略,要根据仓库位置,获取到本地以后根据镜像创建容器,这些是kubelet完成的任务。Service并不是真实存在的,他只是对应节点上对应iptables和ipvs的规则,创建service对象的时候一样要提交给api-server,检查和认证要授权等机制,创建完成以后也要存储在etcd中,能够跟etcd打交道的只有api-server,kube-proxy会监控着跟servier相关联的变动,来创建相对应的iptables和ipvs规则无论是kubelet和kube-proxy都要连接至api-server获取某些资源定义,而api-server不是所有人都可以访问,要做认证授权、准入控制的检查,所以kubelet和kube-proxy可以说是api-server的客户端,中间在传输的时候也要做内部数据序列化,序列化方案是json。

2.预选策略(Predicate)

Predicate(预选)三种状态:当前占用、资源需求、资源限额
预选过程定义:从所有的节点当中,去排除那些完全不能符合对应pod的基本运行要求的节点
https://github.com/kubernetes/kubernetes/blob/master/pkg/scheduler/algorithm/predicates/predicates.go
预选策略:
CheckNodeCondition:  检查节点是否正常
GeneralPredicates
HostName:      检查Pod对象是否定义了pod.spec.hostname,
PodFitsHostPorts:pods.spec.containers.ports.hostPort 表示绑定在节点的x个端口上,如果节点端口被占用,那么就不满足
MatchNodeSelector:pods.spec.nodeSelector
PodFitsResources:检查Pod的资源需求是否能被节点所满足;
NoDiskConflict:检查Pod依赖的存储卷是否能满足需求;(例如有pod要挂载nfs,但是部分节点不满足nfs需求)默认不启用
PodToleratesNodeTaints:检查Pod上的spec.tolerations可容忍的污点是否完全包含节点上的污点;
PodToleratesNodeNoExecuteTaints: 是检查pod的容忍污点是否能接纳NoExecute的污点,举个例子就是说一开始pod容忍污点然后调度到某节点,然后即使节点修改污点,pod也不会离开,但是加NoExecute污点,pod如果无法容忍会被驱离
CheckNodeLabelPresence: 根据标签是否存在是否接受调度此节点(默认关闭)
CheckServiceAffinity:      将相同service的pod尽可能地放在一起(默认关闭)
MaxEBSVolumeCount
MaxGCEPDVolumeCount
MaxAzureDiskVolumeCount
CheckVolumeBinding:
NoVolumeZoneConflict:     给定的区域限之中检查存储卷冲突
CheckNodeMemoryPressur 检查内存节点是否存在压力(内存压力过大就不符合要求)
CheckNodePIDPressure    检查节点pid数量资源压力过大
CheckNodeDiskPressure    检查节点磁盘IO是否过高
MatchInterPodAffinity      检查节点是否满足POD是否满足亲和或者反亲和(需要自己定义)注意:预选是一票否决的方式,满足所有的才可以通过

3优选(Priority)

含义:计算基于一系列的算法函数,把每一个节点的数据输入进去计算优先级,计算完以后,在排序,取得分最高的,就是我们最佳匹配的节点
https://github.com/kubernetes/kubernetes/tree/master/pkg/scheduler/algorithm/priorities优先函数:
LeastRequested: 由节点的空闲资源与节点的总容量来比较一个比值 根据空闲比例来评估
(cpu((capacity-sum(requested))*10/capacity)+memory((capacity-sum(requested))*10/capacity))/2
BalancedResourceAllocation:CPU和内存资源被占用率相近的胜出
NodePreferAvoidPods:  优先级较高,根据节点是否由注解信息来判定
节点注解信息“scheduler.alpha.kubernetes.io/preferAvoidPods”
TaintToleration:将Pod对象的spec.tolerations列表项与节点的taints列表项进行匹配度检查,匹配条目越多,得分越低;
SeletorSpreading: 把同一个标签选择器的pod散开至多个节点
InterPodAffinity:  匹配项越多得分越高
NodeAffinity:    节点亲和型
MostRequested: 跟LeastRequested相反,空闲越小的分越高,尽可能把一个节点资源用完(默认关闭)
NodeLabel: 根据节点是否有标签(默认关闭)
ImageLocality:根据满足当前Pod对象需求的已有镜像的体积大小之和 (默认关闭)注意:所有开启的函数做评分,评分相加,最高者为胜,如果评分相同那么就随机选择

4.选定(Select)

将从优选步骤选出的节点绑定,如果由多个节点,那么就随机取一个即可

二十、调度器、预选策略以及优选函数相关推荐

  1. 进程管理(二十二)—CFS调度器

    CFS是内核使用的一种调度器或调度类,它主要负责处理三种调度策略:SCHED_NORMAL.SCHED_BATCH和SCHED_IDLE.调度器的核心在挑选下一个运行的进程时有可能会遍历所有的调度类别 ...

  2. 花书+吴恩达深度学习(二十)构建模型策略(超参数调试、监督预训练、无监督预训练)

    目录 0. 前言 1. 学习率衰减 2. 调参策略 3. 贪心监督预训练 4. 贪心逐层无监督预训练 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十 ...

  3. 设计模式学习笔记(二十四):策略模式

    1 概述 1.1 引言 在外出旅游时,很多时候的出行方式都不止一条,通常根据实际情况,比如目的地,预算,旅游时间等确定最适合的出行方式.在软件开发中,也常常会遇到类似的情况,实现某一个功能有多种途径, ...

  4. 雷观(二十):个人竞争策略,战国策与个人略

    观点 : 国家与国家之家.公司与公司之间.个人与个人之间,都充满了竞争.这三个主体之间存在着包含和交叉关系,更为重要的是,竞争策略是相似的,值得探究.从国家和企业之间的竞争,我们可以找到个人竞争的策略 ...

  5. Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍

    参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...

  6. Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)

    日期 内核版本 架构 作者 GitHub CSDN 2016-06-30 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 ...

  7. 7种主流案例,告诉你调度器架构设计通用法则(干货!)

    女主宣言 今天小编为大家转载一篇来自DBAplus社群的干货文章,希望能够帮助大家对关于调度器的理解.作者张晨,Strikingly数据平台工程师,算法.分布式系统和函数式编程爱好者.Shanghai ...

  8. kernel调度(2)----主调度器和周期性调度器

    进程切换 上一章介绍了调度相关的基础知识,那么这章准备介绍一下进程切换相关的原理.包括主调度器和周期性调度器都做了哪些工作.以及进程切换都做了哪些工作. 周期性调度器都做了什么 我们知道周期性调度器就 ...

  9. 并发问题的解决思路以及Go语言调度器工作原理

    上周的文章<Go并发编程里的数据竞争以及解决之道>最后留下了一个用并发解决的思考题,期间有几位同学留言说了自己的实现思路,也有两位直接私信发代码让我看的,非常感谢几位的积极参与.今天的文章 ...

  10. 上周并发题的解题思路以及介绍Go语言调度器

    上周的文章<Go并发编程里的数据竞争以及解决之道>最后留下了一个用并发解决的思考题,期间有几位同学留言说了自己的实现思路,也有两位直接私信发代码让我看的,非常感谢几位的积极参与.今天的文章 ...

最新文章

  1. Zookeeper源码分析:Leader角色初始化
  2. 将ubuntu光盘作为安装源_[转载]Ubuntu 以光盘做为软件源
  3. 黑龙江专科大学计算机专业,黑龙江10大最好的专科学校,有你心仪的学校吗?...
  4. linux xp共享文件夹,windows-xp – 从Linux访问Windows共享文件夹?
  5. 文本分析软件_读书笔记:伍多库卡茨质性文本分析:方法、实践与软件使用指南...
  6. python之父子进程间通信
  7. 日常开发中的几个常用跨域处理方式
  8. 【渝粤题库】陕西师范大学300009 考古学概论
  9. C语言Ip获取mac,C语言怎么实现Windows下获取IP和MAC地址?
  10. Mac OS 搭建phonegap开发环境
  11. 1299最长上升子序列
  12. 怎样更改itunes备份位置_正确修改itunes备份文件路径方法
  13. 双屏怎么快速切换鼠标_Win7系统如何设置一键快速切换双屏显示(图文)
  14. Context上下文到底是个什么东东?
  15. 程序员”脑筋急转弯”
  16. memcmp函数使用详解
  17. 用户故事拆分方法总结
  18. 查看自己电脑的主板支持多大的内存
  19. DRF批量修改序列化器使用
  20. MySQL国内镜像下载地址

热门文章

  1. 当我按下电源按钮的瞬间,电脑都干了些什么
  2. [UESTC878]温泉旅店
  3. 将Ubuntu 用户目录下的中文目录修改为英文
  4. 备份与同步(二) 如何使用云存储来实现多设备的备份与同步
  5. 【男保姆式】教你打开第一个微信小程序
  6. 【NVIDIA Jetson TK1】一,开发板重装ubuntu系统,重新刷机,重新烧系统,恢复系统
  7. 书香小说APP界面设计
  8. android电话通讯录导入iphone6,怎么把小米手机通讯录导入iphone6?
  9. Python100例——第五章----不定方程的解
  10. 大数据给交通行业带来的五大变革 | 交通数据的深度应用