一、污点配置解析

创建一个污点(一个节点可以有多个污点),格式如下

$ 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节点上查看污点使用了 kubectlget 命令,结合 -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]]