前面的调度方式都是站在pod的⻆度上,通过在pod上添加属性,来确定pod是否要调度到指定的node上,其实我们也可以站在node的⻆度上,通过在node上添加污点属性,来决定是否允许pod调度过来。node被设置上污点以后,就和pod之间存在了一种相互排斥的关系,进而拒绝pod调度进来,甚至可以将已经存在的pod驱逐出去。

污点的格式:key:污点,key和value是污点的标签,目前支持如下三个污点:

(1)PreferNoSchedule:尽量避免调度(软限制),除非没有其他节点可调度

(2)NoSchedule:拒绝调度(硬限制),但不会影响当前已经存在的pod

(3)NoExecute:拒绝调度,同时也会将节点上已经存在的pod清除(尽量不要设置,会导致Pod异常)

提示:如果通过定向调度的方式去创建Pod,那么定向调度的优先级要高于污点。

使用kubectl设置和去除污点的命令实例如下:

设置污点
kubectl taint nodes worker01 key:污点

去除污点
kubectl taint nodes worker01 key:污点-

去除所有污点

kubectl taint nodes worker01 key-

1 Pod 污点之 PreferNoSchedule

实验准备:

(1)为了演示污点的效果更加明显,暂时停止worker02节点,将worker02节点关机即可,关机后验证节点状态。

# kubectl get nodes
  ...
  worker02   NotReady

(2)将前边案例配置文件中定向调度删除后在进行创建,否则看不到效果。

vim deploy_nginx.yml

(3)为worker01设置污点,名称为:worker01:PreferNoSchedule

[root@master01 ~]# kubectl taint node worker01 worker01:PreferNoSchedule

查看污点信息

[root@master01 ~]# kubectl describe node worker01 | grep Taints Taints: worker01:PreferNoSchedule

创建Pod验证
[root@master01 ~]# kubectl create -f deploy_nginx.yml

查看Pod所在节点健康状态
[root@master01 ~]# kubectl get pod -n test -o wide

删除PreferNoSchedule污点
[root@master01 ~]# kubectl taint node worker01 worker01:PreferNoSchedule-

2 Pod 污点之 NoSchedule

设置worker01污点为:worker01:NoSchedule

[root@master01 ~]# kubectl taint node worker01 worker01:NoSchedule
查看污点信息  
[root@master01 ~]# kubectl describe node worker01 | grep Taints
Taints:             worker01:NoSchedule
创建Pod
[root@master01 ~]# kubectl create -f deploy_nginx.yml
查看Pod所在节点健康状态
[root@master01 ~]# kubectl get pod -n test -o wide
 #提示:可以发现当前的pod状态为Pending(挂起状态)
删除deploy
[root@master01 ~]# kubectl delete -f deploy_nginx.yml

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐