11.3、污点和容忍(Taints)
11.3、污点和容忍(Taints)
5.4.3 污点和容忍
一、污点(Taints)
前面的调度方式都是站在Pod的角度上,通过在Pod上添加属性,来确定Pod是否要调度到指定的Node上,其实我们也可以站在Node的角度上,通过在Node上添加****污点属性,来决定是否允许Pod调度过来。
Node被设置上污点之后就和Pod之间存在了一种相斥的关系,进而拒绝Pod调度进来,甚至可以将已经存在的Pod驱逐出去。
污点的格式为:key=value:effect
, key和value是污点的标签,effect描述污点的作用,支持如下三个选项:
PreferNoSchedule:kubernetes将尽量避免把Pod调度到具有该污点的Node上**,除非没有其他节点可调度
NoSchedule:kubernetes将不会把Pod调度到具有该污点的Node上,但不会影响当前Node上已存在的Pod
NoExecute:kubernetes将不会把Pod调度到具有该污点的Node上,**同时也会将Node上已存在的Pod驱离
使用kubectl设置和去除污点的命令示例如下:
1 | # 设置污点 |
接下来,演示下污点的效果:
- 准备节点node1(为了演示效果更加明显,暂时停止node2节点)
- 为node1节点设置一个污点:
tag=heima:PreferNoSchedule
;然后创建pod1( pod1 可以 ) - **修改为node1节点设置一个污点: **
tag=heima:NoSchedule
; 然后创建pod2( pod1 正常 pod2 失败 ) - **修改为node1节点设置一个污点: **
tag=heima:NoExecute
; 然后创建pod3 ( 3个pod都失败 )
1 | # 为node1设置污点(PreferNoSchedule) |
查看节点污染:
tag=heima:PreferNoSchedule 正常运行
tag=heima:NoSchedule 已经存在的正常运行 不存在的无法创建
tag=heima:NoExecute 不能创建且已经存在的会变成pending状态
小提示:
- 使用kubeadm搭建的集群,默认就会给master节点添加一个污点标记**,所以pod就不会调度到master节点上.**
二、容忍(Toleration)
上面介绍了污点的作用,我们可以在node上添加污点用于拒绝pod调度上来,但是如果就是想将一个pod调度到一个有污点的node上去,这时候应该怎么做呢?这就要使用到容忍。
污点就是拒绝,容忍就是忽略,Node通过污点拒绝pod调度上去,Pod通过容忍忽略拒绝
下面先通过一个案例看下效果:
- 上一小节,已经在node1节点上打上了
<span class="ne-text">NoExecute</span>
的污点,此时pod是调度不上去的 - 本小节,可以通过给pod添加容忍,然后将其调度上去
①、添加容忍
当前已有污点
1 | # 查看容忍 |
创建pod-toleration.yaml,内容如下
1 | apiVersion: v1 |
1 | # 添加容忍之前的pod |
添加NoExecute容忍前与容忍后状态
下面看一下容忍的详细配置:
1 | kubectl explain pod.spec.tolerations |