代表性面试主题

系统设计面试:用 Kubernetes 服务端分片 List/Watch 扩展控制器

系统设计困难
Offer.cc 编辑团队发布 更新

题干

一个控制器集群监听数百万个 Pod。当前每个副本都接收完整 List 和 Watch 流,再在本地过滤,导致 API Server 和网络过载。请设计迁移到 Kubernetes v1.36 服务端分片 List/Watch 的方案:如何分配范围、证明覆盖完整、处理不支持的服务端和重新分片,并验证对象不丢失也不重复处理?

题干与适用场景

这是面向平台和 Kubernetes 工程师的控制平面系统设计题。Kubernetes v1.36 引入服务端分片 List/Watch,属于需要开启 ShardedListAndWatch 特性门控的 alpha 功能。把它视为可选优化,控制器在门控关闭时仍须正确。

面试官考察点

  • 精确覆盖键空间且只归属一次的分片模型。
  • 正确的初始 List、resourceVersion 和 Watch 重连。
  • 发现 API Server 忽略 selector 的机制。
  • 重新分片、副本变化,以及重叠和缺口的权衡。
  • API Server CPU、网络、informer 内存与恢复风暴的容量推理。

归属键是什么?

alpha 实现支持 object.metadata.uidobject.metadata.namespace。UID 哈希分布稳定;namespace 哈希可保持租户局部性但可能倾斜。选择会改变均衡、隔离边界和迁移成本。

正确性目标是什么?

确认是否接受至少一次协调,以及重复处理是否幂等。业务副作用不能重复时,应增加持久化工作键和 fencing,不能只依赖事件流。

API Server 和客户端能否同时升级?

默认存在混合版本,除非平台团队证明全部升级。控制器要检查响应元数据,门控关闭或服务端不支持时回退到本地过滤,不能假称负载已降低。

30 秒回答框架

“我会把确定性的 64 位哈希空间切成不重叠范围,每个范围分配给一个副本。每个 informer 在 List 和 Watch 都发送 shard selector,并验证响应包含匹配的分片元数据。缺少确认时安全回退到本地过滤或关闭优化。重新分片使用 generation 和交接协议,配合重叠、幂等协调及覆盖率、重复数、延迟和回退流量指标。”

分步骤深入解答

分区与分配

用环上的半开范围 [start, end) 表示 64 位空间。每个范围持久化 generation、owner 和 lease。两个副本可各占一半,更多副本由控制器管理范围表。不要只按副本序号推导归属,否则重启可能制造缺口。

text
副本 A: [0000..., 8000...)
副本 B: [8000..., 1000...)

让 List 和 Watch 成为同一协议

初始 List 和每次 Watch 重连都携带相同 selector 与 resourceVersion。informer 收到完整初始列表后再替换本地 store,并从返回的 resourceVersion 开始 Watch。遇到 410 Gone 或版本过期时,只为该分片重新 List,不能盲目重放其他范围。

验证服务端支持

v1.36 博客描述了回显已应用 selector 的 shardInfo 响应字段。缺失时要假设服务端返回完整集合。客户端可本地过滤保持正确,但必须记录回退指标并施加背压,避免不支持的服务端让每个副本都占满内存。

无缺口地重新分片

创建新 generation 的范围。交接期间旧 owner 继续协调,新 owner 先完成 List 预热,并在已知 resourceVersion 上建立 Watch。双方 ready 后才提交归属变化;协调幂等时重复事件可接受。ready 失败则让 lease 过期并保留旧 owner。

容量与失败路径

服务端过滤减少被丢弃对象的字节和反序列化成本,但 API Server 增加哈希和 selector 计算。用特性门控、每个控制器的并发上限和灰度保护它。API Server 过载时限制重连并指数退避,不能让所有副本同时 relist。

高质量示范回答

“我会用对象 UID 的确定性哈希建立带 generation 的范围表。informer 在 List 和 Watch 都携带 selector,只有看到 shardInfo 才把优化视为生效。缺失字段时回退到本地过滤,并使用全局并发预算。重新分片创建新 generation,让新 owner 从指定版本预热,ready 后再切换 lease;协调幂等使短暂重叠安全。灰度开启门控,并比较 API CPU、字节、List 延迟、Watch 重连、分片覆盖、重复数和回退率。”

常见错误

  • 按副本序号分片 → 重启会改变归属并制造缺口 → 持久化带 generation 的范围表。
  • 只给 Watch 加 selector → 初始 List 仍过载且可能与流不一致 → List 和 Watch 使用同一 selector 与版本规则。
  • 信任不支持的服务端 → 每个副本收到完整流 → 要求 shardInfo 并暴露回退流量。
  • 瞬间移动范围 → 交接期间可能丢事件 → owner 重叠、generation fencing,并让协调幂等。
  • 只看控制器 CPU → API Server 哈希或重连风暴不可见 → 同时监控控制平面与客户端指标。

评分标准与自检

评分分区正确性、List/Watch 语义、回退、重新分片、容量和可观测性。强回答应明确不变量:每个对象属于一个活动范围 generation,交接有 resourceVersion 边界;还要说明幂等协调时重复比缺失更安全。

追问及应对

某个 namespace 特别大怎么办?

优先用 UID 哈希均衡,或把热点 namespace 拆成多个 UID 范围。测量各范围负载,不要假设对象数量相等。

如何发现静默缺口?

用全局对象数与分片数并集做抽样对比,记录 selector generation,并周期性创建经过所有范围的合成对象。对延迟或覆盖漂移告警。

API Server 升级期间怎么办?

在所有服务端点的 canary 都返回 shardInfo 前保持门控关闭。混合响应触发回退和有界重连速率。

控制器会重复处理对象吗?

交叠或重连期间会。用对象版本和持久化工作键保证副作用幂等;不能为了避免重复而接受无限的丢状态风险。

公开来源

同类题目

相关面试工具

用 Solve 整理系统设计回答

从澄清需求开始,展开规模、架构、组件选择和取舍。

查看工具