一、污点配置解析

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

$ kubectl taint nodes NODE_NAME TAINT_KEY=TAINT_VALUE:EFFECT

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

$ kubectl taint nodes k8s-node01 ssd=true:PreferNoSchedule

EFFECT规则如下:

  • NoSchedule:禁止调度到该节点,已经在该节点上的Pod不受影响。适用于资源隔离和节点维护的场景。
  • NoExecute:禁止调度到该节点,同时己经运行在该节点上的Pod也会被驱逐(终止并重新调度)。适用于节点故障、紧急维护和故障快速恢复的场景。
  • PreferNoSchedule:类似于NoSchedule,但不是一个硬性限制,调度器会尽量避免将新的Pod调度到这个节点上,但如果其他节点都不满足条件,Pod仍然会被调度到这个节点上。适用于软性资源隔离的场景。

针对NoExecute,我们可以自定义驱逐时间(默认300s),下面配置示例是3600秒:

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

二、污点如何使用

可以使用kubectl给指定的节点添加污点,添加污点需要使用kubectl的taint指令。

命令格式:

kubectl taint node NODE_NAME TAINT_KEY=TAINT_VALUE:EFFECT

污点的使用一般涉及到四个方面,分别是增、删、改、查。

2.1 增

在k8s-master01节点上给k8s-node01节点打上污点

$ kubectl taint nodes k8s-node01 ssd=true:NoSchedule

在k8s-master01节点上添加一个同名不同影响度的污点

$ kubectl taint nodes k8s-node01 ssd=true:PreferNoSchedule

在k8s-master01节点上添加一个不包含 value 的污点

$ kubectl taint nodes k8s-node01 ssd:NoSchedule

同时添加多个污点

$ kubectl taint nodes k8s-node01 taint02=value02:PreferNoSchedule taint03=value03:NoSchedule

同时添加多个节点

$ kubectl taint nodes k8s-node01 k8s-node02  taint02=value02:PreferNoSchedule taint03=value03:NoSchedule

基于label同时添加多个节点污点

$ kubectl taint node -l ssh=true taint02=value02:PreferNoSchedule

同时添加所有节点

$ kubectl taint node taint04=value04:PreferNoSchedule --all

2.2 删

首先查看某个节点的污点列表:

[root@k8s-master01 ~]# kubectl describe node k8s-node01 | grep Taints -A 10

这里删除污点涉及三种方式:

第一种基于Key删除:

在k8s-master01节点上给k8s-node01节点删除全部污点

[root@k8s-master01 ~]# kubectl taint nodes k8s-node01 ssd-

第二种基于Key+Effect删除:

在k8s-master01节点上给k8s-node01节点删除指定污点

[root@k8s-master01 ~]# kubectl taint nodes k8s-node01 ssd:NoSchedule-

第三种基于完整格式删除:

在k8s-master01节点上给k8s-node01节点删除指定污点

[root@k8s-master01 ~]# kubectl taint nodes k8s-node01 ssd=true:NoSchedule-

小结:第一种方式相对于其他方式删除范围更大

2.3 改

在k8s-master01节点上给k8s-node01节点修改污点的value

[root@k8s-master01 ~]# kubectl taint nodes k8s-node01 ssd=false:PreferNoSchedule --overwrite

在k8s-master01节点上给k8s-node01节点修改污点的effect

[root@k8s-master01 ~]# kubectl taint nodes k8s-node01 ssd=false:NoSchedule --overwrite

2.4 查

方式一:通过describe方式查询污点

1、在k8s-master01节点上查看k8s-node01节点的污点

[root@k8s-master01 ~]# kubectl describe node k8s-node01 | grep Taint

2、在k8s-master01节点上查看所有节点的污点

[root@k8s-master01 ~]# k describe node | grep Taints

方式二:通过go-template方式查询污点

1、在k8s-master01节点上查看k8s-node01节点的污点使用了 kubectlget 命令,结合 -o(或 --output)选项和 go-template 模板来指定输出格式

[root@k8s-master01 ~]# kubectl get node k8s-node01 -o go-template --template '{{.spec.taints}}'

2、在k8s-master01节点上查看所有节点的污点

[root@k8s-master01 ~]# kubectl get nodes -o json | jq '.items[].spec.taints'