代表性面试主题

系统设计面试:用清单式控制保护 Kubernetes 准入策略

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

题干

平台团队必须阻止关键 ValidatingAdmissionPolicy 被删除。API 准入在启动阶段不可用,也不能拦截对自身配置的修改。请设计 Kubernetes v1.36 清单式准入方案:文件如何加载、如何保护策略对象、错误策略如何恢复、如何发现 API Server 漂移,以及如何避免把运维人员锁在集群外?

题干与适用场景

本题面向平台安全工程师。Kubernetes v1.36 引入 alpha 的清单式准入控制。策略从 API Server 本地目录加载,在处理请求前生效,因此方案必须在 etcd 不可用时工作,并提供文件式恢复路径。

面试官考察点

  • 启动策略与 API 管理策略的职责分离。
  • 原子校验、回滚和启动失败行为。
  • 防止特权删除策略和 webhook 配置。
  • 多 API Server 的配置分发与漂移检测。
  • 运维逃生通道、审计和故障测试。

要保护哪些资源?

确认只保护 ValidatingAdmissionPolicy,还是也保护 binding、webhook 与 mutating 配置。匹配规则和影响范围会随答案改变。

谁拥有恢复权限?

API 不可用或策略阻止自身修复时,权威路径必须是 API Server 主机或不可变配置流水线。定义谁能改、如何审核。

有多少 API Server?

每个实例读取自己的文件。集群需要内容寻址制品、滚动顺序和配置哈希指标;单实例也要原子替换。

30 秒回答框架

“我会先安装一条经过审核的清单策略,再启用 API 管理策略。它拒绝修改或删除带保护标签的对象,名称使用保留的 .static.k8s.io 后缀。每个 API Server 接收相同版本目录并暴露配置哈希。文件变更先校验再原子切换;运行时错误保留上一版,启动时错误则快速失败。运维通过主机配置路径恢复,不能依赖被阻止的 API。”

分步骤深入解答

建立启动信任边界

在每个 API Server 启用 ManifestBasedAdmissionControlConfig,通过现有准入配置文件设置 staticManifestsDir。清单来自只读且完整性校验的制品。所有静态对象名称以 .static.k8s.io 结尾,让指标和审计记录区分文件对象与 API 对象。

yaml
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: ValidatingAdmissionPolicy
  configuration:
    staticManifestsDir: /etc/kubernetes/admission/static

编写保护规则

启动策略匹配准入策略、binding 和 webhook 配置的 UPDATE、DELETE。只有旧对象带 platform.example.com/protected=true 时才拒绝。普通试验仍可进行,基线受到保护。

让更新具备事务性

API Server 校验整个变更集合后原子切换。运行时校验失败则保留上一版并记录错误。启动时任何清单无效都应在接收请求前失败;静默启动会重新制造要解决的启动空窗。

运营多实例集群

把相同内容寻址 bundle 渲染到每个 API Server,一次只滚动一个实例。比较配置哈希标签和准入决策指标。哈希不一致代表漂移,应停止发布并恢复已知 bundle。

保留逃生通道

静态策略不能依赖 Service、paramKind 或其他 API 对象,因为集群状态可能尚未存在。保留带审计的主机级文件替换路径,并测试过宽或畸形策略能否在不调用 API 时回退。

高质量示范回答

“我会把静态目录作为根信任,向每个 API Server 分发签名的版本化 bundle,用静态策略拒绝修改带标签的准入资源。.static.k8s.io 名称让来源可见。运行时编辑先校验再原子切换,启动时无效 bundle 直接拒绝服务。每台服务器导出配置哈希,漂移时停止灰度。恢复走审计过的主机变更,不走 API,并覆盖启动、删除尝试、畸形更新、重启和混合 bundle 测试。”

常见错误

  • 用另一条 API 策略保护策略 → API 无法保护自身配置 → 把保护锚定在静态文件。
  • 错误编辑直接替换活动集合 → 语法错误会移除全部保护 → 校验全集合并保留上一版。
  • 带无效清单启动 → 服务器在缺少基线时运行 → 接收请求前快速失败。
  • 假设 API Server 共享文件 → 实例可能执行不同策略 → 分发 bundle 并比较哈希。
  • 移除所有运维逃生通道 → 策略 bug 变成事故 → 保留特权且有审计的主机恢复路径。

评分标准与自检

评分启动安全、策略匹配、原子更新、集群一致性、恢复和测试。强回答应说明静态配置为何能在无循环准入的情况下保护 API 对象,以及为何必须保留非 API 恢复通道。

追问及应对

API Server 在发布中重启怎么办?

保留旧 bundle,把静态准入成功加载作为 readiness 条件,重新接流量前比较报告的哈希。

静态策略能引用 Service webhook 吗?

不能。功能须在没有集群状态时自包含;可用 URL-only webhook 或不依赖 API 资源的 CEL 策略,并说明可用性取舍。

如何测试阻止自身删除的策略?

创建受保护测试对象,通过 API 尝试更新和删除,确认拒绝与审计记录,再从恢复路径替换静态 bundle,验证对象可恢复管理。

发布不变量是什么?

每台提供服务的 API Server 都执行相同的已批准 bundle 哈希,并且即使 API 拒绝配置修改,仍有至少一条经过审计的恢复路径。

公开来源

同类题目

相关面试工具

用 Solve 整理系统设计回答

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

查看工具