1,Taint介绍

Taint(污点)和 Toleration(容忍)可以作用于 node 和 pod 上,其目的是优化 pod 在集群间的调度,这跟节点亲和性类似,只不过它们作用的方式相反,具有 taint 的 node 和 pod 是互斥关系,而具有节点亲和性关系的 node 和 pod 是相吸的。另外还有可以给 node 节点设置 label,通过给 pod 设置 nodeSelector 将 pod 调度到具有匹配标签的节点上。Taint 和 toleration 相互配合,可以用来避免 pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个 taint ,这表示对于那些不能容忍这些 taint 的 pod,是不会被该节点接受的。如果将 toleration 应用于 pod 上,则表示这些 pod 可以(但不要求)被调度到具有相应 taint 的节点上。

2,污点

  1. # node打污点的三种类型
  2. kubectl taint nodes node1 key1=value1:NokuSchedule
  3. kubectl taint nodes node1 key2=value2:NoExecute
  4. kubectl taint nodes node1 key=value:PreferNoSchedule
  5. # 查看节点详细信息
  6. kubectl describe node node1
  7. # 删除污点,这里的key可以不用指定value
  8. kubectl taint nodes node1 key:NoSchedule-
  9. # 去除指定key所有的effect:
  10. kubectl taint nodes node1 key-

NoSchedule : 新的不能容忍的pod不能再调度过来,但是老的运行在node上不受影响
NoExecute :新的不能容忍的pod不能调度过来,老的pod也会被驱逐
PreferNoSchedule :pod会尝试将pod分配到该节点

3,容忍

  1. apiVersion: apps/v1Beta1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-deploy
  5. spec:
  6. replicas: 1
  7. selector:
  8. matchLabels:
  9. app: nginx
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx
  14. tolerations:
  15. # 能容忍的污点key
  16. - key: "disktype"
  17. # Equal表示key=value,Exists不等于,表示当值不等于下面value正常
  18. operator: "Equal"
  19. # 值
  20. value: "value"
  21. # effect策略,见上面
  22. effect: "NoSchedule"
  23. # 原始的pod多久驱逐,注意只有effect: "NoExecute"才能设置,不然报错,默认300
  24. tolerationSeconds: 3600
  25. containers:
  26. - name: pod-taints
  27. image: busybox:latest

注意:如果pod打上这个污点,那么这个pod就会分配到这个node,其他pod未打污点无法分配,并且old的pod也被驱赶出这个node