4. 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 组合使用?• 对调度性能的影响?
问题 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?
PreferNoSchedule 是软约束仍可能调度上去,面试时需明确区分。项目案例:高可用集群节点染色与 Pod 调度治理
| 维度 | 详情 |
|---|---|
| 业务背景 | 公司微服务从 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 保证滚动更新不中断。” |