您的位置:首页 > 大数据 > 人工智能

Taints 与 Tolerations

2018-10-09 11:27 519 查看

节点亲和性是描述Pods如何分配到一个或一组节点的策略,与之相反 Taints 描述节点拒绝一个或一组Pods的策略。其实现原理为首先通过

kubectl taint
命令为Node定义一些瑕疵,然后在Pod的描述文件中指定它的容忍度,即不能够容忍哪些瑕疵,这样在调度的时候Pod将不会被调度到哪些有瑕疵的Node上。

1. 设置与解除Taint

kubectl taint nodes node1 key=value:NoSchedule

这个命令的效果是任何Pod不会被调度到节点node1上,除非这个Pod具有相应的toleration。

通过下面的命令,可以删除这个策略。

kubectl taint nodes node1 key:NoSchedule-

2. 定义 Toleartions

tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
tolerations:
- key: "key"
operator: "Exists"
effect: "NoSchedule"

上面两个例子表示如果某个Node存在

key=value
的瑕疵或者存在
key
的瑕疵,Pod将不会调度到这样的节点。effect共有三个选项:

  • NoSchedule
  • NoExecute
  • PreferNoScheduled,软性的限制,避免向有瑕疵的节点调度,但不是强制条件

在书写tolerations的时候有两种特殊情况:一是key为空operator为Exists,这种情况匹配所有的keys、values和effects,即对所有的瑕疵都无法忍受;二是effect为空,匹配所有key的瑕疵。

可以向单个Pod和Node增加多个tolerations和taints,Kubernetes采用类似过滤器的方式进行处理,首先遍历Node上的Taints,并与Pod的tolerations做匹配,如果有匹配的项目则忽略,最后根据剩下为匹配到的taints做判断:

  • 如果至少有一个未匹配到的taints的效果是NoSchedule,则Pod不会被调度到Node上
  • 如果仅有一个未匹配到的taints的效果是PreferNoSchedule,则尽量不向这个Node调度
  • 如果至少有一个未匹配到的taints的效果是NoExecute,则Pod不会被调度到Node上,已经在Node上运行的Pod会被驱逐。通常,一个NoExcute添加到节点后,不能容忍的Pod会被立即驱逐,可以通过
    tolerationSeconds
    设置延时驱逐。

3. 例子

Taints和tolerations是避免Pods部署到Node,以及从Node中驱离Pod的灵活方法,有一些应用场景:

  • 专用节点 Dedicated Nodes
  • 特殊硬件的节点
  • 节点出问题时进行Pod的驱逐(alpha特性)

在1.12版本中 TaintNodesByCondition 特性已经提升为 beta。

参考资料

  1. Kubernetes Taints and tolerations
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: