k8s 污点taint与容忍tolerations


污点

污点是k8s的一种属性,node有污点,哪个pod能容忍这个污点就可以在这个node上部署

1.1 污点组成

key,value及effect 三个元素组成,effect是污点状态
例:key1=value1:NoSchedule

1.2 污点状态

共有三种状态:
NoSchedule:node节点有污点,pod没有污点属性的时候不会调度
PreferNoShedule:尽量不会调度
NoExecute:不仅不会调度,还会驱逐原先的pod

1.3 给node添加污点

给master添加污点不可调度

kubectl taint nodes master1 node-role.kubernetes.io/master=:NoSchedule

给node节点添加污点尽量不会调度

kubectl taint nodes node6 key1=value1:PreferNoSchedule

1.4 去掉node节点的污点

master去掉污点

kubectl taint nodes master1 node-role.kubernetes.io/master-

node节点去掉污点

kubectl  taint nodes node6 key1:NoSchedule-

1.5 查看节点污点

kubectl describe node node6 | grep Taint

容忍

容忍可以让pod对node节点上的污点容忍,容忍的就可以调度部署到node上,否则不调度。

2.1 容忍yml参数

tolerations:
  - key: "key1"
    operator: "Equal"
    value: "value1"
    effect: "NoSchedule"
    tolerationSeconds: 3600
  - key: "key1"
    operator: "Equal"
    value: "value1"
    effect: "NoExecute"
  - key: "key2"
    operator: "Exists"
    effect: "NoSchedule"

key,vaule,e?ect要与Node上设置的taint保持一致
operator的值为Exists将会忽略value值
tolerationSeconds 用于描述当 Pod 需要被驱逐时可以在 Pod 上继续保留运行的时间

2.2 容忍所有污点

当不指定 key 值时,表示容忍所有的污点 key

tolerations:
- operator: "Exists"

2.3 容忍所有状态污点

当不指定 e?ect 值时,表示容忍所有的污点状态

tolerations:
- key: "key"
  operator: "Exists"

有多个 Master 存在时,防止资源浪费,可以如下设置(表示k8s将尽量避免将Pod调度到具有该污点的Node上)

kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule