Kubernetes 调度 Node污点/容忍
Node 标记/容忍
还有第三类调度,可以通过给 Node 打一些标记,来限制 Pod 调度到某些 Node 上。Kubernetes 把这些标记称之为 Taints,它的字面意思是污染。(污点=key + value + effect)
那我们如何限制 Pod 调度到某些 Node 上呢?比如说现在有个 node 叫 demo-node,这个节点有问题,我想限制一些 Pod 调度上来。这时可以给这个节点打一个 taints,taints 内容包括 key、value、effect:
- key 就是配置的键值
- value 就是内容
- effect 是标记了这个 taints 行为是什么
目前 Kubernetes 里面有三个 taints 行为:
- NoSchedule 禁止新的 Pod 调度上来
- PreferNoSchedul 尽量不调度到这台
- NoExecute 会 evict 没有对应 toleration 的 Pods,并且也不会调度新的上来。这个策略是非常严格的,大家在使用的时候要小心一点
如上图绿色部分,给这个 demo-node 打了 k1=v1,并且 effect 等于 NoSchedule 之后。它的效果是:新建的 Pod 没有专门容忍这个 taint,那就没法调度到这个节点上去了。
假如有些 Pod 是可以调度到这个节点上的,应该怎么来做呢?这时可以在 Pod 上打一个 Pod Tolerations。从上图中蓝色部分可以看到:在 Pod 的 spec 中填写一个 Tolerations,它里面也包含了 key、value、effect,这三个值和 taint 的值是完全对应的,taint 里面的 key,value,effect 是什么内容,Tolerations 里面也要填写相同的内容。
Tolerations 还多了一个选项 Operator,Operator 有两个 value:Exists/Equal。Equal 的概念是必须要填写 value,而 Exists 就跟上文说的 NodeAffinity 一样,不需要填写 value,只要 key 值对上了,就认为它跟 taints 是匹配的。
上图中的例子,给 Pod 打了一个 Tolerations,只有打了这个 Tolerations 的 Pod,才能调度到绿色部分打了 taints 的 Node 上去。这样的好处是 Node 可以有选择性的调度一些 Pod 上来,而不是所有的 Pod 都可以调度上来,这样就做到了限制某些 Pod 调度到某些 Node 的效果。
小结
我们已经介绍完了 Pod/Node 的特殊关系和条件调度,来做一下小结。
首先假如有需求是处理 Pod 与 Pod 的时候,比如 Pod 和另一个 Pod 有亲和的关系或者是互斥的关系,可以给它们配置下面的参数:
- PodAffinity
- PodAntiAffinity
假如存在 Pod 和 Node 有亲和关系,可以配置下面的参数:
- NodeSelector
- NodeAffinity
假如有些 Node 是限制某些 Pod 调度的,比如说一些故障的 Node,或者说是一些特殊业务的 Node,可以配置下面的参数:
- Node -- Taints
- Pod -- Tolerations
Taint 和 Toleration
Nodeselector和afflinte是需要调度到哪个节点上。污点是不调度到相应的节点上,拒绝某个Pod分配过来。
节点亲和性,是pod的一种属性(偏好或硬性要求),它使pod被吸引到一类特定的节点。Taint 则相反,它使节点能够排斥一类特定的 pod。
Taint 和 toleration 相互配合,可以用来避免 pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个taint ,这表示对于那些不能容忍这些 taint 的 pod,是不会被该节点接受的。如果将 toleration 应用于 pod上,则表示这些 pod 可以(但不要求)被调度到具有匹配 taint 的节点上。
如果你不懂上面枯燥无味的术语没关系,举个例子如下:
当年龄大以后,都会遇到相亲。比如一个女孩相亲一个男孩,会问这个男孩晚上会不会打呼噜,如果打呼噜是容忍不了的。也就是有些男孩特点标签上被贴上了打呼噜的两个字,那么这个女孩就没有可能和这个男孩走在一起。
这就是一个典型的污点和容忍。如果你能容忍这个污点,代表你有可能发生故事,但是不一定会发生故事。这里指的是有发生故事的可能性而且。在k8s里面依然是这个概念。
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 22d v1.19.0
k8s-node1 Ready <none> 22d v1.19.0
k8s-node2 Ready <none> 22d v1.19.0
假设我有一个Pod,它不能容忍任何污点,在其中一个node上面,它有一个污点存在,那么这个pod就不会调度到这个节点上面去了。
如果pod能够容忍这个node污点,难道就一定会运行在该节点吗?不一定吧,也可能在其他节点上运行。(有污点的可以容忍,没有污点的凭什么不可以运行呢,只不过污点的节点不会成为选择的障碍而已)
污点(Taint)
1、污点的组成
使用kubectl taint 命令可以给某个node节点设置污点,Node被设置上污点之后就和Pod之间存在了一种相斥的关系,可以让Node拒绝Pod的调度执行,甚至将已经存在得Pod驱逐出去,每个污点的组成如下:
key=value:effect
每个污点有一个 key 和 value 作为污点标签,其中 value 可以为空,effect描述污点的作用,当前 effect 支持如下三个选项:
NoSchedule:表示 k8s 不会将Pod调度到具有该污点的Node上
PreferNoSchedule:表示 k8s 将尽量避免将Pod调度到具有该污点的Node上
NoExecute:表示 k8s 将不会将Pod调度到具有该污点的Node上,同时会将Node上已有的Pod驱逐出去(相当于结婚了还得离婚)
2、污点的设置、查看和去除
k8s的master节点本身就带有effect类型为NoSchedule的污点,这也是为什么k8s在调度Pod时,不会调度到master节点的原因,具体查看如下:(Kubeadm在安装初始化init的时候给master打上了污点,其余节点是没有该污点的。Master节点主要任务是管理集群的,不应该跑具体的业务应用。所以不允许pod落在master节点)
如果不让pod调度到某个节点,那么可以对该节点打污点
[root@k8s-master ~]# kubectl describe node k8s-master
Taints: node-role.kubernetes.io/master:NoSchedule kubectl taint nodes k8s-master node-role.kubernetes.io/master=:NoSchedule
注意⚠️ : 为master设置的这个taint中, node-role.kubernetes.io/master
为key
, value
为空, effect
为NoSchedule,
如果输入命令时, 你丢掉了=
符号, 写成了node-role.kubernetes.io/master:NoSchedule
, 会报error: at least one taint update is required
错误
过程介绍
# 设置污点
kubectl taint nodes [node name] key1=value:NoSchedule# 节点说明中,查看Taint字段
kubectl describe node [node name]# 去除污点
kubectl taint nodes [node name] key1:NoSchedule-
演示
# 查看当前节点所拥有Pod,kubia-859d757f8c-97zn 在ks-master节点
[root@k8s-master ~]# kubectl get pod -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
kubia-859d757f8c-74g6s 1/1 Running 0 33d 10.244.2.4 k8s-node2 <none> <none> app=kubia,pod-template-hash=859d757f8c
kubia-859d757f8c-97znt 1/1 Running 0 33d 10.244.0.14 k8s-master <none> <none> app=kubia,pod-template-hash=859d757f8c
kubia-859d757f8c-9mjf9 1/1 Running 0 33d 10.244.1.5 k8s-node1 <none> <none> app=kubia,pod-template-hash=859d757f8c# 给k8s-master设置NoExecute污点,使已经落在本节点的Pod被驱赶出去
[root@k8s-master ~]# kubectl taint nodes k8s-master app=kubia:NoExecute
node/k8s-master tainted# 可以看到pod kubia-859d757f8c-97znty因为不能容忍污点,结束了其生命周期
[root@k8s-master ~]# kubectl get pod -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
kubia-859d757f8c-74g6s 1/1 Running 0 33d 10.244.2.4 k8s-node2 <none> <none> app=kubia,pod-template-hash=859d757f8c
kubia-859d757f8c-97znt 0/1 Terminating 0 33d <none> k8s-master <none> <none> app=kubia,pod-template-hash=859d757f8c
kubia-859d757f8c-9mjf9 1/1 Running 0 33d 10.244.1.5 k8s-node1 <none> <none> app=kubia,pod-template-hash=859d757f8c
kubia-859d757f8c-jttrw 1/1 Running 0 46s 10.244.2.5 k8s-node2 <none> <none> app=kubia,pod-template-hash=859d757f8c# 由于有了deployment控制器,那么就会在其他节点被创建
[root@k8s-master ~]# kubectl get pod -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
kubia-859d757f8c-74g6s 1/1 Running 0 33d 10.244.2.4 k8s-node2 <none> <none> app=kubia,pod-template-hash=859d757f8c
kubia-859d757f8c-9mjf9 1/1 Running 0 33d 10.244.1.5 k8s-node1 <none> <none> app=kubia,pod-template-hash=859d757f8c
kubia-859d757f8c-jttrw 1/1 Running 0 79s 10.244.2.5 k8s-node2 <none> <none> app=kubia,pod-template-hash=859d757f8c
如果只有一个node节点,并且有污点,那么新建的Pod会一直处于Pending状态,因为没有可用的Node节点,这时候就可以使用容忍(Toleration)了。
容忍(Toleration)
设置了污点的Node将根据 taint 的 effect:NoSchedule、PreferNoSchedule、NoExecute和Pod之间产生互斥的关系,Pod将在一定程度上不会被调度到 Node 上。但我们可以在 Pod 上设置容忍(Toleration),意思是设置了容忍的 Pod 将可以在有相对应污点的 Node 中存在。
容忍(Toleration)的策略规则如下:
Pod.spec.tolerations
tolerations:
- key: "key1"operator: "Equal"value: "value1"effect: "NoSchedule"tolerationSeconds: 3600
- key: "key1"operator: "Equal"value: "value1"effect: "NoExecute"
- key: "key2"operator: "Exists"effect: "NoSchedule"
其中 key、value、effect 要与Node中的 taint 保持一致
operator 的值为 Exists 将会忽略 value 的值,值为 Equal 时则必须匹配相同的value
tolerationSeconds 用于描述当Pod需要驱逐时可以在Node上继续保留运行的时间(即多少秒后被驱逐)
1、当不指定key时,表示容忍所有污点的key:
tolerations:- operator: "Exists"effect: "NoSchedule"
vim pod3.yamlapiVersion: v1
kind: Pod
metadata:name: pod-3labels:app: nginxtype: web
spec:containers:- name: pod-3image: nginx:1.2.1imagePullPolicy: IfNotPresentports:- name: webcontainerPort: 80tolerations:- operator: "Exists"effect: "NoSchedule"
yaml策略为:可以容忍所有策略为NoSchedule的污点。
[root@k8s-master ~]# kubectl create -f pod3.yaml
pod/pod-3 created
[root@k8s-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
pod-3 1/1 Running 0 9s 10.244.0.107 k8s-master
因为k8s-master为master节点,污点默认为NoSchedule,所以Pod-3被调度到master节点。
2、当不指定 effect 值时,表示容忍所有的污点类型
tolerations:
- key: "key1"value: "value1"operator: "Exists"
Pod容忍测试用例:
vim pod2.yamlapiVersion: v1
kind: Pod
metadata:name: pod-2labels:app: nginxtype: web
spec:containers:- name: pod-2image: nginx:1.2.1imagePullPolicy: IfNotPresentports:- name: webcontainerPort: 80tolerations:- key: "check"operator: "Equal"value: "vfan"
以上策略表示:能够容忍所有key:value为check:vfan的污点类型。
[root@k8s-master ~]# kubectl create -f pod2.yaml
pod/pod-2 created[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-1 0/1 Pending 0 3m25s
pod-2 1/1 Running 0 4s
设置容忍的Pod,可以正常调度到Node节点,而没有设置容忍的,还一直处于Pending状态
3、具体指定 key、value、effect 值
[root@k8s-master ~]# cat torl.yml
apiVersion: v1
kind: Pod
metadata:name: pod-1labels: app: pod-1
spec:containers:- name: pod-1image: nginxtolerations:- key: "app" operator: "Equal" value: "kubia" effect: "NoExecute" tolerationSeconds: 360[root@k8s-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-1 1/1 Running 0 109s 10.244.0.15 k8s-master <none> <none>[root@k8s-master ~]# kubectl describe node k8s-master
Taints: app=kubia:NoExecute
可以看到容忍污点了,那么就可以运行了
最后别忘记将Node污点去除:
[root@k8s-master ~]# kubectl taint nodes k8s-master app=kubia:NoExecute-
node/k8s-master untainted
总结
为什么calio pod在每个节点都有,因为calio有污点容忍,所以在master节点也会创建Pod
[root@k8s-master ~]# kubectl get pod -o wide -n kube-system
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
calico-kube-controllers-5c6f6b67db-q5qb6 1/1 Running 3 22d 10.244.36.81 k8s-node1 <none> <none>
calico-node-6hgrq 1/1 Running 3 22d 192.168.179.102 k8s-master <none> <none>
calico-node-jxh4t 1/1 Running 3 22d 192.168.179.103 k8s-node1 <none> <none>
calico-node-xjklb 1/1 Running 6 22d 192.168.179.104 k8s-node2 <none> <none>nodeSelector:kubernetes.io/os: linuxtolerations:# Make sure calico-node gets scheduled on all nodes.- effect: NoScheduleoperator: Exists# Mark the pod as a critical add-on for rescheduling.- key: CriticalAddonsOnlyoperator: Exists- effect: NoExecuteoperator: Exists
flannel
tolerations:- operator: Existseffect: NoSchedule
一幅图总结如下:
Kubernetes 调度 Node污点/容忍相关推荐
- K8S taint(污点)和tolerations(污点容忍)
文章目录 一.Taint(污点) `1.1概念` `1.2设置污点` 取消污点 二.tolerations(污点容忍) `2.1概念` `2.2示例` 三.Node 和 Pod 对于污点与容忍基本概念 ...
- Kubernetes 调度 - 污点和容忍度详解
当我们使用节点亲和力(Pod 的一个属性)时,它会将Pod吸引到一组节点(作为偏好或硬性要求).污点的行为完全相反,它们允许一个节点排斥一组 Pod. 在 Kubernetes 中,您可以标记(污染) ...
- Kubernetes资源调度之污点与Pod容忍度
Kubernetes资源调度之污点与Pod容忍度 概述 污点是定义在节点之上的键值型属性数据,用于让节点有能力主动拒绝调度器将Pod调度运行到节点上,除非该Pod对象具有接纳节点污点的容忍度.容忍度( ...
- pod的调度策略、定向调度、亲和性调度、污点、容忍污点
前言 环境:centos7.9 docker-ce-20.10.9 kubernetes-version v1.22.6 pod的4种调度策略 默认情况下,一个pod被调度到哪个node节点是由sch ...
- k8s核心技术-Pod(调度策略)_影响Pod调度(污点和污点容忍)---K8S_Google工作笔记0027
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 上面咱们说了亲和性,其实还有一个调度规则,就是反亲和性 ,根据反亲和性进行调度. 所谓的反亲和性就 ...
- K8S污点容忍度调度
污点类型 解释(相当于做标签) kubectl taint nodes node key=value:NoSchedule 添加effect类型污点,新的pod不能调度过来,老的不影响 kubectl ...
- K8S学习之污点容忍
污点:使节点能够排斥一类特定的 pod.Taint 和 toleration 相互配合,可以用来避免pod 被分配到不合适的节点上. 节点亲和性:是pod的一种属性(偏好或硬性要求),它使pod被吸引 ...
- k8s污点容忍度概念介绍
1. 概念介绍 污点(Taint) 应用于node身上,表示该节点有污点了,如果不能忍受这个污点的pod,你就不要调度/运行到这个节点上.如果是不能运行到这个节点上,那就是污点驱逐了. 容忍度(Tol ...
- Kubernetes调度
Overview kube-scheduler 是kubernetes控制平面的核心组件,其默认行为是将 pod 分配给节点,同时平衡Pod与Node间的资源利用率.通俗来讲就是 kube-sched ...
最新文章
- Linux 学习手记(1):命令行BASH的基本操作
- android固定位置滚动文本,android – 滚动文本上方的按钮,按钮固定在底部
- BZOJ2822 [AHOI2012]树屋阶梯
- gitee插件在androidstudio使用踩坑
- 深度学习-Tensorflow2.2-预训练网络{7}-迁移学习基础针对小数据集-19
- 哨兵系列卫星_智利Panguipulli湖的卫星遥感水特征时空变化图
- 台式计算机计量单位,计算机的计量单位以及常见的数据类型
- .net测试篇之单元测试/集成测试神器Autofixture
- Linux内核网络协议栈8—socket监听
- php中连接网页头尾部,网页共用头部和尾部的部分方法
- 控制台或者dll中CreateWindow 出错
- 来料不良,只是采购一人的事吗?
- matlab闰年问题,MATLAB中文上机作业.pdf
- android打印机字体大小,打印自定义文档 | Android 开发者 | Android Developers
- 【无标题】A\Btest
- js柯里化的认识(本文转载自https://www.zhangxinxu.com/wordpress/2013/02/js-currying),觉得很有用就记下了
- 跨境电商平台哪个好?——扬帆际海
- android 4.3 nfc,nfc读卡在android 4.4以上与4.4以下写法的区别
- 【代理工具使用必备知识汇总】:vpn、socks5、代理客户端使用
- 那些工作中一不留神埋的雷
热门文章
- 好分数班级等级C_2020高中分数线(广州|深圳|天津|广州|南宁|泉州|龙岩|武汉|沈阳|青岛|汉中|长春|四平|北京等)...
- 一个屌丝程序员的青春(一三八)
- MySQL 安装失败 Failed to find valid data directory
- 谷粒商城-08-p139-p172
- 记一次流量分析实战——安恒科技(八月ctf)
- 苹果a14和骁龙888哪个厉害 苹果a14相当于骁龙多少
- 新华三笔试题(助力面试)
- 潘金莲给武松的最后一封信
- 2019人工智能前景怎么样,发展趋势好吗?
- 逆向分析:还原 App protobuf 协议加密