从一次 Webhook 拖垮集群聊起:彻底搞懂 K8s 架构设计
一个 MutatingAdmissionWebhook 后端挂掉导致整个集群’假死’,排查过程串联起 K8s 所有核心组件的职责与协作:API Server 的请求处理链、etcd 的唯一真相源角色、Controller Manager 的 Reconcile 循环、Scheduler 的选房策略、Kubelet 的工地执行、kube-proxy 的网络粘合。
一个 MutatingAdmissionWebhook 后端挂掉导致整个集群’假死’,排查过程串联起 K8s 所有核心组件的职责与协作:API Server 的请求处理链、etcd 的唯一真相源角色、Controller Manager 的 Reconcile 循环、Scheduler 的选房策略、Kubelet 的工地执行、kube-proxy 的网络粘合。
不讲干巴巴的八股文。从一个真实的 Kubernetes controller 内存暴涨 + 延迟飙高的线上事故出发,用 pprof 数据倒推 GMP 调度模型的每个概念,让你理解为什么要学这些东西。
一个 K8s Operator 里 slice append 导致不同调用方的资源配置互相污染,排查过程揭开 slice 底层结构的全部秘密:胖指针、共享底层数组、扩容策略、nil vs 空 slice,以及那些年我们踩过的坑。
200+ 集群同时断连后重连,固定 RequeueAfter 绕过指数退避导致 API Server 雪崩。排查过程揭开 Controller 核心机制的全部秘密:Informer 的 List-Watch、DeltaFIFO、Indexer 缓存、WorkQueue 限速策略,以及 Operator 模式的工程哲学。
生产环境的 K8s controller 突然 fatal error: concurrent map read and map write 崩溃退出,不是 panic,recover 也救不了。从这个事故出发,搞清楚 map 的并发问题、遍历随机性、delete 不缩容等实战中真正会踩的坑。
一个 K8s admission webhook 在高峰期频繁超时,但单个请求处理逻辑明明很快。问题出在 channel 的使用方式上。从这个事故出发,拆解 channel 的底层结构、发送接收流程、select 实现,以及那些年我们踩过的 channel 坑。
kubectl delete 某个 CR 后一直卡在 Terminating,–force 也无效。排查过程串联 CRD 的设计哲学:自定义资源如何在 API Server 中’活起来’、Finalizer 如何保证安全清理、Webhook 如何扩展准入控制,以及那些让人抓狂的版本迁移坑。
K8s admission webhook 返回了一个 typed nil pointer,导致 error != nil 却打印不出任何错误信息。搞清楚 nil interface vs typed nil、值接收者 vs 指针接收者、类型断言这些面试必考点。
一个 K8s admission webhook 上线后内存持续增长,pprof 显示大量 timer 泄漏。根因是 context.WithTimeout 的 cancel 函数没有被调用。从这个事故出发,拆解 context 的树状传播机制、四种派生函数、最佳实践与常见陷阱。
管理 200+ 集群时 CR 大量累积触发 etcd space quota,所有写操作报 mvcc: database space exceeded。排查过程揭开 etcd 的全部秘密:Raft 共识如何保证一致性、MVCC 如何实现乐观并发控制、watch 如何驱动整个 K8s 事件循环,以及 compaction 和 defrag 为什么要分两步。