k8s污点策略与容忍的简单应用

1、什么是污点?

污点可认为是节点的黑名单,设置了污点的节点可以不让pod在该节点创建,甚至是将该节点上原有的pod驱逐出去。

2、污点策略有几种

污点策略以下三种

NoSchedule:不会被调度,不影响节点上原有的pod,但是新创建的pod不会调度到该节点上。

PreferNoSchdule:尽量不调度,不影响原有节点上的pod。但是如果没有其他节点可以调度,pod任然会调度到此节点上。

NoExecute:驱逐,新创建的pod不会被调度到该节点上,同时节点上原有的pod会被驱逐。

3、污点策略如何设置与取消?

可以在master节点使用指令:(任意选择一种污点策略)

kubectl  taint node  节点主机名 key=value:NoSchedule/PreferNoSchdule/NoExecute 设置

kubectl taint  node  节点主机名   key-                                        取消

4、污点策略的应用

4.1  NoSchedule污点策略的使用

测试之前查看两个节点均有pod运行,同时均没有对节点设置污点标签

现在对node-0002设置污点策略NoSchedule并使用httpd镜像创建4个pod

[root@matser-0001 test]# kubectl  taint  node  node-0002 for=test:NoSchedule

[root@matser-0001 test]# kubectl  apply  -f  apache.pod.nodeRandom.example.yml

结果httpd镜像启动的4个apache  pod都在node-0001节点上

k8s污点策略与容忍的简单应用_第1张图片

测试完毕以后取消污点标签

[root@matser-0001 test]# kubectl  taint  node node-0002 for-

4.2  PreferNoSchedule污点策略的使用

对node-0001设置尽量不调度标签,对node-0002设置不会被调度标签

[root@matser-0001 test]# kubectl  taint  node  node-0001 for=test:PreferNoSchedule

[root@matser-0001 test]# kubectl  taint  node  node-0002 for=test:NoSchedule

删除所有节点上的pod并查看

重新创建nginx pod并查看

k8s污点策略与容忍的简单应用_第2张图片

尽管两个节点都设置了污点标签,但是node-0001上还是创建了pod,因为优先级来说

PreferNoSchdule< NoSchedule

4.3  NoExecute污点策略的使用

在node-0001及node-0002节点上都创建了pod

现在对node-0002设置NoExecute污点标签

[root@matser-0001 test]# kubectl  taint  node  node-0002  for=test:NoExecute

再次查看发现原来node-0002上面的pod已经被驱逐,为了保证pod副本数量,控制器重新在node-0001上创建对应数量pod;当然去除污点标签以后现有pod并不会重新被调度到原来污点标签存在的节点。只有新创建的pod才会被调度到该节点。

测试完毕以后去除node-0002的污点标签

[root@matser-0001 test]# kubectl  taint  node  node-0002 for-

5 容忍的应用

容忍可以理解为是白名单,为了能将pod调度到有污点的节点上,需要对pod设置容忍。

两个节点都设置了污点策略,只不过污点策略对应的标签不一样

新创建pod,发现pod无法被创建,因为两个节点都设置了不允许被调度的污点策略。

k8s污点策略与容忍的简单应用_第3张图片

pod设置容忍,即pod能容忍node-0001设置的污点标签app=nginx:NoSchedule以后,pod成功在node-0001上创建

k8s污点策略与容忍的简单应用_第4张图片

 k8s污点策略与容忍的简单应用_第5张图片

当不指定key时,表示容忍所有的污点key

tolerations:

- operator: "Exists"

当不指定effect值时,表示容忍所有的污点策略

tolerations:

- key: "key"

  operator: "Exists"

你可能感兴趣的:(kubernetes,运维,docker)