调度与资源管理面试题:调度策略、亲和性、污点容忍、资源配额
本章聚焦 Kubernetes 调度核心面试题,覆盖节点选择、Pod 分布控制、资源隔离与配额管理。你将掌握一套标准化回答框架,应对不同公司对调度能力的差异化考察。
问答卡片 #1:Pod 调度策略与 nodeSelector
🎯 面试官考察点
- 是否掌握基础调度约束的适用场景
- 能否讲清 nodeSelector(精确匹配 label)与 nodeAffinity(表达式匹配)的粒度差异
- 是否了解硬性/软性亲和性及实际用法
📐 回答框架
- 先明确需求:固定节点 / 批处理 / GPU 专用 → 选择 nodeSelector(静态)或 nodeAffinity(动态)
- 解释 nodeSelector 简单但只能做等于匹配,nodeAffinity 支持 In/NotIn/Exists 及权重
- 给出典型 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 日志)
问答卡片 #2:Pod 间亲和性与反亲和性
🎯 面试官考察点
- 对分布式部署中 Pod 分布的控制能力
- 是否理解 topologyKey 的作用(如 kubernetes.io/hostname 或 zone)
- 能否结合高可用需求给出反亲和性配置
📐 回答框架
- 区分两种需求:让同类 Pod 靠近(亲和)vs 分散到不同拓扑(反亲和)
- 举例:Web 与 Cache Pod 通过 podAffinity 部署在同一节点降低延迟;多副本服务通过 podAntiAffinity 避免堆叠
- 重点说明 topologyKey 决定反亲和作用范围
💬 简短示例回答
“我用 podAntiAffinity 配合 topologyKey: kubernetes.io/hostname 让 3 个 Nginx 副本分布在不同节点。如果跨可用区,topologyKey 改为 failure-domain.beta.kubernetes.io/zone,确保每个可用区只有一个副本,实现 AZ 级高可用。”
🔍 可能追问
- requiredDuringScheduling 和 preferredDuringScheduling 在反亲和中的差异?
- 大量 Pod 使用反亲和时调度效率如何?(调度器计算复杂度 O(n²),可配合 topologySpreadConstraints)
- Pod 亲和性冲突时调度器如何处理?
问答卡片 #3:污点容忍与资源配额
🎯 面试官考察点
- 理解污点作为“拒绝机制”与亲和作为“吸引机制”的区别
- 能否设计多租户资源隔离方案
- 是否清楚 ResourceQuota(namespace 范围)与 LimitRange(容器默认值)的配合关系
📐 回答框架
- 用 taint 标记高危/专用节点(如 GPU、高内存),只有带相应 toleration 的 Pod 才能调度
- 解释 NoSchedule / PreferNoSchedule / NoExecute 的区别,以及 operator: Equal vs Exists
- 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
📁 项目案例:电商大促集群资源隔离与混部
| 维度 | 内容 |
|---|---|
| 项目名称 | 618 大促 Kubespray 集群混部与调度优化 |
| 业务背景 | 电商平台搜索推荐服务与离线批处理任务共用一套集群,离线任务需要利用在线服务剩余资源,但不能影响在线 latency |
| 规模指标 | 500 物理节点、3000+ Pod、日均调度 12000 次;在线服务 P99 延迟 < 20ms |
| 技术栈 | Kubernetes v1.24, 自定义调度器 (Scheduler Framework), Descheduler (Pod 重平衡), Prometheus + Grafana |
| 核心难点 | ① 在线 Pod 需优先调度且不被离线抢占;② 离线任务需容忍节点拥塞但不可导致在线抖动;③ 资源利用率目标从 40% 提升到 70% |
| 面试高频追问 |
|
| 可迁移回答话术 |
“我们采用 PriorityClass + Taint 实现优先级抢占:在线 Pod 设高优先级并带 toleration 容忍集群污点;离线任务设低优先级,并用 ResourceQuota + LimitRange 限制其总额。使用 Descheduler 的 LowNodeUtilization 策略在低峰期重平衡 Pod,避免在线被打扰。最终资源利用率提升至 68%,在线延迟保持 20ms 以下。”
|