容器核心技术面试:Docker原理、Kubernetes核心概念、Pod生命周期、调度策略
本章聚焦容器平台面试最高频的四个技术轴心。掌握回答框架和生命周期状态图,能让你在面试中快速展现系统思维。
一、核心技术知识结构
| 技术领域 | 核心面试点 | 常见追问 |
|---|---|---|
| Docker原理 | 镜像分层、联合文件系统、容器运行时隔离(Namespace/Cgroups) | docker build 缓存策略、rootless 容器 |
| K8s核心概念 | API Server、etcd、Controller Manager、Scheduler 职责 | Pod与Container关系、静态Pod |
| Pod生命周期 | Pending→Running→Succeeded/Failed,Init容器、探针(Liveness/Readiness/Startup) | 抢占、优雅终止、Pod删除流程 |
| 调度策略 | Predicates(硬约束)、Priorities(软评分)、亲和性/反亲和性 | 自定义调度器、调度器扩展(Extender) |
二、面试问答卡片
面试问题:请简述Docker镜像分层的工作原理,以及如何优化构建缓存?
面试官考察点:是否理解联合文件系统(OverlayFS)、层复用机制;能否说出实际构建优化策略。
回答框架:定义层 → 只读层与可写层 → 缓存命中条件 → 构建优化实践。
示例回答:Docker镜像采用分层存储,每层是只读文件系统。构建时若某层指令和上下文未变,则复用缓存。优化技巧:将变化少的依赖安装放在前面,多使用
.dockerignore避免不必要的缓存失效。可能追问:① 为什么修改
RUN apt-get update会导致后续层全部缓存失效?② Docker 用命名空间做隔离,具体有哪些?避坑提醒:不要只说“分层”而说不清是写时复制;避免遗漏
--cache-from多阶段构建的高级用法。面试问题:Pod 从创建到 Running 经历了哪些阶段?Init 容器和探针如何影响生命周期?
面试官考察点:对 Pod 状态机细节的掌握程度;能否清晰描述 Init 容器阻塞顺序及探针工作时机。
回答框架:Pending → 创建 Init 容器并等待完成 → 创建主容器 → 运行启动探针、就绪探针 → 标记 Running。失败时 CrashLoopBackOff。
示例回答:Pod 先处于 Pending,调度后开始拉镜像,Init 容器顺序执行完毕。主容器启动后执行 startupProbe,成功后 readinessProbe 通过才转为 Running;同时 livenessProbe 持续检查。
可能追问:① 如果 readinessProbe 一直失败,Pod 会处于什么状态?② 如何优雅停止 Pod?
避坑提醒:不要混淆就绪探针与存活探针的作用;牢记 Init 容器失败会导致 Pod 重启(restartPolicy=Always 时)但要区分。
面试问题:Kubernetes 调度器给一个 Pod 选择节点时,会经过哪些步骤?
面试官考察点:Predicates + Priorities 两阶段理解;能否说出常见的过滤和打分策略。
回答框架:调度队列 → Predicates 过滤(节点资源、端口冲突、污点容忍等)→ Priorities 打分(资源余量、亲和性等)→ 选最高分节点 → 绑定。
示例回答:首先过滤出满足 Pod 资源请求、无污点等硬约束的节点;再按优先级函数(如 LeastRequestedPriority)打分,综合节点亲和性、Pod 反亲和性得出最终节点。
可能追问:① 如何实现自定义调度器?② 调度器抢占(Preemption)原理?
避坑提醒:不要忘记“污点容忍”属于过滤阶段;避免把软约束(亲和性)放到 Predicates 中讲解。
🏆 面试加分策略
回答时先给一句话总结(如“Docker 镜像层是只读的,缓存命中依赖指令和上下文”),再用项目或个人实践举例(如“我之前在 CI 中通过拆分 Dockerfile 层,构建时间缩短了 60%”)。每个问题最后回到“设计意图”——说明为什么 K8s 这样设计,体现架构思维。
回答时先给一句话总结(如“Docker 镜像层是只读的,缓存命中依赖指令和上下文”),再用项目或个人实践举例(如“我之前在 CI 中通过拆分 Dockerfile 层,构建时间缩短了 60%”)。每个问题最后回到“设计意图”——说明为什么 K8s 这样设计,体现架构思维。