污点:主体是node,在node上标记特定的键值对,以此来标识该node的特殊属性
容忍度:主体是pod,当pod被调度到有污点的node时,该pod能否容忍node的污点标记
在查看master节点的信息
~]# kubectl describe node master-node | grep Taints
Taints: node-role.kubernetes.io/master:NoSchedule
可以看到master的节点集群在创建时已经被自动标记了taint,保证了创建未经指定容忍度的pod时,不会调度到master节点
三种类型:
污点设置:
kubectl taint nodes node2 test=slave:NoSchedule
撤销污点:
kubectl taint nodes node2 test:NoSchedule-
当node已经设定了污点,通过设置容忍度将pod调度到相应的节点上
示例:
... tolerations: - key: "key" operator: "Equal" value: "value" effect: "NoScheduale" ...
operator: 没指定默认为Equal,当为Equal时value必须指定并且key的值和vaule的值匹配才能执行,当为Exists时可以不写value
此外,空的 key(是指key没有指定,而不是指key为空字符串) 如果再配合operator Exists 就能匹配所有的 key 与 value,也是能容忍所有 node 的所有 Taints,空的 effect 匹配所有的 effect
当配置NoExecute时,pod可以通过设定tolerationSeconds(秒),表示pod可以容忍该节点并在该节点继续运行指定的时间
比如,一个使用了很多本地状态的应用程序在网络断开时,仍然希望停留在当前节点上运行一段较长的时间, 愿意等待网络恢复以避免被驱逐。在这种情况下,Pod 的容忍度可能是下面这样的:
tolerations: - key: "node.kubernetes.io/unreachable" operator: "Exists" effect: "NoExecute" tolerationSeconds: 6000
在k8s的集群中,当某种条件为真时,节点控制器会自动给节点添加一个污点。包括如下:
DaemonSet 控制器自动为所有守护进程添加如下 NoSchedule 容忍度(不同版本有差别)以防 DaemonSet 崩溃:
另外:在集群运行的过程中当节点由于资源的紧缺,会出现集群自动将资源紧缺的节点标记污点,让无法忍受的pod自动剥离该node
原文:https://www.cnblogs.com/fat-girl-spring/p/14950180.html