2. Gatekeeper 架构基础:OPA 与 Gatekeeper 的关系、Admission Webhook 工作流程、核心组件解析
2.1 OPA 与 Gatekeeper 的关系
Open Policy Agent(OPA)是一个通用的、开源的策略引擎,它将策略决策与策略执行解耦。Gatekeeper 是 OPA 在 Kubernetes 环境中的原生集成实现,作为 Kubernetes 的准入控制器(Admission Controller) 运行。
| 维度 | OPA(通用策略引擎) | Gatekeeper(Kubernetes 集成) |
|---|---|---|
| 定位 | 通用策略决策引擎,支持多种数据源(K8s、HTTP、SQL 等) | 专为 Kubernetes 设计的准入控制器,基于 OPA 实现 |
| 策略语言 | Rego | Rego(通过 ConstraintTemplate 封装) |
| 部署方式 | Sidecar、DaemonSet、独立服务 | Kubernetes Admission Webhook(Mutating / Validating) |
| 数据输入 | 通过 API 推送或拉取数据 | 自动注入 Kubernetes 资源对象(AdmissionReview) |
| 策略管理 | 手动管理 Rego 文件 | CRD 驱动(ConstraintTemplate + Constraint) |
| 缓存机制 | 无内置缓存 | 内置 OPA 缓存 + 审计缓存 |
核心结论:Gatekeeper = OPA 引擎 + Kubernetes CRD 策略管理 + Admission Webhook 生命周期。OPA 负责策略评估,Gatekeeper 负责策略的声明式定义、注入与强制执行。
2.2 Admission Webhook 工作流程
Kubernetes API Server 在处理资源请求(CREATE / UPDATE / DELETE)时,会依次经过认证、鉴权、准入控制(Admission)三个阶段。Gatekeeper 作为 ValidatingAdmissionWebhook 和 MutatingAdmissionWebhook 注册在准入控制链中。
性能关键点:Webhook 调用是同步阻塞的。API Server 会等待 Gatekeeper 返回 AdmissionReview 响应(allow / deny + 补丁)。Gatekeeper 的响应延迟直接影响整个集群的 API 请求吞吐量。冷启动时 OPA 缓存未命中,会导致首次策略评估延迟显著增加。
2.3 核心组件解析
Gatekeeper 由三个核心 CRD 组件和两个运行时组件构成,它们共同协作完成策略的声明式定义、注入、评估与审计。
2.3.1 核心 CRD 组件
| CRD 名称 | 作用 | 关键字段 | 生命周期 |
|---|---|---|---|
| ConstraintTemplate | 定义 Rego 策略模板,描述策略逻辑和参数 schema | spec.crd.spec(参数 schema)、spec.targets.rego(策略代码) |
集群级,一次定义,多次复用 |
| Constraint | 实例化 ConstraintTemplate,传入具体参数,匹配目标资源 | spec.match(资源选择器)、spec.parameters(策略参数) |
集群级,按需创建/更新/删除 |
| Config | 配置 Gatekeeper 运行时行为,如同步白名单、审计设置 | spec.sync.syncOnly(同步资源类型)、spec.audit(审计间隔) |
集群级,全局生效 |
2.3.2 运行时组件
- gatekeeper-controller-manager:核心控制器,负责:
- 监听 ConstraintTemplate / Constraint / Config 等 CRD 变化
- 编译 Rego 策略并注入 OPA 引擎
- 管理 Webhook 注册与证书轮换
- 触发审计扫描
- gatekeeper-audit:审计组件,定期对集群已有资源进行策略合规性检查,生成
violations状态
2.3.3 组件交互关系
2.3.4 冷启动关键路径
冷启动瓶颈预警:在 Gatekeeper 首次启动或 CRD 变更时,Controller Manager 需要重新编译所有 ConstraintTemplate 中的 Rego 策略并注入 OPA 引擎。此过程涉及大量 AST 解析、编译和缓存预热。如果集群中存在大量 ConstraintTemplate(例如 50+),首次编译耗时可能达到 10~30 秒,导致 Webhook 在此期间无法正常响应。
- CRD 同步阶段:Controller Manager 从 API Server 拉取所有 ConstraintTemplate 和 Constraint 对象
- Rego 编译阶段:将 Rego 源码编译为 OPA 内部 IR(Intermediate Representation)
- 缓存注入阶段:将编译后的策略注入 OPA 引擎的
data缓存 - Webhook 就绪阶段:等待所有策略就绪后,Webhook 才返回 Ready 状态
- 首次评估阶段:第一个 AdmissionReview 请求触发 OPA 缓存命中,若未命中则回退到实时编译