Taints和Tolerations和搭配使用的,Taints定义在Node节点上,声明污点及标准行为,Tolerations定义在Pod,声明可接受得污点。
可以在命令行为Node节点添加Taints:
kubectl taint nodes node1 key=value:NoSchedule
也可以直接在node的定义中修改annotations:
annotations:
scheduler.alpha.kubernetes.io/taints: '[{"key":"xxx","operator":"Equal","value":"yyy","effect":"NoSchedule"}]'
operator
可以定义为:
- Equal 表示key是否等于value,默认
- Exists 表示key是否存在,此时无需定义value
effect
可以定义为:
- NoSchedule 表示不允许调度,已调度的不影响
- PreferNoSchedule 表示尽量不调度
- NoExecute 表示不允许调度,已调度的在
tolerationSeconds
(定义在Tolerations上)后删除
Node和Pod上都可以定义多个Taints和Tolerations,Scheduler会根据具体定义进行筛选,Node筛选Pod列表的时候,会保留Tolerations定义匹配的,过滤掉没有Tolerations定义的,过滤的过程是这样的:
- 如果Node中存在一个或多个影响策略为
NoSchedule
的Taint,该Pod不会被调度到该Node - 如果Node中不存在影响策略为
NoSchedule
的Taint,但是存在一个或多个影响策略为PreferNoSchedule
的Taint,该Pod会尽量不调度到该Node - 如果Node中存在一个或多个影响策略为
NoExecute
的Taint,该Pod不会被调度到该Node,并且会驱逐已经调度到该Node的Pod实例