目录
一、前言
在生产环境使用中,有时会遇到一些使用场景需求,当集群中存在多种节点类型的情况,如master节点、ssd硬盘类型的node节点,或者是高计算性能的node节点,这个时候,只想某些节点上只运行指定类型的pod,不想让其它pod调度到这些节点上,则可以使用节点污点(Taint)的方式,配合容忍度(Toleration),实现指定节点只运行特定类型的pod服务。
小结如下:
节点污点(Taint):使节点能够排斥特定的 Pod
容忍度(Toleration):应用于 Pod 上,允许Pod 调度到带有与之匹配的污点的节点上。
污点和容忍度(Toleration)相互配合,可以用来避免 Pod 被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的 Pod,是不会被该节点接受的。
二、节点设置taints
1、设置taint
可以使用命令 kubectl taint 给节点增加一个污点
kubectl taint node [node] key=value[effect]
# [effect] 可取值:
NoSchedule: 一定不能被调度
PreferNoSchedule: 尽量不要调度
NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod
Tips:
当节点维护并驱逐时,节点控制器会在相应的节点添加带有 NoExecute 效应的污点,实现基于污点的驱逐功能,一般来说,用的多的还是NoSchedule和toleration的方式相结合
示例: 设置节点minikube tiant标签,当标签key为master,值为true时,禁止Pod调度到节点上
2、查看taint
kubectl describe node [node] | grep Taints
3、删除taint
# 删除指定effect标签
kubectl taint node [node] key:[effect]-
# 删除指定key所有effect标签
kubectl taint node [node] key-
例: 删除节点taint
三、配置toleration及测试
当节点配置了taint时,如果Pod上没配置对应 tiant 的容忍度配置,Pod将无法调度到节点上
1、没配置tiant时,Pod正常调度
2、配置taint时,不配置容忍度 toleration
Pod将无法正常调度到节点,处于Pending状态
可以查看Pod事件看到,无节点满足调度条件
3、配置tolerations
可以看到Pod正常调度到节点
nginx.yaml增加tolerations字段,文件配置如下
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx-no-toleration
name: nginx-no-toleration
spec:
containers:
- image: nginx
name: nginx-no-toleration
ports:
- containerPort: 80
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
tolerations:
- key: "master"
operator: "Equal"
value: "true"
effect: "NoSchedule"
四、总结
通过污点 taint 和 容忍度 toleration 相结合,可以灵活地实现 Pod 避开某些节点或者将 Pod 从某些节点驱逐。生产环境中比较常用的使用场景是指定专用节点,即节点只给某些指定的服务或用户使用,具体用法如下:
将某些节点专门分配给特定的服务使用,可以给这些节点添加一个污点( kubectl taint nodes nodename dedicated=AppName:NoSchedule
), 然后给对应服务的 Pod 添加一个相对应的 toleration。 拥有上述容忍度的 Pod 就能够被分配到上述专用节点,同时也能够被分配到集群中的其它节点。注意,如果你希望这些 Pod 只能被分配到上述专用节点,那么可以给这些专用节点添加一个和污点类似的 label (例如:dedicated=AppName
),同时,在 Pod 配置中增加节点亲和性要求或使用节点选择 NodeSelector ,实现上述 Pod 只能被分配到添加了 dedicated=AppName
标签的节点上。
以上是基于污点和容忍度的理解及生产中使用的解析
觉得有用的点个收藏和关注吧~