Taints 与 Tolerations
节点亲和性是描述Pods如何分配到一个或一组节点的策略,亲和性的相关资料可以参考Kubernetes中的亲和性与反亲和性。与亲和性规则不同, Taints 描述节点拒绝一个或一组Pods的策略。其实现原理为首先通过kubectl taint命令为Node定义一些瑕疵,然后在Pod的描述文件中指定它的容忍度,即不能够容忍哪些瑕疵,这样在调度的时候Pod将不会被调度到哪些有瑕疵的Node上。可以看下图,只有Taint和Toleration匹配的时候,Pod才会调度到对应的节点上。

1. 设置与解除Taint
Taints包含一个key、value和effect,格式为<key>=<value>:<effect>。
为Node设置taint的命令如下:
kubectl taint nodes node1 key=value:NoSchedule
执行这个命令后,除非Pod具有相应的toleration,否则不会被调度到node1上。
通过下面的命令,可以删除这个策略。
kubectl taint nodes node1 key:NoSchedule-
taint支持的effect包括:
- NoSchedule 表示不能容忍taint的Pod不会被调度到这个节点,属于刚性的限制
- PreferNoSchedule 与上一条相同的效果,但是是柔性的限制,如果集群中没有其他更合适的Node,则会调度到这个节点
- NoExcute 上两条只是影响调度,这条还会对正在运行的Pod产生影响,如果在节点上增加一条 taint,那么如果已经运行的Pod没有设置对应的toleration,则会被立即驱逐
2. 定义 Toleartions
为Pod定义toleration的方法如下:
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
tolerations:
- key: "key"
operator: "Exists"
effect: "NoSchedule"
上面两个例子表示如果某个Node存在key=value的瑕疵或者存在key的瑕疵,Pod将不会调度到这样的节点。effect也有三个选项:
- NoSchedule
- NoExecute
- PreferNoScheduled,软性的限制,避免向有瑕疵的节点调度,但不是强制条件
在书写tolerations的时候有两种特殊情况:一是key为空operator为Exists,这种情况匹配所有的keys、values和effects,即对所有的瑕疵都无法忍受;二是effect为空,匹配所有key的瑕疵。
可以向单个Pod和Node增加多个tolerations和taints,Kubernetes采用类似过滤器的方式进行处理,首先遍历Node上的Taints,并与Pod的tolerations做匹配,如果有匹配的项目则忽略,最后根据剩下为匹配到的taints做判断:
- 如果至少有一个未匹配到的taints的效果是NoSchedule,则Pod不会被调度到Node上
- 如果仅有一个未匹配到的taints的效果是PreferNoSchedule,则尽量不向这个Node调度
- 如果至少有一个未匹配到的taints的效果是NoExecute,则Pod不会被调度到Node上,已经在Node上运行的Pod会被驱逐。通常,一个NoExcute添加到节点后,不能容忍的Pod会被立即驱逐,可以通过
tolerationSeconds设置延时驱逐。
3. 例子
Taints和tolerations是避免Pods部署到Node,以及从Node中驱离Pod的灵活方法,有一些应用场景:
3.1 调度场景
控制Pod的调度。例如专用节点 Dedicated Nodes ,对于Kubeadm创建的集群,默认Master节点是tainted,即普通的Pod不会部署到这个节点;例如特殊硬件的节点(GPU),只希望需要使用GPU的应用部署到上面;在节点出问题时,对节点上的Pod进行驱逐(alpha特性)
3.2 配置节点故障后Pod重新调度的时间
例如下面的配置文件,对于notReady和unreachable状态的节点,其上的Pod等待300秒,如果仍未恢复,则会停止执行。
...
tolerations:
- effect: NoExcute
key: node.alpha.kubernetes.io/notReady
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.alpha.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
在1.12版本中 TaintNodesByCondition 特性已经提升为 beta。

参考资料
Taints 与 Tolerations的更多相关文章
- K8S调度之Taints and Tolerations
Taints和Tolerations(污点和容忍) 在<K8S之节点亲和性>中,我们说到的的NodeAffinity节点亲和性,是在pod上定义的一种属性,使得Pod能够被调度到某些nod ...
- Taints和Tolerations
Taints和Tolerations和搭配使用的,Taints定义在Node节点上,声明污点及标准行为,Tolerations定义在Pod,声明可接受得污点. 可以在命令行为Node节点添加Taint ...
- Kubernetes之Taints与Tolerations 污点和容忍
NodeAffinity节点亲和性,是Pod上定义的一种属性,使Pod能够按我们的要求调度到某个Node上,而Taints则恰恰相反,它可以让Node拒绝运行Pod,甚至驱逐Pod. Taints(污 ...
- 从相亲的角度理解 K8S 的 Node Affinity, Taints 与 Tolerations
这是昨天晚上阅读园子里的2篇 k8s 博文时产生的想法,在随笔中记录一下. 这2篇博文是 K8S调度之节点亲和性 与 K8S调度之Taints and Tolerations . 如果我们把 node ...
- Taints和Tolerations -- 污点- 容忍
1.taint 定义在node上,排斥pod 2.toleration定义在pod中,容忍pod 3.可以在命令行为Node节点添加Taints: kubectl taint nodes node1 ...
- Taints和Tolerations联用,将pod部署到k8s的master节点
一般,k8s的master为了保持高性能,在这个主节点上只运行一些管理必须的POD. 如果我们限于资源,或是一些监控类的pod要部署到master节点呢? 昨天遇到这个问题,按网上通用的方法,未解决, ...
- kubernetes进阶(02)kubernetes的node
一.Node概念 Node是Pod真正运行的主机,可以物理机,也可以是虚拟机. 为了管理Pod,每个Node节点上至少要运行container runtime(比如docker或者rkt). kube ...
- kubernetes入门(07)kubernetes的核心概念(4)
一.pod 二.Volume volume可以为容器提供持久化存储,比如 三.私有镜像 在使用私有镜像时,需要创建一个docker registry secret,并在容器中引用.创建docker r ...
- K8S 高级调度方式
可以使用高级调度分为: 节点选择器: nodeSelector.nodeName 节点亲和性调度: nodeAffinity Pod亲和性调度:PodAffinity Pod反亲和性调度:podAnt ...
随机推荐
- shell界面执行mysql命令
mysql -uroot -poRcl_123 -Dsnsdb_test -e "select host from user;"
- awk命令的用法实战
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAn8AAADvCAIAAAAM1SXGAAAgAElEQVR4nO2dz8s125XXHx9oTXMHUZ
- docker compose启动服务超时重启记录
一.停docker systemctl stop docker 然后ps -aux grep docker发现有些docker进程还是存在,此时强杀存在的docker进程:ps -aux|grep d ...
- Collection接口的常用方法
[添加功能] boolean add(Object obj); //添加一个元素. boolean addAll(Collection c); //添加一个集合的元素(在后面追加). [删除功能] v ...
- input按钮去掉默认样式
border: 1px solid transparent; //自定义边框 outline: none; //消除默认点击蓝色边框效果
- TCP/UDP 协议,和 HTTP、FTP、SMTP,区别及应用场景
一.OSI 模型 OSI 模型主要作为一个通用模型来做理论分析,而TCP/IP 协议模型是互联网的实际通讯协议,两者一般做映射分析,以下不做严格区分和声明(好吧,比较懒): OSI 整个模型层次大致可 ...
- 009 spring boot中文件的上传与下载
一:任务 1.任务 文件的上传 文件的下载 二:文件的上传 1.新建一个对象 FileInfo.java package com.cao.dto; public class FileInfo { pr ...
- 070 DStream中的transform和foreachRDD函数
1.说明 DStream的API不够满足使用的时候,可以使用这两个函数,将dstream转换为rdd,然后进行操作 2.transform transform:将DStream的操作转换为RDD的操作 ...
- PAT (Basic Level) Practise - 成绩排名
1004. 成绩排名 题目链接:https://www.patest.cn/contests/pat-b-practise/1004 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓 ...
- php分词工具scws
分词工具 sphinx 支持php版本5.2.2~6.0因此选用scws 文档地址 http://www.xunsearch.com/scws/docs.php#instscws 简单的demo ...