k8s-部署到master节点【污点(Taint) 与 容忍度(Toleration)】总结
污点与容忍度
污点(Taint) 使节点能够排斥一类特定的 Pod。作用于node
容忍度(Toleration) 是应用于 Pod 上的。容忍度允许调度器调度带有对应污点的 Pod。
容忍度允许调度但并不保证调度:作为其功能的一部分, 调度器也会评估其他参数。
污点和容忍度(Toleration)相互配合,可以用来避免 Pod 被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的 Pod, 是不会被该节点接受的。
污点(Taint)配置
污点主要是配置在节点 node
查看节点污点情况
kubectl describe nodes node2 | grep Taint
kubectl describe nodes 【节点名】 | grep Taint
污点效果:
- PreferNoSchedule :kubernetes 将尽量避免把 Pod 调度到具有该污点的 Node 上,除非没有其他节点可调度
- NoSchedule :kubernetes 将不会把 Pod 调度到具有该污点的 Node 上,但不会影响当前 Node上已存在的Pod
- NoExecute :kubernetes 将不会把Pod 调度到具有该污点的 Node 上,同时也会将 Node 上已存在的Pod驱离
注意 k8s master节点默认污点效果是NoSchedule
node-role.kubernetes.io/master:NoSchedule
给节点配置污点命令如下
kubectl taint nodes 【节点名称】 【自定义key】=【自定义值】:【污点效果:PreferNoSchedule | NoSchedule | NoExecute】
注意:【自定义值】不是必填的
kubectl taint nodes node1 mykey=myvalue:NoSchedule
kubectl taint nodes node1 mykey=:NoSchedule (可以不配置values)
删除点配置的污点命令如下
kubectl taint nodes 【节点名称】 【自定义key】=【自定义值】:【污点效果:PreferNoSchedule | NoSchedule | NoExecute】- 注意减号
kubectl taint nodes node1 mykey=myvalue:NoSchedule-
以污点效果NoExecute为例子,给节点node2添加一个NoExecute效果的污点,节点2部署的Pod会被驱离
kubectl taint nodes node2 mytaintkey=mytaintvalue:NoExecute
给node2配置污点
1 key为mytaintkey
2 值为mytaintvalue
3 污点效果为NoExecute
使用-号(减号)去掉污点
kubectl taint nodes node2 mytaintkey=mytaintvalue:NoExecute-
重新部署node2可以使用
容忍度(Toleration)
例如当前节点 node2的污点配置为mykey=myvalue:NoExecute
可以给Pod配置toleration 来容忍污点
tolerations:
#指定对应的key 与node污点配置中的key一致
- key: "key1"
#运算符 Equal 或 Exists
operator: "Equal"
#指定对应的value 与node污点配置中的value一致 (注意如果有value就需要指定操作符为operator: Equal)
#value可以不配置
value: "value1"
effect: "NoSchedule" #指定对应的效果 与node污点配置中的效果一致
operator: 配置可以选择Equal 或 Exists
- Exists 表示存在key即可
- Equal表示key 和 value要与node配置的一致
重新部署Pod
总结:
要在有污点的节点上部署Pod ,Pod的部署文件中需要配置tolerations
部署到master节点
出于安全考虑,默认配置下Kubernetes不会将Pod调度到Master节点,
master节点默认是配置了污点的
node-role.kubernetes.io/master:NoSchedule
如果要把Pod 部署到 master节点有两种方案
- 1 去掉master的污点配置
- 2 给Pod添加污点容忍
去掉master的污点配置
kubectl taint node note4 node-role.kubernetes.io/master:NoSchedule-
注意note4是master节点
Pod yaml 中使用nodeSelector 选择master节点的label
spec:
nodeSelector: #选择使用master节点
node-role.kubernetes.io/master: ""
containers:
- name: my-quarkus-demo-runtime
image: registry.cn-hangzhou.aliyuncs.com/jimliu/my-quarkus-demo:latest
重新部署后
给Pod添加污点容忍
直接去掉master的污点配置,可能会导致各种Pod都会被部署到master节点上
真实的场景是,只有部分Pod想部署到master上
Pod yaml 中使用tolerations 配置与master一致的key和污点效果
spec:
nodeSelector:
node-role.kubernetes.io/master: ""
tolerations:
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
重新部署后到master节点