K8S-污点与污点容忍

Taints(污点):避免Pod调度到特定的Node上
Tolerations(污点容忍): 允许Pod调度到持有Taints的Node上

应用场景:
• 专用节点:根据业务线将Node分组管理,希望在默认情况下不调度该节点,只有配置了污点容忍才允许分配
• 配备特殊硬件:部分Node配有SSD硬盘,GPU,希望在默认情况下不调度该节点,只有配置了污点容忍才允许分配
• 基于Taint的驱逐

污点配置:

给node节点添加污点

kubectl taint node [node] key=value:[effect]

其中key=value 是设定一个污点标签

其中[effect] 可取值:
• NoSchedule :一定不能被调度
• PreferNoSchedule:尽量不要调度,非必须配置容忍
• NoExecute:不仅不会调度,还会驱逐Node上已有的Pod

污点容忍配置:

在pod.yaml中添加配置(spec下级,和containers段同级)

tolerations: 
- key: "gpu"  #允许容忍的污点标签key(添加节点污点时指定的)
  operator: "Equal"  #操作符,equal等于
  value: "yes" #允许容忍的污点标签value(添加节点污点时指定的)
  effect: "NoSchedule"  #effect (添加节点污点时指定的)
去掉污点
kubectl taint node [node] key-
例子:
  1. 一共2台node节点,给node1 和 node2 都打上污点。分别指定两个污点标签gpu=yes,disk=ssd,最后查看pod状态和污点状态
kubectl taint node k8s-node1 gpu=yes:NoSchedule
kubectl taint node k8s-node2 disk=ssd:NoSchedule
#创建个pod
kubectl apply -f pod_taint.yaml 
image.png

image.png

上述结果说明,污点配置成功,node1和node2都被打上了污点,当前已无合适的node可分配了。

  1. 如果在特殊情况下,需要污点机器也可以被分配,就要配置污点容忍。 在上面的情况下,如果让node1还能继续被分配,在pod.yaml添加


    image.png

再次创建pod,发现成功分配到了。验证Tolerations


image.png
  1. 最后再去掉这两台node的污点
kubectl taint node k8s-node1 gpu-
#node/k8s-node1 untainted
kubectl taint node k8s-node2 disk-
#node/k8s-node2 untainted
kubectl describe node|grep Taint
Taints:             node-role.kubernetes.io/master:NoSchedule
Taints:             
Taints:             

你可能感兴趣的:(K8S-污点与污点容忍)