Taint&Toleration机制
利用Taint和Toleration机制,可以优化Pod在集群间的调度,避免Pod被分配到不合适的节点上去。
其背后的原理可以概括为:Kubernetes的Pod都有“洁癖”,如果某个节点被加上了一个Taint(染上污点),那么所有的Pod都不能在该节点上运行。除非某个Pod声明自己能“容忍”这个“污点”,即声明了Toleration,它才可以在该节点上运行。
举一个例子,默认情况下Master节点是不允许运行用户Pod的,为了改变这一事实,给Master节点加上污点:
# kubectl taint nodes master foo=bar:NoSchedule
这时Master节点就会增加一个键值对格式的Taint,即foo=bar:NoSchedule
。NoSchedule表示这个Taint只会在调度新Pod时产生作用,不会影响该节点上已经运行的Pod,哪怕它们没有声明Toleration。
针对Pod,想让它能够“容忍”该污点,可以通过下面方式设置Pod的YAML文件:
apiVersion: v1
Kind: Pod
…
Spec:
tolerations:
- key: "foo"
operator: "Equal"
value: "bar"
effect: "NoSchedule"
该Pod的Toleration的含义是能“容忍”所有键值对为foo=bar
的Taint。其中operator: "Equal"
表示“等于”。
如果节点的Taint只有键没有值,例如:
# kubectl describe node master | grep Taints
Taints: node-role.kubernetes.io/master:NoSchedule
此时需要用operator: "Exists"
(存在)来说明该Pod能够容忍所有以foo
为键的Taint,才能在该节点上运行这个Pod,其YAML配置如下:
apiVersion: v1
Kind: Pod
…
spec:
tolerations:
- key: "foo"
operator: "Exists"
effect: "NoSchedule"
更详细的内容推荐阅读官方文档:Taints and Tolerations | Kubernetes