题干与适用场景
Kubernetes ValidatingAdmissionPolicy 使用 CEL 评估 API 请求。策略定义与绑定配合使用,绑定选择资源并定义执行动作。它提供靠近 API Server 的校验路径,但范围过宽或策略不可用可能拒绝合法的恢复操作。
假设生产命名空间有标签,镜像来源可在准入字段中取得,平台工程师负责策略。设计必须区分硬性安全规则与告警,支持试运行,并保留有审计的紧急路径。
面试官考察点
面试官关注策略定义与绑定是否分离、失败行为是否明确、资源匹配是否收窄、例外模型是否可测试。强回答会讨论 CEL 类型检查、版本化发布、审计指标,以及策略引擎或依赖数据不可用时的行为。
普通回答只写一个拒绝坏 YAML 的表达式。强回答会解释范围、动作级别、兼容性、可观测性和回滚。
回答前需要澄清的问题
- 涉及哪些 API group、版本、命名空间和操作?
- 规则检查镜像身份、摘要固定、主机访问,还是全部?
- 试点阶段应拒绝、警告还是仅审计?
- 哪些控制器或系统命名空间需要例外,谁负责批准?
- 策略阻止事故修复时,恢复路径是什么?
如果规则依赖 CEL 无法可靠访问的外部状态,应保持策略本地化,并用独立控制器完成复杂检查。如果例外范围很大,策略会产生虚假安全感。
30 秒回答框架
“我会定义小而有类型的 CEL 规则,只绑定到生产工作负载和相关操作。先以审计或警告模式运行,按负责人统计违规,再逐条转为拒绝。例外要窄、可审计,并有经过演练的紧急路径。我会监控准入延迟、拒绝率和恢复成功率;策略不安全时回滚绑定。”
分步骤深入解答
- 定义不变量。 分别编写镜像仓库白名单、摘要要求和生产禁止 hostNetwork 的规则,避免一个难测难解释的大表达式。
- 类型检查 CEL。 针对资源 schema 验证表达式,覆盖缺失字段、列表、更新和删除操作,把 fixture 纳入评审流程。
- 用绑定收窄范围。 只匹配生产命名空间、必要工作负载和需保护的操作,让团队可以独立采用不同规则。
- 选择执行动作。 先审计或警告,负责人修复后再拒绝,并把动作写入变更历史。
- 设计例外。 只豁免指定系统身份或命名空间,要求过期或批准记录,并对使用例外告警。
- 安全回滚。 策略定义版本化,回滚时禁用绑定而不是删除历史,确认文档化路径可让紧急 Deployment 继续。
替代方案包括访问外部数据的校验 webhook,或用于标准化的变更加校验组合。确定性、本地化且必须靠近 API Server 执行的不变量适合内建策略。
高质量示范回答
“我会创建三个策略:仓库白名单、镜像摘要必须存在、生产 Deployment 禁止 hostNetwork。绑定只匹配带标签的生产命名空间。试点先审计一周,给负责人发送违规报告,修正误报后再启用拒绝。平台和 break-glass 身份是唯一例外,要求过期时间和审计事件。我会告警准入延迟和被拒绝的恢复变更;事故暴露不安全规则时,通过禁用绑定回滚。”
常见错误
- 错误表现: 匹配所有命名空间和操作 → 失败原因: 系统控制器和恢复路径被阻塞 → 修正方法: 收窄绑定范围。
- 错误表现: 把警告当作强制执行 → 失败原因: 用户误以为已获得安全保证 → 修正方法: 明确动作级别和升级条件。
- 错误表现: 对缺失字段使用无类型 CEL → 失败原因: 更新和旧 API 版本行为不同 → 修正方法: 类型检查并测试缺失字段。
- 错误表现: 让例外永久存在 → 失败原因: 绕过会变成真正的策略 → 修正方法: 要求过期时间、负责人和审计。
追问及应对
策略表达式有语法错误怎么办?
Kubernetes 会验证策略定义并报告错误,不会接受无效表达式。仍应使用 fixture 评审,并在行为确认前让绑定保持审计模式。
规则需要外部漏洞数据库怎么办?
不要假设 CEL 可以获取任意外部状态。使用负责新鲜度、超时和失败语义的控制器或 webhook;本地不变量继续由内建策略执行。
拒绝规则阻止修复时,值班工程师如何恢复?
提供范围窄、有审计、带过期的 break-glass 身份或命名空间,记录批准,并对使用告警。强制前先演练。
什么时候应该移除策略?
误报持续过高、准入延迟威胁 API Server,或不变量已经由更强控制接管时,禁用或移除绑定。保留历史和指标。