文章目录
- 污点与污点容忍
- 1、 污点(taint)
- 2、操作命令
- 3、污点容忍
- 4、污点扩展
污点与污点容忍
1、 污点(taint)
- 污点是节点的属性,用于排斥一类特定的 Pod。
- 通过污点,可以避免 Pod 被调度到不合适的节点上
污点组成
key=value:effect
- key:污点的键。
- value:污点的值(可为空)。
- effect:污点的作用效果。
污点效果(effect):
效果 | 描述 |
---|---|
NoSchedule | 不会将 Pod 调度到具有该污点的节点上。 |
PreferNoSchedule | 尽量避免将 Pod 调度到具有该污点的节点上。 |
NoExecute | 不会将 Pod 调度到具有该污点的节点上,并驱逐节点上已有的 Pod。 |
2、操作命令
- 设置污点
kubectl taint node <节点名称> <污点key>=<value>:<effect>
#示例
kubectl taint node node01 key1=value1:NoSchedule
- 查看污点
kubectl describe node <node-name>
kubectl describe nodes <节点名称> | grep -A 5 Taints
- 删除污点
kubectl taint node <节点名称> <污点key>:<effect>-#示例
kubectl taint node node01 key1:NoSchedule-
3、污点容忍
- 容忍是 Pod 的属性,允许 Pod 被调度到具有匹配污点的节点上。
容忍配置:
在 Pod 的 YAML 文件中的 spec.tolerations
字段进行配置:
spec:tolerations:- operator: Equal|Existskey: <污点key>value: <污点value>effect: NoSchedule|PreferNoSchedule|NoExecutetolerationSeconds: 3600
字段说明:
字段 | 描述 |
---|---|
key | 污点的键,需与节点污点一致。 |
operator | 匹配操作符,Equal (值相等)或 Exists (存在即可,忽略值)。 |
value | 污点的值(operator 为 Equal 时需指定)。 |
effect | 污点的效果,需与节点污点一致。 |
tolerationSeconds | Pod 被驱逐前可在节点上继续运行的时间(仅对 NoExecute 有效)。 |
示例:
apiVersion: v1
kind: Pod
metadata:name: myapp01labels:app: myapp01
spec:containers:- name: with-node-affinityimage: soscscs/myapp:v1tolerations:- key: "check"operator: "Equal"value: "mycheck"effect: "NoExecute"tolerationSeconds: 3600
应用场景
- 专用节点:
- 为某些节点设置污点,确保只有特定 Pod 可以调度到这些节点。
- 示例:GPU 节点仅运行需要 GPU 的任务。
- 节点维护:
- 设置
NoExecute
污点,驱逐节点上的 Pod 以便维护。
- 设置
- 高可用部署:
- 使用
NoSchedule
或PreferNoSchedule
,确保 Pod 分散在不同节点上。
- 使用
示例:
设置污点:
kubectl taint node node01 check=mycheck:NoExecute
查看污点
kubectl describe node node01
创建容忍pod
kubectl apply -f pod-with-toleration.yaml
验证pod步骤
kubectl get pods -o wide
4、污点扩展
污点(Taints)注意事项
-
容忍所有污点 key
- 当不指定
key
值时,使用Exists
操作符可以容忍节点上的所有污点 key。
tolerations: - operator: "Exists"
- 当不指定
-
容忍所有污点作用
- 当不指定
effect
值时,只要污点的key
匹配,无论其作用(如NoSchedule
,PreferNoSchedule
,NoExecute
)是什么,都会被容忍。
tolerations: - key: "key"operator: "Exists"
- 当不指定
-
多 Master 节点设置
- 在有多个 Master 节点的情况下,为了避免资源浪费,可以将 Master 节点设置为
PreferNoSchedule
,这样默认情况下不会调度 Pod 到 Master 节点,但在必要时可以调度。
kubectl taint node Master-Name node-role.kubernetes.io/master=:PreferNoSchedule
- 在有多个 Master 节点的情况下,为了避免资源浪费,可以将 Master 节点设置为
污点应用实例
-
设置 NoExecute 污点
- 当某个 Node 需要更新升级系统组件时,可以先在该 Node 上设置
NoExecute
污点,以驱逐该 Node 上的所有 Pod。
kubectl taint node node01 check=mycheck:NoExecute
- 当某个 Node 需要更新升级系统组件时,可以先在该 Node 上设置
-
临时设置 PreferNoSchedule 污点
- 如果其他 Node 资源不足,可以临时将 Master 节点设置为
PreferNoSchedule
,允许在必要时调度 Pod 到 Master 节点。
kubectl taint node master node-role.kubernetes.io/master=:PreferNoSchedule --overwrite
- 如果其他 Node 资源不足,可以临时将 Master 节点设置为
-
移除污点
- 更新操作完成后,移除之前设置的污点。
kubectl taint node node01 check=mycheck:NoExecute-
节点维护操作
-
查看节点
- 使用
kubectl get nodes
查看集群中的所有节点。
- 使用
-
标记节点为不可调度
- 使用
kubectl cordon <NODE_NAME>
将节点标记为不可调度状态,防止新创建的 Pod 调度到此节点。
kubectl cordon <NODE_NAME>
- 使用
-
驱逐节点上的 Pod
- 使用
kubectl drain <NODE_NAME>
命令驱逐节点上的所有 Pod,并设置节点为不可调度状态。
kubectl drain <NODE_NAME> --ignore-daemonsets --delete-emptydir-data --force
- 参数解释:
--ignore-daemonsets
:忽略 DaemonSet 管理的 Pod。--delete-emptydir-data
:强制删除挂载了本地卷的 Pod。--force
:强制驱逐非控制器管理的 Pod。
- 使用
-
标记节点为可调度
- 使用
kubectl uncordon <NODE_NAME>
将节点标记为可调度状态,允许新 Pod 调度到此节点。
kubectl uncordon <NODE_NAME>
- 使用