容器基础与K8s原理面试核心
本章聚焦容器生命周期、Pod调度机制、etcd及API Server等核心组件的高频面试题。以下先通过一张回答框架图建立整体排查逻辑,再逐一拆解典型问答。
△ 面试回答时可按此路径分步阐述排查思路,避免跳过关键环节
🎯 面试问题
Pod 从创建到 Running 经历了哪些阶段?如果一直处于 Pending 该如何排查?
📌 面试官考察点
- 对 Pod 生命周期(Pending → Running → Succeeded/Failed)的掌握
- 调度流程理解:Scheduler 如何分配 Node
- 实际排查能力:kubectl describe、events、资源限制检查
📐 回答框架
分两层:① 正常流程(创建→调度→拉镜像→启动容器);② Pending 定位(kubectl describe pod 看 events → 检查资源/污点/PVC/PodNetwork → 确认 Node 是否可调度)。
✏️ 简短示例回答
Pod 先进入 Pending,Scheduler 根据资源要求和亲和性选择 Node,分配成功后转为 Running。若一直 Pending,用 kubectl describe 发现 "FailedScheduling" 事件,原因是节点 CPU 不足,增加节点或调整资源限即可。
🔍 可能追问
- 如果 Pod 是 DaemonSet 控制的,调度逻辑有何不同?
- 如何区分资源不足与节点污点导致的 Pending?
events 还是 kubelet 日志;避免只讲正常流程而忽略排查步骤。
🎯 面试问题
kube-scheduler 的调度策略有哪些?假设一个 Pod 调度失败,如何分析并恢复?
📌 面试官考察点
- 调度流程:预选(Predicates)→ 优选(Priorities)
- 常见调度策略:NodeSelector、NodeAffinity、Taint/Toleration
- 排查工具:
kubectl describe pod、调度器日志、scheduler_framework插件
📐 回答框架
先说明预选/优选两步,举例常见插件。遇到调度失败时:kubectl describe pod 找 FailedScheduling → 查看节点资源、污点、PodSelector → 调整资源请求或删除污点。
✏️ 简短示例回答
Scheduler 通过 Predicates 过滤不满足条件的节点,再通过 Priorities 打分。若调度失败,我曾在生产中发现 Pod 请求 4 核但节点只剩 2 核,通过降低资源 limits 或扩缩节点解决。
🔍 可能追问
- 如何实现自定义调度器?
- 如果集群中有多个调度器,Pod 如何选择?
🎯 面试问题
etcd 在 Kubernetes 中扮演什么角色?如果 etcd 集群出现写超时,你会如何排查?
📌 面试官考察点
- etcd 作为 K8s 唯一的元数据存储
- raft 共识机制、读写性能瓶颈
- 故障排查:集群健康状态、磁盘 IO、网络延迟、慢请求分析
📐 回答框架
先说明 etcd 存储所有资源对象。写超时排查:检查 etcd 节点健康(etcdctl endpoint health)→ 查看磁盘 IO(fio)→ 网络延迟(ping/tcpdump)→ leader 选举频率→ 慢请求(--metrics)。
✏️ 简短示例回答
曾遇到 etcd 写超时导致 Pod 创建缓慢。先用 etcdctl endpoint status 发现 leader 频繁切换,进一步用 iostat 确认磁盘延迟 > 50ms,替换为 SSD 后恢复。
🔍 可能追问
- etcd 的存储配额(quota-backend-bytes)满了会怎样?如何处理?
- 如何对 etcd 进行备份和恢复?
etcdctl compact,先评估是否影响读取。
📊 Pod 生命周期关键状态速查表
| 状态 | 含义 | 常见原因 | 排查命令 |
|---|---|---|---|
| Pending | 等待调度或容器启动前 | 资源不足、挂载卷未绑定、镜像拉取失败 | kubectl describe pod |
| Running | 至少一个容器正在运行 | 正常状态 | kubectl logs |
| CrashLoopBackOff | 容器反复崩溃重启 | 应用错误、配置异常、探活失败 | kubectl logs --previous |
| Error | 容器启动或运行时错误 | OOM、文件系统损坏、权限不足 | kubectl describe 查看 Reason |