k8s污点策略与容忍的简单应用
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节点上
测试完毕以后取消污点标签
[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并查看
尽管两个节点都设置了污点标签,但是node-0001上还是创建了pod,因为优先级来说
PreferNoSchdule< NoSchedule <NoExecute
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无法被创建,因为两个节点都设置了不允许被调度的污点策略。
pod设置容忍,即pod能容忍node-0001设置的污点标签app=nginx:NoSchedule以后,pod成功在node-0001上创建
当不指定key时,表示容忍所有的污点key
tolerations:
- operator: "Exists"
当不指定effect值时,表示容忍所有的污点策略
tolerations:
- key: "key"
operator: "Exists"
更多推荐
所有评论(0)