此文为学习《Kubernetes权威指南》的相关笔记
学习笔记:
不论是nodeSelector调度方案还是亲和性调度方案,都是为Pod在创建时提供了选择Node的主动性,但是在很多场景中,Node同样需要具备选择自身可部署Pod属性的主动性,Taints和Tolerations(污点和容忍)机制使Node能够主动选择(设置Taints)具备某种属性(带有Tolerations)的Pod,也具备拒绝和驱逐Pod的主动性。
Node在设置Taints后,只有明确声明了Tolerations去容忍这些污点的Pod才有资格被调度在该Node上运行(NoSchedule效果),于此同时,Node可以设置效果是NoExecue的Taints污点,直接驱逐该Node上不具备对应Tolerations的Pod。
K8s调度器处理多个Taint和Toleration的逻辑顺序为,列出节点所有Taint,忽略Pod的Toleration能够匹配的部分,剩下的没有忽略的Taint就是对Pod的效果,几种特殊情况如下:
- 剩余效果中存在effet=NoSchedule:Pod一定不会被调度到该Node(硬限制)
- 剩余效果中不存在NoSchedule,但有PreferNoSchedule效果:尽量不把Pod调度到该Node(软限制)
- 剩余效果存在effect=NoExecute:未调度Pod一定不会调度(硬限制)+已调度Pod停止运行(驱逐)
- Pod中定义了对于NoExecute效果的容忍,同时包含了tolerationSeconds的值:Pod运行到时间才被驱逐
这种机制的引入使K8s进一步提升了调度上的灵活性
在实例之前,尝试查看当前节点是否包含Taints:
使用kebectl describe node <node-name> 查看节点信息
# kubectl describe node miwifi-r4cm-srv
......
Taints: node-role.kubernetes.io/master:NoSchedule......
可以看到,K8s集群的Master节点上原生地带有一个Taint,这个污点标志了这个节点是Master节点,污点效果是NoSchedule:不调度,所有不包含对应容忍项的Pod在创建后都不会被调度到这个节点上,K8s正是通过这种方式让Master节点默认不作为工作节点承担工作任务。
删除节点Taints的方式与删除Labels的方式相似:
# kubectl taint nodes <node-name> <taint-key>-
删除Master节点的这个污点之后,Master节点同样可以作为工作节点加入调度器的考虑范围
1、给Node添加Taints信息
命令格式: # kubectl taint nodes <