一、污点配置解析¶
创建一个污点(一个节点可以有多个污点),格式如下
$ kubectl taint nodes NODE_NAME TAINT_KEY=TAINT_VALUE:EFFECT
创建一个污点(一个节点可以有多个污点),示例如下
$ kubectl taint nodes k8s-node01 ssd=true:PreferNoSchedule
EFFECT规则如下:
- NoSchedule:禁止调度到该节点,已经在该节点上的Pod不受影响
- NoExecute:禁止调度到该节点,如果不符合这个污点,会立马被驱逐(或在一段时间后)
- PreferNoSchedule:尽量避免将Pod调度到指定的节点上,如果没有更合适的节点,可以部署到该节点
针对NoExecute,我们可以自定义驱逐时间(默认300s),下面配置示例是3600秒:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
tolerationSeconds: 3600
二、污点如何使用¶
污点的使用一般涉及到四个方面,分别是增、删、改、查。
2.1 增¶
在k8s-master01节点上给k8s-node01节点打上污点
$ kubectl taint nodes k8s-node01 ssd=true:NoSchedule
2.2 删¶
这里删除污点涉及两种方式:
第一种基于Key删除:
在k8s-master01节点上给k8s-node01节点删除指定污点
[root@k8s-master01 ~]# kubectl taint nodes k8s-node01 ssd=true:NoSchedule-
node/k8s-node01 untainted
第二种基于Key+Effect删除:
在k8s-master01节点上给k8s-node01节点删除全部污点
[root@k8s-master01 ~]# kubectl taint nodes k8s-node01 ssd-
node/k8s-node01 untainted
小结:第二种方式相对于第一种方式删除范围更大
2.3 改¶
在k8s-master01节点上给k8s-node01节点修改污点,这里注意原来的不删除
[root@k8s-master01 ~]# kubectl taint nodes k8s-node01 ssd=false:PreferNoSchedule --overwrite
node/k8s-node01 modified
2.4 查¶
在k8s-master01节点上以命令的方式查看污点
[root@k8s-master01 ~]# kubectl describe node k8s-node01 | grep Taint
Taints: ssd=false:NoSchedule
在k8s-master01节点上查看污点使用了 kubectl 的 get 命令,结合 -o(或 --output)选项和 go-template 模板来指定输出格式
[root@k8s-master01 ~]# kubectl get node k8s-node01 -o go-template --template '{{.spec.taints}}'
[map[effect:NoExecute key:ssd value:true] map[effect:NoSchedule key:ssd value:true]]