一、简介

master上运行着三个最核心的组件,apiserver、scheduler、controller manager。此外,master还依赖于ectd存储节点,最好ectd是有冗余能力的集群;

(1)调度器(scheduler)

  • master上的scheduler控制着pod运行在哪个node上,默认用的default scheduler;
  • 调度器的调度信息存储在master上的etcd里面,apiserver负责和etcd通信;
  • kubelete运行在node节点上,监控着Node节点上的pod状态,并参与pod的创建等工作;
  • kube-proxy也运行在node节点上,它监控着service资源的变动;
  • kubelete和kube-proxy都要连接master上的apiserver去获取定义信息;

(2)预选步骤

a、default scheduler是通过三个步骤来实现调度的:

  • 预选策略(predicate):先排除那些完全不符合此pod运行法则的节点,有两个维度来排除,一个是最低资源需求,即节点必须满足此Pod的最低资源;第二个是资源限额,即当前节点最多能给pod提供的资源;
  • 优选(priority):在符合节点找到最佳匹配的节点;
  • 绑定(select):把pod绑定到优选的节点上,如果有多个最佳节点,就会随机选一个;

b、kubernetes的调度方式

  • nodeaffinity,表示node亲和性调度,表示这个pod对这个节点有一定的倾向性。我们通过上面的nodeselector来完成这类调度;
  • podaffinity或podunaffinity:pod亲和性或者pod反亲和性调度,有时我们期望某些Pod运行在同一个节点上或者是相邻的节点上,或者我们期望某些Pod不要运行在某些节点上;
  • taints和tolerations:污点和污点容忍调度:可以在某些节点上打上污点,表示这些节点不让pod在其上面运行。taints是定义在节点之上的,tolerations是定义在pod之上的;

(3)常用的预选策略

k8s的预选策略很多,此处可以看源码:https://github.com/kubernetes/kubernetes/blob/master/pkg/scheduler/algorithm/predicates/predicates.go

a、ChekNodeCondition

表示检查是否可以在节点磁盘、网络不可用,或未准备好的前提下,能够把pod调度到上去。

b、GeneralPredicate

[root@master ~]# kubectl describe nodes node01    #查看节点资源使用

查看资源定义清单字段:
[root@master ~]# kubectl explain pods.spec
[root@master ~]# kubectl explain pods.spec.containers.ports
  • hostname  表示如果pod定义了hostname属性(pod.spec.hostname),则检查节点的名字跟pod的hostname是否想匹配,但这里并不是定义这个pod必须运行在这些节点上;
  • PodFitsHostPorts:如果节点定义了hostport属性(pod.spec.containers.ports.hostPort),表示指定在节点的哪个端口上。如果这个节点的端口被占用了,那么这个节点就不适合运行这个pod;
  • MatchNodeSelector:检查pods.spec.nodeSelector这个字段你是否定义了,运行在携有这有这些标签选择器的节点上;
  • PodFitsResources:检查节点是否有足够的资源来支持这个pod运行;

c、NoDiskConfict

检查Pod所请求的存储卷类型在此节点上是否不可用。 NoDiskConfict调度策略默认没有启用。

d、PodToleratesNodeTaints

如果Pod定义了Tolerates(容忍度),即 pods.spec.tolerations,那么就看pod能不能容忍节点上的污点,如果是,表示这个节点可以被选定;

e、PodToleratesNodeNoExecuteTaints

检查pod是否容忍节点上有NoExecute污点。NoExecute污点:如果一个pod上运行在一个没有污点的节点上,后来这个节点又给加上污点了,那么NoExecute表示这个新加污点的节点会去除其上正在运行的pod;此调度策略默认没有启用;

f、CheckNodeLabelPresence

检查节点上指定标签的存在性,如果节点有pod指定的标签,那么这个节点就被选中。 此调度策略默认没有启用;

g、CheckServceAffinity

一个service下可以有多个pod,比如这些pod都运行在1、2、3机器上,而没有运行在4、5、6机器上,那么CheckServceAffinity就表示新加入的pod都集中运行在1、2、3机器上,这样集中好处是一个service下pod之间内部通信的效率变高了。 这个策略默认也是没有启用的。

h、MaxEBSVolumeCountPred

检查节点上挂载的EBS存储器(亚马逊的弹性块存储)的数量是否超出了最大的设定值。一般来说,一个节点上最多可以挂载39个存储卷。可以编译安装k8s指定该值;

i、MaxGCEPDVolumeCountPred

GCE是谷歌的云存储引擎。可以编译安装k8s指定该值。

j、 MaxAzureDiskVolumeCountPred

pod会选择挂载足量Azure存储卷的节点。

k、CheckVolumeBinding

检查节点上的pvc是否被别的pod绑定了;

l、NoVolumeZoneConfict

检查节点上的pod是否与pod的需求冲突;

m、CheckNodeMemoryPressure

检查节点内存是否存在压力;

n、CheckNodePIDpressure

检查节点pid数量是否压力过大,但一般pid是可以重复使用的;

o、CheckNodeDiskPressure

检查内存/磁盘 IO是否压力过大;

p、MatchInterPodAffinity

检查Pod是否满足亲和性或者反亲和性;

pod在调度的时候,以上策略要逐一评估;

 

(4)常用的优选函数

函数源码:https://github.com/kubernetes/kubernetes/tree/master/pkg/scheduler/algorithm/priorities

  • least_requested.go:最少请求,空闲比例。对cpu来说,用cpu((capacity-sum(requested))*10/capacity)方式进行评估,得分最高的胜出;
  • balanced_resource_allocation.go:均衡资源的使用方式,表示以cpu和内存占用率的相近程度(均衡)作为评估标准,二者占用越接近,得分就越高,得分高的胜出。
  • node_prefer_avoid_pods.go:看节点是否有注解信息"scheduler.alpha.kubernetes.io/preferAvoidPods"。没有这个注解信息,说明这个节点是适合运行这个pod的。
  • taint_toleration.go:将pod对象的spec.toleration与节点的taint列表项进行匹配度检查,匹配的条目越多,得分越低;
  • selector_spreading.go:查找当前pod对象对应的service,statefulset,replicatset等所匹配的标签选择器,在节点上运行的带有这样标签的pod越少得分越高,这样的pod优选被选出。 这就是说我们要把同一个标签选择器下运行的pod散开(spreading)到多个节点上;
  • interpod_affinity.go:遍历Pod对象亲和性的条目,并将那些能够匹配到节点权重相加,值越大的得分越高,得分高的胜出;
  • node_affinity.go:根据pod对象中的nodeselector,对节点进行匹配度检查,能够成功匹配的数量越多,得分就越高;
  • most_requested.go:表示尽可能的把一个节点的资源先用完,这个和least_requested相反,二者不能同时使用;未启用;
  • node_label.go:根据节点是否拥有标签,来评估分数;未启用;
  • image_locality.go:表示根据满足当前pod运行需要的已有镜像体积大小之和来选择节点的;未启用;

以上优选函数会逐一评估,最后得分相加;

k8s-调度器、预选策略及优选函数-二十的更多相关文章

  1. k8s调度的预选策略及优选函数

    scheduler调度过程:    Predicate(预选)-->Priority(优选)-->Select(选定)调度方式:    1.节点亲和性调度(NodeAffinity)使用n ...

  2. 05-k8s调度器、预选策略、优选函数

    目录 k8s调度器.预选策略.优选函数 节点选择过程 调度器 预选策略 优选函数 高级调度设置机制 node选择器/node亲和调度 pod亲和性 污点调度 Taints 与 Tolerations ...

  3. k8s之调度器、预选策略及优选函数

    1.调度器(scheduler) 调度器的功能是调度Pod在哪个Node上运行,这些调度信息存储在master上的etcd里面,能够和etcd打交道的只有apiserver; kubelet运行在no ...

  4. K8s预选策略和优选函数简介

    调度器选择策略: 预选策略(Predicate) 1. 根据运行Pod的资源限制来排除不符合要求的Node 2. 根据运行Pod时,是否要求共享宿主机的网络名称空间来判断,如: 某Pod启动要共享宿主 ...

  5. K8S 调度器,预选策略,优选函数

    Kubernetes Scheduler 提供的调度流程分三步: 预选策略(predicate) 遍历nodelist,选择出符合要求的候选节点,Kubernetes内置了多种预选规则供用户选择. 优 ...

  6. Kubernetes 学习20调度器,预选策略及优选函数

    一.概述 1.k8s集群中能运行pod资源的其实就是我们所谓的节点,也称为工作节点.master从本质上来讲,他其实是运行整个集群的控制平面组件的比如apiserver,scheal,controlm ...

  7. 7.k8s.调度器scheduler 亲和性、污点

    #k8s. 调度器scheduler 亲和性.污点 默认调度过程:预选 Predicates (过滤节点) --> 优选 Priorities(优先级排序) --> 优先级最高节点 实际使 ...

  8. golang中GPM模型原理与调度器设计策略

    一.GMP模型原理first: 1. 全局队列:存放待运行的G2. P的本地队列:同全局队列类似,存放待运行的G,存储的数量有限:256个,当创建新的G'时,G'优先加入到P的本地队列,如果队列已满, ...

  9. k8s调度器、预选策略及调度方式

    一.k8s调度流程 1.(预选)先排除完全不符合pod运行要求的节点2.(优先)根据一系列算法,算出node的得分,最高没有相同的,就直接选择3.上一步有相同的话,就随机选一个 二.调度方式 1.no ...

随机推荐

  1. Protostuff序列化和反序列化使用说明

    原文:http://blog.csdn.net/zhglance/article/details/56017926 google原生的protobuffer使用起来相当麻烦,首先要写.proto文件, ...

  2. 揭秘jbpm流程引擎内核设计思想及构架

    揭秘jbpm流程引擎内核设计思想及构架 作者 胡长城(银狐999)   1     前言 2     阅读本篇的基础准备 2.1      概念的基础 2.2      环境的基础 3     什么是 ...

  3. 国内90%以上的 iOS 开发者,对 APNs 的认识都是错的

    转:http://toutiao.com/a6276578687162040578/?tt_from=weixin&utm_campaign=client_share&app=news ...

  4. Codeforces 424 C. Magic Formulas

    xor是满足交换律的,展开后发现仅仅要能高速求出 [1mod1....1modn],....,[nmod1...nmodn]的矩阵的xor即可了....然后找个规律 C. Magic Formulas ...

  5. HDU-1076-An Easy Task(Debian下水题測试.....)

    An Easy Task Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...

  6. CF 568A(Primes or Palindromes?-暴力推断)

    A. Primes or Palindromes? time limit per test 3 seconds memory limit per test 256 megabytes input st ...

  7. 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq

    常量,字段,构造方法   常量 1.什么是常量 ​ 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...

  8. 读书笔记-2java虚拟机的可达性算法与finalize方法

    JAVA通过可达性分析算法来确定堆中哪些对象是应该被回收的. 非常多人包含我曾经在不了解的时候总以为是通过引用计数器来推断某个对象是否应该被回收可是后来想了想包含查阅一些资料发现不是这种.由于假设採用 ...

  9. 【转载】FAT12文件系统之引导扇区结构

    FAT12文件系统之引导扇区结构 文件系统即文件管理系统,是操作系统的重要组成部分之一,如果需要开发底层磁盘驱动或编写自己的操作系统,就必须详细了解文件系统. FAT12是Microsoft公司DOS ...

  10. PandoraBox 支持3G无线上网卡(电信卡3G卡)(三)

    笔者采用的是华为EC122无线上网卡 一:编辑/etc/modules.d/60-usb-serial usbserial vendor=0x12d1   product=0x1505 二:编辑/et ...