K8s 调度|Taint/Toleration

Q1:简述 kube-scheduler 调度流程

A:分为两阶段:预选 (Predicate) → 优选 (Priority)

  1. 预选:过滤掉不满足条件节点(资源不足、污点不匹配、端口占用等),筛出候选节点。
  2. 优选:对候选节点打分,分数最高的节点,完成 Pod 绑定。

Q2:什么是污点 Taint?作用?

A:污点打在Node 节点上,用来排斥 Pod。
节点加污点后,除非 Pod 拥有对应的容忍,否则 Pod 不会调度到这个节点。
常用于:master 节点禁止业务 Pod 部署、专属节点隔离、节点故障驱逐。

Q3:污点三种效果(effect)

A:

  1. NoSchedule:不调度,已在节点上的 Pod 不受影响。
  2. PreferNoSchedule:尽量不调度,能容忍就还可以调度。
  3. NoExecute:不调度 + 驱逐节点上已存在的、不能容忍该污点的 Pod。

Q4:容忍 Toleration?和 Taint 关系

A:容忍写在Pod 上,让 Pod 可以忽略节点上对应的污点。

一句话:污点是节点 “拒绝 Pod”,容忍是 Pod “不怕这个污点”。
容忍只是允许调度,不代表 Pod 一定会调度到带这个污点的节点。

Q5:节点亲和性 NodeAffinity

A:Pod 上配置,根据节点标签选择能不能调度到该节点。
分两类:

  1. requiredDuringSchedulingIgnoredDuringExecution:硬亲和,不满足条件不能调度。
  2. preferredDuringSchedulingIgnoredDuringExecution:软亲和,优先调度到满足条件节点,没有的话可以选其他节点。

IgnoredDuringExecution:调度之后节点标签变了,不会驱逐已经运行的 Pod。

Q6:Pod 亲和性 PodAffinity / Pod 反亲和 PodAntiAffinity

A:

  • PodAffinity:希望 Pod 和某些已存在 Pod 在同一拓扑域(同节点 / 同机房)。比如应用和缓存放一起降低延迟。
  • PodAntiAffinity:不要和某些 Pod 放一起。高可用场景,把多个副本打散到不同节点,避免单点故障。
    同样分硬策略、软策略。

Q7:拓扑域 topologyKey 是什么?

A:用来定义拓扑范围,比如 kubernetes.io/hostname(节点级别)、区域、机房。Pod 亲和 / 反亲和就是基于这个 key 划分范围。

Q8:Taint 和 NodeAffinity 核心区别

A:

  • Taint:节点主动拒绝 Pod,拒绝逻辑在节点。
  • NodeAffinity:Pod 主动挑选节点,挑选逻辑在 Pod。

Q9:节点压力污点(node.kubernetes.io/pressure)

A:当节点磁盘、内存、PID 资源压力过高,K8s 自动给节点打上污点,驱逐 Pod,保护节点稳定性。对应NoExecute。

Q10:调度失败,Pod 处于 Pending,如何区分是污点问题还是亲和性问题?

A:kubectl describe pod 看事件,事件会明确提示:

  • 污点:Taints 和 tolerations 不匹配
  • 亲和性:NodeAffinity 不满足 / PodAntiAffinity 冲突

Q11:什么是节点选择器 nodeSelector?

A:简单版节点亲和,基于节点标签做硬匹配。只能简单等于匹配,不支持复杂逻辑,功能弱于 NodeAffinity。

Q12:什么是抢占(Preemption)?

A:高优先级 Pod 调度时,没有可用节点,调度器会驱逐低优先级 Pod,腾出资源来跑高优先级 Pod。

Q13:QoS 服务质量(调度 & 驱逐相关,常一起问)

A:Pod QoS 三类,节点资源紧张时,OOM / 驱逐优先级不一样:

  1. Guaranteed:limits 和 requests 相等,优先级最高,最后被驱逐
  2. Burstable:设置了部分 requests,中间优先级
  3. BestEffort:没设置 requests/limits,优先级最低,最先被驱逐

Q14:requests 和 limits 作用

A:

  • requests:调度器分配资源依据,调度时判断节点是否有足够资源。
  • limits:容器资源上限,超过会被限流 / 杀死,防止资源抢占。
posted @ 2026-09-20 11:12  JacobJacob  阅读(12)  评论(0)    收藏  举报