k8s的高级调度方式
默认的scheduler的调度过程:
1.预选策略:从所有节点当中选择基本符合选择条件的节点。
2.优选函数:在众多符合基本条件的节点中使用优选函数,计算节点各自的得分,通过比较进行排序。
3.从最高得分的节点中随机选择出一个作为Pod运行的节点。
可以通过自己的预设来影响预选、优选过程,从而实现符合我们期望的调度结果。
影响调度方式:
1.节点选择器:NodeSelector,甚至可以设置nodename来选择节点本身。
2.亲和性调度:NodeAffinity(节点亲和性)、podAffinity(Pod亲和性)、PodAntiAffinity(Pod的反亲和性)
3.污点和容忍度:Taint、toleration
1.节点选择器:NodeSelector(pod.spec.nodeSelector)
如果我们期望把Pod调度到某一个特定的节点上,可以通过设定Pod.spec.nodeName给定node名称实现。
我们可以给一部分node打上特有标签,在pod.spec.nodeSelector中匹配这些标签。可以极大的缩小预选范围。
给node添加标签:
kubectl label nodes NODE_NAME key1=value1...keyN=valueN
如:在node01上打上标签为app=frontend,而在pod上设置NodeSelector为这个标签,则此Pod只能运行在存在此标签的节点上。
若没有node存在此标签,则Pod无法被调度,即为Pending状态。
2.亲和性调度:Affinity(pod.spec.affinity)
(1)节点亲和性:NodeAffinity(pod.spec.affinity.nodeAffinity)
表示Pod更倾向被调度在与节点亲和度高的节点上
pod.spec.affinity.nodeAffinity.下有两种定义方式:
1 preferredDuringSchedulingIgnoreDuringExecution:软亲和性;不管节点上能否满足设定条件,Pod都可以被调度,只是Pod优先被调度到符合条件多的节点上。
- preference:##与相应权重相关联的节点选择器项。
matchExpressions:##按节点标签列出的节点选择器要求列表
- key: ##键
operator:##表示键与一组值的关系。有效的运算符有:In、NotIn、Exist、DoesNotExsit。GT和LT
values: ##值;若operator为In或NotIn则值必须为非空;若operator为Exists或DoesNotExist则值必须为空;若operator为Gt或Lt则值必须有一个元素。
matchFields:##按节点字段列出的节点选择器要求列表
- key: ##键
operator:##表示键与一组值的关系。有效的运算符有:In、NotIn、Exist、DoesNotExsit。GT和LT
values: ##值;若operator为In或NotIn则值必须为非空;若operator为Exists或DoesNotExist则值必须为空;若operator为Gt或Lt则值必须有一个元素。
weight: ##权重,~100的数值
requiredDuringSchedulingIgnoreDuringExecution: 硬亲和性;节点必须满足设定条件,Pod才能被调度到这个节点。
nodeSelectorTerms: ##节点选择器列表
- matchExpressions:##按节点标签列出的节点选择器要求列表
- key: ##键
operator:##表示键与一组值的关系。有效的运算符有:In、NotIn、Exist、DoesNotExsit。GT和LT
values: ##值;若operator为In或NotIn则值必须为非空;若operator为Exists或DoesNotExist则值必须为空;若operator为Gt或Lt则值必须有一个元素。
matchFields:##按节点字段列出的节点选择器要求列表
- key: ##键
operator:##表示键与一组值的关系。有效的运算符有:In、NotIn、Exist、DoesNotExsit。GT和LT
values: ##值;若operator为In或NotIn则值必须为非空;若operator为Exists或DoesNotExist则值必须为空;若operator为Gt或Lt则值必须有一个元素。
例:硬亲和性,pod只会被调度到存在zone=foo或zone=bar标签的节点上,若没有节点存在此标签,则pod将不会被调度到任何节点上,即为Pending状态。
自主式pod的资源清单:
apiVersion: v1
kind: Pod
metadata:
name: pod-node-affinity
namespace: default
spec:
containers:
- name: myapp
image: kubernetes/myapp:v1
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: zone
operator: In
values:
- foo
- bar
(2)Pod亲和性:podAffinity(pod.spec.affinity.podAffinity)
表示一组pod更倾向与运行在一起,一般需要高效通信时需要将pod与pod运行在相近的位置。
第一个pod被调度到某一个节点,第二个pod会跟随第一个pod运行在同一个位置相近的节点上。
同一个位置的节点不一定是同一个节点,这个节点可能是同一个命名空间、网段、机柜、机房、甚至同一个区域的某一个节点上。
因为如果说,同一个节点上的资源不足时,pod被调度不到同一个节点,那么就会找与这个节点相近的某个节点上。
节点相近是指节点到节点的网络路程较近。
当然,若资源空间充足也可以实现让第二个Pod跟随第一个pod运行在同一个节点上。
可以根据topologyKey设定的标签来判定拥有哪些标签的节点属于同一位置
与节点亲和性一样,pod.spec.affinity.podAffinity.下也有两种定义方式:
preferredDuringSchedulingIgnoreDuringExecution:软亲和性;不管节点上能否满足设定条件,Pod都可以被调度,只是Pod优先被调度到符合条件多的节点上。
podAffinityTerm: ##定义一组pods(即与相对于此pod应位于(关联)或不在同一地点(反亲和力),在同一地点被定义为运行在一个节点上,其键<topologykey>的标签值与一组pods运行的任何节点
labelSelector: ##根据标签选定一组pod作为亲和对象。
matchExpressions:##标签选择器要求列表
- key: ##键
operator:##表示键与一组值的关系。有效的运算符有:In、NotIn、Exist、DoesNotExsit。GT和LT
values: ##值;若operator为In或NotIn则值必须为非空;若operator为Exists或DoesNotExist则值必须为空;若operator为Gt或Lt则值必须有一个元素。
matchLabels:##标签选择器要求列表
namespaces: ##指明选定的pod亲和对象是哪组名称空间下的,不指定则为第一个pod所运行的命名空间下。
topologyKey: ##位置拓扑键,用来判定拥有哪些标签的节点是同一位置。
weight: ##权重,~100的数值
requiredDuringSchedulingIgnoreDuringExecution: 硬亲和性;必须满足设定条件。
- labelSelector: ##根据标签选定一组pod作为亲和对象。
matchExpressions:##标签选择器要求列表
- key: ##键
operator:##表示键与一组值的关系。有效的运算符有:In、NotIn、Exist、DoesNotExsit。GT和LT
values: ##值;若operator为In或NotIn则值必须为非空;若operator为Exists或DoesNotExist则值必须为空;若operator为Gt或Lt则值必须有一个元素。
matchLabels:##标签选择器要求列表
namespaces: ##指明选定的pod亲和对象是哪组名称空间下的,不指定则为第一个pod所运行的命名空间下。
topologyKey: ##位置拓扑键,用来判定拥有哪些标签的节点是同一位置。
(3)Pod反亲和性:podAffinity(pod.spec.affinity.podAntiAffinity)
意义与上面相反,区别是topologyKey一定不能是相同的。这里不再叙述
一组pod具有反亲和性,则这组pod一定不会被调度到同一位置节点上。
这里的同一位置与上面一样。
资源清单只需将podAffinity改为podAntiAffinity即可,然后定义topologyKey。
3.污点和容忍度:Taint、toleration(nodes.spec.taints)(pod.spec.tolerations)
污点就是定义在节点上的键值属性数据:三类:1.标签。2.注解。3.污点。
其中,标签和注解可以在节点或pod上使用,而污点只能在节点上使用。
污点主要是让节点拒绝那些不能容忍自己污点的pod的。
而pod上可以定义容忍度,只要是节点上的污点是pod的容忍度的子集,则pod就可以运行在这个节点上。
taints是用在节点上的键值数据定义污点的,toleration是用在pod上的键值数据定义容忍度的。
污点:taints(nodes.spec.taints)
在节点上定义污点:
nodes.spec.taints.
- effect: ##当pod不能容忍污点时采取的措施是什么。
NoSchedule: ##仅影响调度过程,对现存的pod不产生影响;
PreferNoSchedule: ##柔性版的NoSchedule
NoExecute: ##不仅影响调度,而且影响现存pod对象,不容忍的pod对象将被驱逐;
key: ##键
timeAdded:
value: ##值
添加污点命令:kubectl taint node NODE_NAME KEY_1=VAL_1:TAINT_EFFECT_1 ... KEY_N=VAL_N:TAINT_EFFECT_N [options]
10 删除污点命令:kubectl taint node NODE_NAME KEY_NAME-
容忍度:toleration(pod.spec.tolerations)
在pod中定义容忍度:
pod.spec.tolerations.
- effect: ##同上
key: ##同上
value: ##同上
operator:##有效的运算符是Exists、Equal。默认为Equal。这样pod就可以容忍某一特定类别的污点
tolerationSeconds:##若不能容忍污点,多长时间后被驱逐。
k8s的高级调度方式的更多相关文章
- K8S 高级调度方式
可以使用高级调度分为: 节点选择器: nodeSelector.nodeName 节点亲和性调度: nodeAffinity Pod亲和性调度:PodAffinity Pod反亲和性调度:podAnt ...
- kubernetes集合
kubernetes集合 kubernetes(1):kubernetes简介和组件 kubernetes(2):yum安装kubernetes kubernetes(3):kubeadm安装k8s1 ...
- k8s之调度器、预选策略及优选函数
1.调度器(scheduler) 调度器的功能是调度Pod在哪个Node上运行,这些调度信息存储在master上的etcd里面,能够和etcd打交道的只有apiserver; kubelet运行在no ...
- Kubernetes之调度器和调度过程
scheduler 当Scheduler通过API server 的watch接口监听到新建Pod副本的信息后,它会检查所有符合该Pod要求的Node列表,开始执行Pod调度逻辑.调度成功后将Pod绑 ...
- Linux 系统化学习系列文章总目录(持续更新中)
本页内容都是本人系统化学习Linux 时整理出来的.这些文章中,绝大多数命令类内容都是翻译.整理man或info文档总结出来的,所以相对都比较完整. 本人的写作方式.风格也可能会让朋友一看就恶心到直接 ...
- k8s调度器、预选策略及调度方式
一.k8s调度流程 1.(预选)先排除完全不符合pod运行要求的节点2.(优先)根据一系列算法,算出node的得分,最高没有相同的,就直接选择3.上一步有相同的话,就随机选一个 二.调度方式 1.no ...
- Kubernetes/K8s架构师实战集训营【中、高级班】-2020
下载地址: [中级班] 链接:https://pan.baidu.com/s/1FWAz2V7BPsObixlZyW93sw提取码:mvu0 [高级班] 链接:https://pan.baidu.co ...
- K8S之traefik高级特性
Traefik Traefik是一个用Golang开发的轻量级的Http反向代理和负载均衡器.由于可以自动配置和刷新backend节点,目前可以被绝大部分容器平台支持,例如Kubernetes,Swa ...
- k8s之数据存储-高级存储
PV和PVC 前面已经学习了使用NFS提供存储,此时就会要求用户会搭建NFS系统,并且会在yaml配置nf's,由于k8s支持的存储系统有很多,要求客户全部掌握,显然不现实.为了能够屏蔽底层存储实现的 ...
随机推荐
- according to tld or attribute directive in tag file attribute *** does not accept any expressions
http://stackoverflow.com/questions/13428788/according-to-tld-or-attribute-directive-in-tag-file-attr ...
- shell中括号总结: {}, (), (()), [], [[]]
括号总结 () 单小括号 命令组,括号中的命令将会开一个新的子shell执行 括号中变量不能被剩下脚本使用 命令之间分号隔开 命令和括号之间可以没有空格 命令替换,等同于``反引号 $(xxx)会被替 ...
- 寒假作业第二组P&&Q&&R题解
P的题意是有M份作业,这些作业有不同的截止日期,超过截止日期完成,不同的作业有不同的罚分,求如何完成罚分最低. 首先,从截止日期最长的那个作业到截止日期,这些天数是固定的,所做的就是把这些作业填进这些 ...
- Hive_Hive的数据模型_视图
- 视图是一种虚表,是一个逻辑概念:可以跨越多张表- 视图建立在已有表的基础上,视图赖以建立的这些表称为基表.- 视图可以简化复杂的查询. 创建视图 create view viewName as s ...
- 2.语言概述-JavaScript权威指南笔记
上周三的时候交给老板目前的项目第一个迭代回顾会的总结.原本是以综述性的表述方式写的,交给他之后表示程序员不要长篇大论.总结要分为优点缺点期望等等块,每块列出条目,简明扼要的表达出来.这里也用这种风格. ...
- Strut2 Action的生命周期
一般而言,Action都是放在Spring容器中管理的,我会把属性设为prototype,这样,每一个请求,都会创建一个action对象. 今天碰到一个问题,当我用从一个jsp页面中输入一个属性,比如 ...
- Date-DateFormat-Calendar-Math-regex
一.Date类(java.util) 作用:表示时间的类,精确到毫秒,以GMT 1970年1月1日0点0分0秒起算 构造方法: Data() ---获取当前时间 Date(long ...
- 如何在Android Studio中导入JNI生成的.so库
由于在原来的ADT的Eclipse环境中,用ndk_build工具生成了相应的各个.so库文件之后,eclipse工具就会自动把这些库导入到apk中.而Android Studio目前为止(0.86版 ...
- ArcSDE 10.1 For Windows 创建空间数据库与常见错误_SQL Server
本文是2013年时候参加ESRI竞赛,创建ArcSDE 10.1 for SQL Server时候出问题了,因此写了该文档. 由于一直忙于学习,忘了发布.今天一师弟也遇到同样问题,为此我觉得可能有不少 ...
- Memcache笔记02-telnet操作memcached
telnet操作Memcached 登录到telnet连接到memcached服务: telnet 127.0.0.1 11211 memcached的基本命令: //当telnet登录成功可以看到一 ...