污点和容忍度
作者:互联网
污点:主体是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节点
节点污点
三种类型:
- NoSchedule:不能容忍此污点的新Pod对象不可调度至当前节点,属于强制型约束关系,节点上现存的Pod对象不受影响。
- PreferNoSchedule:NoSchedule的柔性约束版本,即不能容忍此污点的新Pod对象尽量不要调度至当前节点,不过无其他节点可供调度时也允许接受相应的Pod对象。节点上现存的Pod对象不受影响。
- NoExecute:不能容忍此污点的新Pod对象不可调度至当前节点,属于强制型约束关系,而且节点上现存的Pod对象因节点污点变动或Pod容忍度变动而不再满足匹配规则时,Pod对象将被驱逐。
污点设置:
kubectl taint nodes node2 test=slave:NoSchedule
撤销污点:
kubectl taint nodes node2 test:NoSchedule-
pod容忍度
当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的集群中,当某种条件为真时,节点控制器会自动给节点添加一个污点。包括如下:
- node.kubernetes.io/not-ready:节点未准备好。这相当于节点状态 Ready 的值为 "False"。
- node.kubernetes.io/unreachable:节点控制器访问不到节点. 这相当于节点状态 Ready 的值为 "Unknown"。
- node.kubernetes.io/out-of-disk:节点磁盘耗尽。
- node.kubernetes.io/memory-pressure:节点存在内存压力。
- node.kubernetes.io/disk-pressure:节点存在磁盘压力。
- node.kubernetes.io/network-unavailable:节点网络不可用。
- node.kubernetes.io/unschedulable: 节点不可调度。
- node.cloudprovider.kubernetes.io/uninitialized:如果 kubelet 启动时指定了一个 "外部" 云平台驱动, 它将给当前节点添加一个污点将其标志为不可用。在 cloud-controller-manager 的一个控制器初始化这个节点后,kubelet 将删除这个污点。
daemonset 容忍度的添加
DaemonSet 控制器自动为所有守护进程添加如下 NoSchedule 容忍度(不同版本有差别)以防 DaemonSet 崩溃:
- node.kubernetes.io/memory-pressure
- node.kubernetes.io/disk-pressure
- node.kubernetes.io/out-of-disk (只适合关键 Pod)
- node.kubernetes.io/unschedulable (1.10 或更高版本)
- node.kubernetes.io/network-unavailable (只适合主机网络配置)
添加上述容忍度确保了向后兼容,您也可以选择自由向 DaemonSet 添加容忍度
另外:在集群运行的过程中当节点由于资源的紧缺,会出现集群自动将资源紧缺的节点标记污点,让无法忍受的pod自动剥离该node
标签:node,kubernetes,io,容忍度,污点,Pod,节点 来源: https://www.cnblogs.com/ymei/p/13691983.html