首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Taints 与 Tolerations

节点亲和性是描述Pods如何分配到一个或一组节点的策略,与之相反 Taints 描述节点拒绝一个或一组Pods的策略。其实现原理为首先通过kubectl taint命令为Node定义一些瑕疵,然后在Pod的描述文件中指定它的容忍度,即不能够容忍哪些瑕疵,这样在调度的时候Pod将不会被调度到哪些有瑕疵的Node上。

1. 设置与解除Taint

代码语言:javascript
复制
kubectl taint nodes node1 key=value:NoSchedule

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

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

代码语言:javascript
复制
kubectl taint nodes node1 key:NoSchedule-

2. 定义 Toleartions

代码语言:javascript
复制
tolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoSchedule"
代码语言:javascript
复制
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
下一篇
举报
领券