K8S集群node节点打标签(labels)可以将pod调度至指定的node节点上,这个很容易理解,关键在于特定场景,比如该node节点是测试环境专用,或者是GPU机器,单纯的打标签这种方式在该节点资源充足的情况下,其他pod还是会被调度到该节点。
这里就需要采用污点(taint)的方式实现。
污点(taint)是设置到节点上的,同时设置了污点后需要在对应的pod设置容忍度(toleration),才能将指定的pod调度到该污点,且不让其他pod调度到该污点。
先查看下通过kubeadm或者云厂商开通的K8S在master上标记的污点信息:
[root@k8s-master-1 ~]# kubectl describe node k8s-master-1 | grep Taints
Taints: node-role.kubernetes.io/master:NoSchedule
可以看到该节点上有污点node-role.kubernetes.io/master:NoSchedule
这里的格式是<key>=<value>:污点类型
污点类型有以下几种:
NoSchedule:
属于强制约束;
不能容忍该污点的新pod不能调度到当前节点;
该节点上现有pod不受影响。
PreferNoSchedule:
属于柔性约束;
不能容忍该污点的新pod尽量不要调度过来,若无其他节点可调度,也可以调度过来;
该节点上现有pod不受影响。
NoExecute:
属于强制约束;
不能容忍该污点的新pod不能调度到当前节点;
该节点上现存pod若不满足容忍条件将被驱逐。
这里给node节点加上一个污点标签,定义key为node-type 值为gpu,类型为NoSchedule:
kubectl taint nodes k8s-worker-3 node-type=gpu:NoSchedule
接下来在yam文件中定义容忍度toleration
将该pod调度到node节点
pod容忍度通过spec.tolerations字段添加
tolerations:
- effect: NoSchedule
key: node-type
operator: Equal
value: gpu
其中effect、key、value的值与node上污点一致;
operator:
Equal 代表key和value之前关系是等于;
Exists 代表value的值可以省略;
默认Equal。
通过污点的方式就可以实现仅让满足需求的pod调度到指定节点,而其他pod无法被调度到该节点,实现node节点专属某一类pod。
删除污点
删除单个键值的指定类型污点
kubectl taint nodes k8s-worker-3 node-type:NoSchedule-
删除单个键值所有污点
kubectl taint nodes k8s-hz12082cluster node-type-
转载请注明:菜鸟运维网 » kubernetes污点