Administrator
发布于 2026-08-17 / 5 阅读
0
0

第八章.k8s调度器-容忍与污点-1

来源链接:https://www.bilibili.com/video/BV1PbeueyE8V?spm_id_from=333.788.videopod.episodes&vd_source=d8c71ff24a3359a807967fc4b5daa0e4&p=60

1. 污点容忍的引入背景

  • 传统节点亲和性(Node Affinity)是主动吸引特性,仅能实现Pod向符合标签要求的节点调度,无法实现节点对Pod的默认排斥;即使使用软亲和性(Preferred During Scheduling Ignored During Execution),也仅能提升Pod调度到目标节点的权重,无法完全阻止非目标Pod调度到特殊节点
  • 典型场景问题:若集群存在GPU节点用于AI大模型推理,仅通过节点亲和性绑定GPU节点时,无GPU需求的业务(如Nginx、Redis、MySQL等)可能随机调度到GPU节点,占用CPU、内存资源但不消耗GPU,导致GPU任务到来时因CPU/内存不足无法运行
  • 类比交通规则:默认靠右行驶,仅特殊路段标记左行,不需要给所有车主单独下发“靠右行驶”的指令,因此需要一种默认排斥机制,即污点容忍

2. 核心概念定义

  • 污点(Taint):节点上的排斥属性,默认排斥无法容忍该污点的Pod,不参与这类Pod的调度过程,可与容忍配合避免Pod被分配到不合适的节点上
  • 容忍(Toleration):Pod上的配置属性,表示可以容忍特定污点,但不强制将Pod调度到带有该污点的节点,仅代表Pod不会被该污点排斥,具备调度到该节点的可能性
  • 关键特性:容忍污点只是调度的前提条件,最终调度结果仍需经过调度器的预选、优选算法,匹配权重最高的节点才会完成调度,类比相亲场景:污点相当于“睡觉打呼噜声音大”的缺点,容忍该缺点的相亲对象仅代表有进一步沟通的可能,不代表必须结婚

3. 污点(Taint)相关知识

3.1 污点组成格式

污点遵循 <key>=<value>:<effect> 格式,其中value可以为空,与节点标签的格式规则一致

3.2 污点Effect类型

污点的作用类型共3种,对应不同的排斥规则:

Effect类型 作用说明 类比场景
NoSchedule 禁止调度:带该污点的节点完全不参与对应Pod的调度过程,除非Pod配置了匹配的容忍 招聘岗位已满,不再接收新简历投递
PreferNoSchedule 尽可能不调度:不绝对禁止调度,会尽量减少向该节点调度Pod,优秀Pod仍可调度 招聘岗位已满,但优秀人才仍可投递,作为人才储备
NoExecute 不调度+驱离:新Pod禁止调度到该节点,已运行在该节点的Pod如果没有匹配的容忍,会被强制驱逐 公司倒闭,不仅停止招聘,还要让现有员工离职

3.3 污点操作命令

  • 添加污点:kubectl taint <node-name> <key>=<value>:<effect>,单个节点可添加多个污点
  • 查看污点:kubectl describe node <node-name>,在节点描述信息的Taints字段可查看当前节点所有污点
  • 移除污点:在添加污点的命令末尾加-即可;若污点value为空,需写成<key>=: <effect>再加-才能匹配移除

4. 容忍(Toleration)相关知识

  • 容忍需配置在Pod的spec.tolerations字段中,可指定匹配的污点key、value、effect
  • 特殊运算符:若容忍的运算符为Exists,无需指定key、value、effect,代表可以容忍所有污点,即不排斥任何节点的污点规则
  • 典型应用场景:k8s系统核心组件(如kube-proxy)需要每个节点都运行一个副本,因此默认配置了运算符为Exists的容忍,保证Pod可以调度到所有节点,包括带默认污点的master节点

5. 实际案例验证

5.1 master节点的默认污点

  • 通过kubeadm部署的k8s集群,master节点默认自带污点node-role.kubernetes.io/control-plane:NoSchedule,因此默认Pod不会调度到master节点
  • 验证方式:执行kubectl describe node master01,可在Taints字段看到该污点

5.2 移除污点后的调度验证

  1. 执行移除master节点污点的命令后,创建Deployment指定10个副本
  2. 执行kubectl get pod -o wide查看Pod分布,可见Pod均匀调度到master01和node02节点,证明master节点本身具备运行Pod的能力,仅因污点不参与默认调度

5.3 DaemonSet的污点容忍验证

  1. DaemonSet的特性是每个节点有且只有一个对应Pod,默认情况下因master节点有污点,DaemonSet的Pod不会调度到master节点
  2. 移除master节点污点后,创建对应DaemonSet,再次查看Pod分布,可见master01节点也运行了对应的DaemonSet Pod,符合预期

6. 补充说明

  • 污点和容忍是配合使用的机制:污点实现节点的默认排斥,容忍实现Pod的兼容选择,共同完成更灵活的调度规则
  • 污点仅影响调度过程,不影响已运行Pod的网络、存储等能力,仅NoExecute类型的污点会驱逐已运行的不兼容Pod

AI 总结

本视频讲解了Kubernetes调度器中污点(Taint)与容忍(Toleration)的核心机制:污点是节点的默认排斥属性,通过NoSchedule、PreferNoSchedule、NoExecute三类Effect实现不同强度的排斥规则,解决节点亲和性仅支持主动吸引、无法实现默认排斥的痛点;容忍是Pod的兼容配置,仅代表Pod不会被对应污点排斥,具备调度到该节点的可能性,最终调度结果仍需经过调度器预选、优选流程确定。该机制常用于GPU节点、master节点等特殊场景的资源管控,系统核心组件通常配置容忍所有污点的规则,保证核心能力可在所有节点正常运行。


评论