4. Pod 生命周期与调度策略

章节聚焦:Pod 是 Kubernetes 最小调度单元,面试中 80% 的调度与稳定性问题都围绕它的 生命周期状态(Pending→Running→Succeeded/Failed)以及 调度策略(NodeSelector / Affinity / Taint & Toleration / TopologySpread)。高频考点包括:Pod 重启策略、Init 容器、静态 Pod、污点容忍度、拓扑分布约束、优先级抢占等。

核心知识结构表

维度关键概念面试权重
生命周期Pod 状态机、Init 容器、Pod 探针(Liveness/Readiness/Startup)、TerminationGracePeriodSeconds★★★★★
调度策略NodeSelector / NodeAffinity / PodAffinity / PodAntiAffinity / Taint & Toleration / TopologySpreadConstraints★★★★★
高级特性优先级与抢占(PriorityClass)、PodDisruptionBudget、调度器扩展(Scheduler Extender)★★★☆☆
调度策略面试题 明确需求 选择调度策略 配置与验证 场景匹配 冲突解决 兜底与排错

面试问答卡片

问题 1:Pod 从创建到运行经历哪些状态?启动过程出现 CrashLoopBackOff 如何排查?

考察点:Pod 生命周期理解、状态机转换、容器重启策略、kubelet 工作原理。

回答框架:状态链 → 关键事件 → 常见原因 → 排查命令。

示例回答:Pod 经历 Pending → ContainerCreating → Running。若出现 CrashLoopBackOff,先用 kubectl describe pod 看 Events,再用 kubectl logs --previous 查看上一次日志,常见原因:镜像拉取失败、配置错误、启动命令异常。

可能追问:• Init 容器失败怎么处理?• 如何区分 OOMKilled 和 CrashLoopBackOff?• 如何延长重启等待时间?

避坑提醒:不要只说“重启容器”,要强调 restartPolicy 和 backoff 机制,以及存活探针对 CrashLoop 的影响。

问题 2:NodeSelector 和 NodeAffinity 有什么区别?如何实现 Pod 必须调度到 SSD 节点?

考察点:节点选择策略、亲和性匹配逻辑、硬约束 vs 软约束。

回答框架:基础对比 → 硬约束场景 → 软约束优化 → 实际配置。

示例回答:NodeSelector 是简单标签匹配,NodeAffinity 支持 requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution。实现 SSD 调度:给节点打标签 disk-type=ssd,使用 required 硬约束。

可能追问:• 如果节点没有 SSD 标签会怎样?• 如何与 PodAntiAffinity 组合使用?• 对调度性能的影响?

加分点:主动提“调度器在匹配硬约束失败时 Pod 保持 Pending 状态,需要配合 Taint/Toleration 实现优雅驱逐”。

问题 3:Taint 和 Toleration 的设计思路是什么?给存储节点打上 NoSchedule 后怎么让监控 Pod 仍能调度?

考察点:污点与容忍机制、集群资源隔离、关键守护程序调度。

回答框架:设计目的 → 污点类型 → 容忍配置 → 特殊处理。

示例回答:Taint 阻止普通 Pod 调度,Toleration 允许特定 Pod “容忍”污点。给存储节点加 node-role.kubernetes.io/storage:NoSchedule,监控 Pod 的 tolerations 中添加对应 key,可设置 operator: Exists 以匹配所有值。

可能追问:• NoExecute 与 NoSchedule 的区别?• 如何让监控 Pod 即使节点故障也不被驱逐?• DaemonSet 为什么默认带 Toleration?

避坑提醒:不要混淆 Taint 的 Effect 类型,PreferNoSchedule 是软约束仍可能调度上去,面试时需明确区分。
调度策略追问链 Q1: Pod 怎么被分配到某节点? Q2: 如果多个调度策略冲突怎么办? A: 优先级排序 + 软硬约束 A: 结合 Taint 与资源限制

项目案例:高可用集群节点染色与 Pod 调度治理

项目名称:K8s 弹性集群调度优化改造
维度详情
业务背景公司微服务从 50 个扩展到 200+,节点从 10 台扩到 50 台,出现大量 Pod 堆积在低性能节点,部分GPU节点空转。
规模指标50 个工作节点(含GPU 8台)、500+ Pod、日均调度 3000 次、集群利用率峰值 85%。
技术栈Kubernetes v1.22 + kubeadm、Calico CNI、Prometheus + Grafana、自定义 Scheduler Extender
核心难点1. GPU 节点需独占调度但允许监控 Pod 共存;2. 关键业务 Pod 需要跨 AZ 分布;3. 低配置节点应被普通 Pod 回避。
面试高频追问• 如何设计 Taint 与 Toleration 的组合?
• TopologySpreadConstraints 如何确保跨可用区均匀分布?
• 节点打污点后原有 Pod 如何处理?
可迁移回答话术“我们采用三级调度策略:①给GPU节点打 gpu=true:NoSchedule,监控 DaemonSet 加 Toleration;②关键服务使用 PodAntiAffinity 跨 AZ 部署;③普通服务通过 preferredDuringScheduling 倾向高性能节点,并配合 PodDisruptionBudget 保证滚动更新不中断。”
项目面试话术核心:突出“调度策略的层次化设计”和“通过 Taint/Affinity 实现资源隔离与混合部署”,这是大厂评估候选人系统设计能力的黄金考点。