2. Gatekeeper 基础:OPA 与 Rego 简介、Gatekeeper 架构、Admission Webhook 原理

2.1 OPA 与 Rego:策略引擎与策略语言

Open Policy Agent (OPA) 是一个开源的、通用的策略引擎,它将策略决策与业务逻辑解耦。OPA 不负责执行策略,而是根据输入数据和策略规则输出决策结果(Allow / Deny / 修改)。在 Kubernetes 生态中,OPA 是 Gatekeeper 的核心决策组件。

Rego 是 OPA 的原生声明式查询语言,专门用于定义策略。Rego 的核心理念是:策略即代码。它通过查询文档(Document)的方式,对输入数据进行模式匹配和逻辑判断。

关键概念: OPA 将策略决策建模为“输入 + 规则 = 输出”。输入是 JSON 对象(如 AdmissionReview),规则是 Rego 文件,输出是 Allow/Deny 及附带消息。

Rego 策略示例:禁止使用 latest 镜像标签

package k8s.images

violation[{"msg": msg}] {
    input.request.operation == "CREATE"
    container := input.request.object.spec.containers[_]
    endswith(container.image, ":latest")
    msg := sprintf("镜像 %v 禁止使用 latest 标签", [container.image])
}
组件 角色 说明
OPA 策略引擎 接收输入,执行 Rego 规则,返回决策
Rego 策略语言 声明式查询,支持模式匹配、迭代、聚合
Data 外部数据 OPA 可加载 JSON 数据作为策略上下文
OPA 决策流程 输入 (Input) Rego 规则 外部数据 OPA 引擎 决策输出 AdmissionReview JSON 集群数据 / 配置

2.2 Gatekeeper 架构:组件与职责

Gatekeeper 是 OPA 在 Kubernetes 上的原生集成实现,它利用 Admission Webhook 机制拦截资源请求,并委托 OPA 进行策略评估。Gatekeeper 由三个核心组件构成:

  • Gatekeeper Controller:管理 ConstraintTemplate 和 Constraint 资源的生命周期,负责将 Rego 模板编译为 OPA 可执行的规则。
  • Gatekeeper Webhook:注册到 Kubernetes API Server 的 ValidatingAdmissionWebhook,拦截资源创建/更新请求,发送 AdmissionReview 给 OPA 引擎。
  • OPA 引擎(内置):嵌入在 Gatekeeper Pod 中,执行 Rego 策略并返回决策。
CRD 名称 用途 示例
ConstraintTemplate 定义 Rego 策略模板和参数 schema K8sRequiredLabels
Constraint 实例化模板,绑定具体参数和匹配范围 require-team-label
架构要点: Gatekeeper 采用“模板-约束”两层抽象。ConstraintTemplate 定义“做什么检查”,Constraint 定义“对谁做、参数是什么”。这种设计使得策略可复用、可参数化。
Gatekeeper 核心架构 API Server Webhook Controller OPA 引擎 ConstraintTemplate Constraint 拦截请求 → 转发 AdmissionReview 编译模板 → 管理约束实例

2.3 Admission Webhook 原理:请求拦截与决策

Kubernetes Admission Webhook 是一种扩展 API Server 行为的机制。Gatekeeper 使用 ValidatingAdmissionWebhook 在资源持久化之前进行校验。其工作流程如下:

  1. 请求发起:用户通过 kubectl 或 API 调用创建/更新资源。
  2. API Server 拦截:API Server 将请求序列化为 AdmissionReview 对象,发送给注册的 Webhook 端点。
  3. Gatekeeper 处理:Webhook 接收 AdmissionReview,提取 object 和 oldObject,构造 OPA 输入。
  4. OPA 评估:OPA 引擎执行所有匹配的 Constraint 对应的 Rego 规则,返回 Allow 或 Deny 列表。
  5. 响应返回:Webhook 将决策结果封装为 AdmissionResponse,返回给 API Server。
  6. 最终执行:如果允许,API Server 将资源写入 etcd;否则拒绝请求并返回错误消息。
阶段 操作 关键数据结构
Mutating 修改资源(Gatekeeper 默认不启用) AdmissionRequest.object
Validating 校验资源(Gatekeeper 核心模式) AdmissionRequest + Constraint 匹配
性能注意: Admission Webhook 是同步调用,Gatekeeper 的超时时间默认为 3 秒。如果 OPA 规则复杂或数据量大,可能导致请求超时。建议对 Rego 规则进行性能测试,并合理使用缓存。
Admission Webhook 请求流程 用户 / kubectl API Server Webhook OPA 引擎 etcd 流程说明 ① 用户请求 → ② API Server 拦截 → ③ Webhook 转发 AdmissionReview ④ OPA 评估 → ⑤ 返回 Allow/Deny → ⑥ 写入 etcd 或拒绝

2.4 本章小结

  • OPA 是通用策略引擎,Rego 是其声明式策略语言,Gatekeeper 是 OPA 在 Kubernetes 上的原生集成。
  • Gatekeeper 架构由 Controller、Webhook 和 OPA 引擎组成,通过 ConstraintTemplate 和 Constraint 两层抽象管理策略。
  • Admission Webhook 是 Kubernetes 的扩展机制,Gatekeeper 利用 ValidatingAdmissionWebhook 实现同步策略校验。
  • 理解 OPA 决策流程和 Webhook 请求链路,是后续配置 Gatekeeper 策略和排查问题的基础。