K8s Lab 把当前仓库文档整理成一个可阅读的网页站点

Repository Reading Site

K8s 面试指南 — 从原理到实战

面试官考察的不是你记住了多少命令,而是: 1. **你理解设计动机吗?** — 为什么这样设计,解决了什么问题 2. **你能排查问题吗?** — 给一个故障现象,你怎么定位 3. **你做过生产级方案吗?** — 高可用、安全、可观测怎么做 --- **Q1: 描述 `kubectl apply -f deployment.yaml` 之后发生了什么?**

Markdownphase-4/02-interview-guide.md2026年4月9日 13:37

K8s 面试指南 — 从原理到实战

面试维度

面试官考察的不是你记住了多少命令,而是:

  1. 你理解设计动机吗? — 为什么这样设计,解决了什么问题
  2. 你能排查问题吗? — 给一个故障现象,你怎么定位
  3. 你做过生产级方案吗? — 高可用、安全、可观测怎么做

高频题 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 网络模型要求:

  1. 每个 Pod 有唯一 IP
  2. 任意 Pod 可以直接通信(不需要 NAT)
  3. 实现靠 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 ≠ 加密。需要额外配置:

  1. etcd 加密(EncryptionConfiguration)
  2. RBAC 限制读取权限
  3. 审计日志监控谁访问了 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: 如何实现零停机发布?

  1. RollingUpdate 策略(maxUnavailable=0)
  2. readinessProbe(新 Pod 就绪才接收流量)
  3. preStop hook(旧 Pod 优雅关闭)
  4. 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)              │
└──────────────────────────────────────────────────┘