Administrator
Administrator
发布于 2025-07-04 / 16 阅读
0
0

kubernetes 污点和容忍

污点的组成结构

污点由以下三部分组成

key=value:effect
key:污点的键(自定义,如 node-type)。
value:污点的值(可选,如 special)。
effect:污点的效果,决定 Pod 如何被影响,可选值:
PreferNoSchedule:尽量避免 Pod 调度到该节点(非强制,调度器会尝试寻找其他节点,但若没有合适节点仍会调度)。
NoSchedule:禁止 Pod 调度到该节点(除非 Pod 有对应的容忍)。
NoExecute:不仅禁止调度,还会驱逐已存在的不满足容忍的 Pod(适用于节点维护、故障处理等场景

查看node节点的污点

[root@k8s-master1-60 ~]# kubectl get node
NAME             STATUS   ROLES    AGE   VERSION
k8s-master1-60   Ready    <none>   72d   v1.30.2
k8s-master2-61   Ready    <none>   72d   v1.30.2
k8s-master3-62   Ready    <none>   72d   v1.30.2
k8s-work1-63     Ready    <none>   72d   v1.30.2
k8s-work2-64     Ready    <none>   72d   v1.30.2

#查看所有节点的污点
[root@k8s-master1-60 ~]# kubectl describe nodes |grep Taints
Taints:             <none>
Taints:             <none>
Taints:             <none>
Taints:             <none>
Taints:             <none>

#查看某个节点的污点
[root@k8s-master1-60 ~]# kubectl describe nodes k8s-master1-60 |grep Taints
Taints:             <none>

污点的管理

添加污点
语法: 其中=value可以省略,相当于添加一个不带value的污点
kubectl taint node <node-name> key<=value>:effect

示例:
[root@k8s-master1-60 ~]# kubectl taint node k8s-master1-60 name=beijia:NoSchedule
node/k8s-master1-60 tainted

查看污点:
[root@k8s-master1-60 ~]# kubectl describe nodes k8s-master1-60 |grep Taints
Taints:             name=beijia:NoSchedule
删除污点
语法:
kubectl taint nodes <node-name> <key><=value>:<effect>-

示例:删除name=beijia:NoSchedule的污点
[root@k8s-master1-60 ~]# kubectl taint node k8s-master1-60 name=beijia:NoSchedule-
node/k8s-master1-60 untainted

验证是否删除污点:
[root@k8s-master1-60 ~]# kubectl describe nodes k8s-master1-60 |grep Taints
Taints:             <none>
将节点暂停调度
暂停调度命令示例:
[root@k8s-master1-60 ~]# kubectl cordon k8s-master1-60 
node/k8s-master1-60 cordoned

查看状态:出现node.kubernetes.io/unschedulable:NoSchedule即为暂停调度
[root@k8s-master1-60 ~]# kubectl describe nodes k8s-master1-60 |grep -C 2 Taints
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Tue, 22 Apr 2025 19:03:53 +0800
Taints:             beijia:NoSchedule
                    node.kubernetes.io/unschedulable:NoSchedule
Unschedulable:      true

恢复节点调度:
[root@k8s-master1-60 ~]# kubectl uncordon k8s-master1-60 
node/k8s-master1-60 uncordoned

查看状态:
[root@k8s-master1-60 ~]# kubectl describe nodes k8s-master1-60 |grep -C 2 Taints
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Tue, 22 Apr 2025 19:03:53 +0800
Taints:             beijia:NoSchedule
Unschedulable:      false
污点容忍
我们想让Pod调度到存在污点的节点上,我们可以使用 spec.tolerations 字段配置污点容忍
tolerations解析:
tolerations:
- key: "beijia"        # 匹配污点的key(必须存在)
  operator: "Equal"  # 匹配方式(Equal表示值需相等,Exists表示无需值)
  value: "prod"     # 匹配污点的value(仅Equal时需要)
  effect: "NoSchedule"  # 匹配污点的effect(可选,不指定则匹配所有effect)

污点容忍规则
污点容忍需要匹配节点的所有污点,节点的污点与 Pod 的容忍度是 多对多匹配关系:
若节点有 多个污点(如 taint1、taint2),Pod 必须配置 所有对应污点的容忍度,才能调度到该节点。
若 Pod 仅容忍其中部分污点,则无法调度(除非节点的某些污点未设置 effect 或 effect 为 NoExecute 且 Pod 满足特殊条件)


评论