一、污点配置解析¶
创建一个污点(一个节点可以有多个污点),格式如下
$ 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节点的污点使用了 kubectl 的 get 命令,结合 -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'