k8s 污点taint与容忍tolerations
污点
污点是k8s的一种属性,node有污点,哪个pod能容忍这个污点就可以在这个node上部署
1.1 污点组成
key,value及effect 三个元素组成,effect是污点状态
例:key1=value1:NoSchedule
1.2 污点状态
共有三种状态:
NoSchedule:一定不被调度 但是不会驱逐已有的 这个部署 ingress-controller 的时候 有用
PreferNoShedule:尽量不会调度
NoExecute:不仅不会调度,还会驱逐原先的pod,比如像公司招聘,招聘的人多了,把多的那部分人裁掉,常用于更换节点,给几分钟把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,effect要与Node上设置的taint保持一致
operator的值为Exists将会忽略value值
tolerationSeconds 用于描述当 Pod 需要被驱逐时可以在 Pod 上继续保留运行的时间
2.2 容忍所有污点
当不指定 key 值时,表示容忍所有的污点 key
tolerations:
- operator: "Exists"
2.3 容忍所有状态污点
当不指定 effect 值时,表示容忍所有的污点状态
tolerations:
- key: "key"
operator: "Exists"
有多个 Master 存在时,防止资源浪费,可以如下设置(表示k8s将尽量避免将Pod调度到具有该污点的Node上)
kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule
节点亲和性,是 pod 的一种属性(偏好或硬性要求),它使 pod 被吸引到一类特定的节点。Taint 则相反,它使 节点 能够 排斥 一类特定的 pod
Taint 和 toleration 相互配合,可以用来避免 pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个 taint ,这表示对于那些不能容忍这些 taint 的 pod,是不会被该节点接受的。如果将 toleration 应用于 pod 上,则表示这些 pod 可以(但不要求)被调度到具有匹配 taint 的节点上