节点亲和性是描述Pods如何分配到一个或一组节点的策略,与之相反 Taints 描述节点拒绝一个或一组Pods的策略。其实现原理为首先通过kubectl taint
命令为Node定义一些瑕疵,然后在Pod的描述文件中指定它的容忍度,即不能够容忍哪些瑕疵,这样在调度的时候Pod将不会被调度到哪些有瑕疵的Node上。
kubectl taint nodes node1 key=value:NoSchedule
这个命令的效果是任何Pod不会被调度到节点node1上,除非这个Pod具有相应的toleration。
通过下面的命令,可以删除这个策略。
kubectl taint nodes node1 key:NoSchedule-
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
tolerations:
- key: "key"
operator: "Exists"
effect: "NoSchedule"
上面两个例子表示如果某个Node存在key=value
的瑕疵或者存在key
的瑕疵,Pod将不会调度到这样的节点。effect共有三个选项:
在书写tolerations的时候有两种特殊情况:一是key为空operator为Exists,这种情况匹配所有的keys、values和effects,即对所有的瑕疵都无法忍受;二是effect为空,匹配所有key的瑕疵。
可以向单个Pod和Node增加多个tolerations和taints,Kubernetes采用类似过滤器的方式进行处理,首先遍历Node上的Taints,并与Pod的tolerations做匹配,如果有匹配的项目则忽略,最后根据剩下为匹配到的taints做判断:
tolerationSeconds
设置延时驱逐。Taints和tolerations是避免Pods部署到Node,以及从Node中驱离Pod的灵活方法,有一些应用场景:
在1.12版本中 TaintNodesByCondition 特性已经提升为 beta。