Repository Reading Site
K8s 面试指南 — 从原理到实战
面试官考察的不是你记住了多少命令,而是: 1. **你理解设计动机吗?** — 为什么这样设计,解决了什么问题 2. **你能排查问题吗?** — 给一个故障现象,你怎么定位 3. **你做过生产级方案吗?** — 高可用、安全、可观测怎么做 --- **Q1: 描述 `kubectl apply -f deployment.yaml` 之后发生了什么?**
K8s 面试指南 — 从原理到实战
面试维度
面试官考察的不是你记住了多少命令,而是:
- 你理解设计动机吗? — 为什么这样设计,解决了什么问题
- 你能排查问题吗? — 给一个故障现象,你怎么定位
- 你做过生产级方案吗? — 高可用、安全、可观测怎么做
高频题 Top 20
架构类
Q1: 描述 kubectl apply -f deployment.yaml 之后发生了什么?
完整链路:
kubectl → API Server (认证→授权→准入控制→持久化到 etcd)
→ Controller Manager 的 Deployment Controller 看到新 Deployment
→ 创建 ReplicaSet
→ ReplicaSet Controller 看到需要 3 个 Pod
→ 创建 3 个 Pod(状态 Pending)
→ Scheduler Watch 到 Pending Pod
→ 过滤 + 打分 → 绑定到节点
→ kubelet Watch 到自己节点上有新 Pod
→ 通过 CRI 调用 containerd
→ containerd 拉镜像、创建容器
→ kubelet 上报 Pod Running
Q2: etcd 存了什么?为什么重要?
所有集群状态:节点、Pod、Service、ConfigMap、Secret、RBAC 规则。丢了 etcd = 丢了整个集群。生产必须定期备份,部署奇数台(3/5)保证 Raft 共识。
我们的实验:etcdctl snapshot save 备份了 31MB,3087 keys。
Q3: Master 挂了会怎样?
- 已运行的 Pod 不受影响(kubelet 继续管理)
- 但不能创建/更新/删除任何资源
- 不能调度新 Pod
- 不能执行 kubectl 命令
- 如果 kubelet 重启,无法重新注册
- 这就是为什么生产需要 3 个 Master(HA)
网络类
Q4: Service 的 ClusterIP 是怎么工作的?
ClusterIP 是虚拟 IP,不绑定在任何网卡上。kube-proxy 在每个节点写 iptables 规则:发往 ClusterIP 的包做 DNAT 转发到后端 Pod IP。请求从哪个节点发出,就在哪个节点做转发(不经过 master)。
我们的实验:nginx-svc ClusterIP 10.110.86.136 → Endpoints 指向 3 个 Pod IP。
Q5: Pod 之间怎么通信?
K8s 网络模型要求:
- 每个 Pod 有唯一 IP
- 任意 Pod 可以直接通信(不需要 NAT)
- 实现靠 CNI 插件(我们用 Calico)
同节点:通过 Linux bridge/veth pair 跨节点:Calico 使用 BGP 或 IP-in-IP 隧道
Q6: Ingress 和 Service 的区别?
Service 是 L4(IP + 端口),Ingress 是 L7(域名 + 路径)。Ingress 底层是反向代理(nginx/envoy),提供基于 Host/Path 的路由、TLS 终结、限速等。
我们的实验:app.k8s-lab.local/ → nginx-svc,/web → web-headless。
调度类
Q7: Pod 一直 Pending 怎么排查?
kubectl describe pod <name> # 看 Events 中的 FailedScheduling 原因
常见原因:资源不足、nodeSelector 不匹配、Taint 没 Toleration、PVC 未 Bound。
我们的实验:请求 100Gi 内存 → "4 Insufficient memory"。
Q8: requests 和 limits 的区别?
| requests | limits | |
|---|---|---|
| 含义 | 调度时的保证 | 运行时的上限 |
| CPU 超了 | — | 被节流(变慢) |
| Memory 超了 | — | 被 OOMKill(杀掉) |
| 调度依据 | ✅ 是 | ❌ 不是 |
Q9: Taint/Toleration 和 NodeAffinity 的区别?
- Taint/Toleration:节点说"我不欢迎你",Pod 说"我能忍"(排斥机制)
- NodeAffinity:Pod 说"我想去哪"(吸引机制)
实际常组合使用:GPU 节点加 Taint 防止普通 Pod 过来 + GPU Pod 加 Toleration + NodeAffinity 优先选 GPU 节点。
存储类
Q10: PV 的生命周期?
Available → Bound(被 PVC 绑定)→ Released(PVC 删除)→ Delete/Retain
我们的实验:16 个 PVC 通过 NFS StorageClass 动态创建 PV,全部 Bound。
Q11: StatefulSet 缩容后 PVC 删吗?
不删。这是数据安全设计——扩回来后 PVC 自动重新绑定。需要手动 kubectl delete pvc 才真删。
安全类
Q12: Secret 安全吗?
默认不安全。base64 ≠ 加密。需要额外配置:
- etcd 加密(EncryptionConfiguration)
- RBAC 限制读取权限
- 审计日志监控谁访问了 Secret
Q13: RBAC 怎么设计最小权限?
CI/CD 例子:只给 apps/deployments 的 get/create/update,不给 delete,只限特定 namespace。 我们的实验:developer SA 只能 get/list/watch pods in dev → 不能 delete,不能跨 namespace。
Q14: PSS restricted 级别要求什么?
runAsNonRoot、drop ALL capabilities、allowPrivilegeEscalation=false、seccomp RuntimeDefault。我们的实验:特权容器被拒绝,合规容器通过。
运维类
Q15: 如何实现零停机发布?
- RollingUpdate 策略(maxUnavailable=0)
- readinessProbe(新 Pod 就绪才接收流量)
- preStop hook(旧 Pod 优雅关闭)
- PDB(保证最少可用副本数)
Q16: 集群升级流程?
1. etcd 备份
2. kubeadm upgrade plan → apply(Master 先升)
3. drain Worker → upgrade kubelet/kubectl → uncordon
4. 逐个 Worker 升级
5. 版本偏差策略:kubelet 可以比 apiserver 低最多 2 个次版本
Q17: 如何排查节点 NotReady?
kubectl describe node → 看 Conditions
SSH 到节点 → systemctl status kubelet
→ journalctl -u kubelet
→ systemctl status containerd
→ df -h(磁盘满?)
→ free -m(内存?)
可观测类
Q18: Prometheus pull 模型的优势?
- 感知 target 存活(pull 失败 = 挂了)
- 低耦合(target 不需要知道 Prometheus 地址)
- 控制采集频率(避免被推送淹没)
Q19: metrics-server、node-exporter、kube-state-metrics 区别?
| 组件 | 采集什么 | 给谁用 |
|---|---|---|
| metrics-server | 实时 CPU/内存 | kubectl top、HPA |
| node-exporter | 节点系统指标 | Prometheus → Grafana |
| kube-state-metrics | K8s 对象状态 | Prometheus → Grafana |
架构设计类
Q20: 你会怎么设计一个公司的 K8s 平台?
基础层:
- 3 Master HA + N Worker
- Calico CNI (NetworkPolicy)
- NFS/Ceph 存储 + local SSD 给数据库
安全层:
- RBAC 按团队/环境隔离
- PSS restricted 给 prod
- NetworkPolicy 零信任
- External Secrets Operator
CI/CD:
- Harbor 镜像仓库(Trivy 扫描)
- ArgoCD GitOps(Git 是唯一真相源)
- 环境:dev → staging → prod(namespace 隔离)
可观测:
- Prometheus + Grafana(指标 + 告警)
- Loki(日志)
- 告警规则:Pod 重启、节点 NotReady、磁盘 >80%
弹性:
- HPA(基于 CPU/自定义指标)
- PDB(保护最少可用副本)
- 定期 etcd 备份
以上所有组件我们在实验环境中全部搭建并验证过。
我们实验室的完整技术栈
┌──────────────────────────────────────────────────┐
│ CI/CD & GitOps │
│ Gitea (Git) → Harbor (镜像) → ArgoCD (部署) │
├──────────────────────────────────────────────────┤
│ 可观测性 │
│ Prometheus → Grafana (指标) │
│ Loki + Promtail (日志) │
│ Alertmanager (告警) │
├──────────────────────────────────────────────────┤
│ 流量管理 │
│ nginx-ingress (入口) + Calico NetworkPolicy (隔离)│
├──────────────────────────────────────────────────┤
│ 工作负载 │
│ Deployment / StatefulSet / DaemonSet / Job │
│ HPA (自动伸缩) + PDB (故障保护) │
├──────────────────────────────────────────────────┤
│ 安全 │
│ RBAC + PSS + Secret 管理 │
├──────────────────────────────────────────────────┤
│ 存储 │
│ NFS 动态 Provisioning (StorageClass) │
├──────────────────────────────────────────────────┤
│ 集群基础 │
│ K8s v1.30 (kubeadm) + Calico CNI + containerd │
│ 5 节点 WireGuard Mesh (LA×3 + HK×2) │
└──────────────────────────────────────────────────┘