K8s 调度|Taint/Toleration
Q1:简述 kube-scheduler 调度流程
A:分为两阶段:预选 (Predicate) → 优选 (Priority)
- 预选:过滤掉不满足条件节点(资源不足、污点不匹配、端口占用等),筛出候选节点。
- 优选:对候选节点打分,分数最高的节点,完成 Pod 绑定。
Q2:什么是污点 Taint?作用?
A:污点打在Node 节点上,用来排斥 Pod。
节点加污点后,除非 Pod 拥有对应的容忍,否则 Pod 不会调度到这个节点。
常用于:master 节点禁止业务 Pod 部署、专属节点隔离、节点故障驱逐。
Q3:污点三种效果(effect)
A:
NoSchedule:不调度,已在节点上的 Pod 不受影响。PreferNoSchedule:尽量不调度,能容忍就还可以调度。NoExecute:不调度 + 驱逐节点上已存在的、不能容忍该污点的 Pod。
Q4:容忍 Toleration?和 Taint 关系
A:容忍写在Pod 上,让 Pod 可以忽略节点上对应的污点。
一句话:污点是节点 “拒绝 Pod”,容忍是 Pod “不怕这个污点”。
容忍只是允许调度,不代表 Pod 一定会调度到带这个污点的节点。
Q5:节点亲和性 NodeAffinity
A:Pod 上配置,根据节点标签选择能不能调度到该节点。
分两类:
- requiredDuringSchedulingIgnoredDuringExecution:硬亲和,不满足条件不能调度。
- 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 / 驱逐优先级不一样:
- Guaranteed:limits 和 requests 相等,优先级最高,最后被驱逐
- Burstable:设置了部分 requests,中间优先级
- BestEffort:没设置 requests/limits,优先级最低,最先被驱逐
Q14:requests 和 limits 作用
A:
- requests:调度器分配资源依据,调度时判断节点是否有足够资源。
- limits:容器资源上限,超过会被限流 / 杀死,防止资源抢占。
浙公网安备 33010602011771号