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

posted on 2022-08-12 14:44  载波的波  阅读(43)  评论(0编辑  收藏  举报