调度与资源管理面试题:调度策略、亲和性、污点容忍、资源配额

本章聚焦 Kubernetes 调度核心面试题,覆盖节点选择、Pod 分布控制、资源隔离与配额管理。你将掌握一套标准化回答框架,应对不同公司对调度能力的差异化考察。

识别问题类型 调度/亲和/污点/配额 匹配核心概念 nodeSelector→亲和→污点 给出配置示例 YAML + 关键参数 说明行为验证 调度日志/Pod状态 关联公司场景 高可用/混部/成本优化
💡 面试策略:调度类问题切忌只背参数。面试官更关注你如何选择策略、处理冲突策略(如亲和与污点共存时谁优先),以及大规模集群下的调度优化经验。

问答卡片 #1:Pod 调度策略与 nodeSelector

面试问题:如何保证 Pod 只调度到特定节点?nodeSelector 与节点亲和性有什么区别?

🎯 面试官考察点

  • 是否掌握基础调度约束的适用场景
  • 能否讲清 nodeSelector(精确匹配 label)与 nodeAffinity(表达式匹配)的粒度差异
  • 是否了解硬性/软性亲和性及实际用法

📐 回答框架

  1. 先明确需求:固定节点 / 批处理 / GPU 专用 → 选择 nodeSelector(静态)或 nodeAffinity(动态)
  2. 解释 nodeSelector 简单但只能做等于匹配,nodeAffinity 支持 In/NotIn/Exists 及权重
  3. 给出典型 YAML 片段并说明调度行为:Pod 未匹配 label 时 pending

💬 简短示例回答
“对于 GPU 任务,先用 nodeSelector 匹配 gpu=true。当需要灵活分组时使用 nodeAffinity 的 requiredDuringScheduling,比如要求节点在 us-west-2a 且 memory>64Gi。如果希望优先调度到 SSD 节点,用 preferredDuringScheduling 加权重 100。”

🔍 可能追问

  • 如果 nodeSelector 和 nodeAffinity 同时出现,哪个优先?
  • 如何实现 Pod 必须运行在 5 台节点的其中 3 台?
  • 调度器在 pending 时如何调试?(kubectl describe pod / scheduler 日志)
⚠️ 避坑提醒:不要混淆 nodeAffinity 与 podAffinity。nodeAffinity 面向节点属性,podAffinity 面向 Pod 拓扑分布。同时,requiredDuringScheduling 必须满足,否则 Pod 无法调度,而 preferredDuringScheduling 只是倾向。

问答卡片 #2:Pod 间亲和性与反亲和性

面试问题:说一说什么场景下你会使用 Pod 亲和性?集群跨可用区部署时如何避免单点故障?

🎯 面试官考察点

  • 对分布式部署中 Pod 分布的控制能力
  • 是否理解 topologyKey 的作用(如 kubernetes.io/hostname 或 zone)
  • 能否结合高可用需求给出反亲和性配置

📐 回答框架

  1. 区分两种需求:让同类 Pod 靠近(亲和)vs 分散到不同拓扑(反亲和)
  2. 举例:Web 与 Cache Pod 通过 podAffinity 部署在同一节点降低延迟;多副本服务通过 podAntiAffinity 避免堆叠
  3. 重点说明 topologyKey 决定反亲和作用范围

💬 简短示例回答
“我用 podAntiAffinity 配合 topologyKey: kubernetes.io/hostname 让 3 个 Nginx 副本分布在不同节点。如果跨可用区,topologyKey 改为 failure-domain.beta.kubernetes.io/zone,确保每个可用区只有一个副本,实现 AZ 级高可用。”

🔍 可能追问

  • requiredDuringScheduling 和 preferredDuringScheduling 在反亲和中的差异?
  • 大量 Pod 使用反亲和时调度效率如何?(调度器计算复杂度 O(n²),可配合 topologySpreadConstraints)
  • Pod 亲和性冲突时调度器如何处理?
⚠️ 避坑提醒:反亲和 required 会显著降低调度成功率,尤其集群节点少时。生产环境常用 preferredDuringScheduling 并配合 PodDisruptionBudget 保障滚动更新。另外注意跨 namespace 的亲和性需要指定 namespaceSelector。

问答卡片 #3:污点容忍与资源配额

面试问题:如何用 Taint/Toleration 隔离混部业务?ResourceQuota 和 LimitRange 的区别是什么?

🎯 面试官考察点

  • 理解污点作为“拒绝机制”与亲和作为“吸引机制”的区别
  • 能否设计多租户资源隔离方案
  • 是否清楚 ResourceQuota(namespace 范围)与 LimitRange(容器默认值)的配合关系

📐 回答框架

  1. 用 taint 标记高危/专用节点(如 GPU、高内存),只有带相应 toleration 的 Pod 才能调度
  2. 解释 NoSchedule / PreferNoSchedule / NoExecute 的区别,以及 operator: Equal vs Exists
  3. ResourceQuota 限制 namespace 总资源,LimitRange 约束单个容器资源上下界,两者配合防止资源争抢

💬 简短示例回答
“给 GPU 节点打 taint ‘gpu=true:NoSchedule’,AI 任务 Pod 配 toleration。同时为 AI 团队 namespace 设置 ResourceQuota cpu:100,防止某任务吃光资源。再用 LimitRange 设每个容器 requests 最小 0.1 core,避免滥用小 Pod。”
配额冲突时,LimitRange 的 min/max 优先于 ResourceQuota 的 hard 吗? 不冲突,LimitRange 是准入校验,ResourceQuota 是运行时终止。

🔍 可能追问

  • NoExecute 污点对已经在运行的 Pod 有什么影响?
  • 如何查看节点上所有污点?kubectl describe node 或 get node -o yaml
  • ResourceQuota 能限制存储吗?可以,支持 requests.storage 和 persistentvolumeclaims
⚠️ 避坑提醒:不要为了隔离而滥用 taint,导致无 toleration 的 Pod 无法调度。建议先用 PreferNoSchedule 灰度。ResourceQuota 需要配合 PriorityClass,否则高优先级作业可能被低优先级阻塞。

📁 项目案例:电商大促集群资源隔离与混部

维度内容
项目名称618 大促 Kubespray 集群混部与调度优化
业务背景电商平台搜索推荐服务与离线批处理任务共用一套集群,离线任务需要利用在线服务剩余资源,但不能影响在线 latency
规模指标500 物理节点、3000+ Pod、日均调度 12000 次;在线服务 P99 延迟 < 20ms
技术栈Kubernetes v1.24, 自定义调度器 (Scheduler Framework), Descheduler (Pod 重平衡), Prometheus + Grafana
核心难点① 在线 Pod 需优先调度且不被离线抢占;② 离线任务需容忍节点拥塞但不可导致在线抖动;③ 资源利用率目标从 40% 提升到 70%
面试高频追问
  • 你怎么保证在线 Pod 抢占时离线 Pod 立即被驱逐?
  • 混部时使用什么污点?NoSchedule 还是 PreferNoSchedule?
  • 如何设计资源配额让离线任务只能使用“空闲资源”?
  • Descheduler 的 Evictor 策略触发了大量 Pod 迁移怎么办?
可迁移回答话术 “我们采用 PriorityClass + Taint 实现优先级抢占:在线 Pod 设高优先级并带 toleration 容忍集群污点;离线任务设低优先级,并用 ResourceQuota + LimitRange 限制其总额。使用 Descheduler 的 LowNodeUtilization 策略在低峰期重平衡 Pod,避免在线被打扰。最终资源利用率提升至 68%,在线延迟保持 20ms 以下。”
🏆 加分项:面试中提到“自定义调度器”或“Descheduler”会显得有深度。建议再补充一句:“我们还在 scheduler extender 中实现了基于实时 CPU 利用率的 scoring,让离线 Pod 优先调度到负载低于 60% 的节点。”