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 数据作为策略上下文 |
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 定义“对谁做、参数是什么”。这种设计使得策略可复用、可参数化。
2.3 Admission Webhook 原理:请求拦截与决策
Kubernetes Admission Webhook 是一种扩展 API Server 行为的机制。Gatekeeper 使用 ValidatingAdmissionWebhook 在资源持久化之前进行校验。其工作流程如下:
- 请求发起:用户通过 kubectl 或 API 调用创建/更新资源。
- API Server 拦截:API Server 将请求序列化为 AdmissionReview 对象,发送给注册的 Webhook 端点。
- Gatekeeper 处理:Webhook 接收 AdmissionReview,提取 object 和 oldObject,构造 OPA 输入。
- OPA 评估:OPA 引擎执行所有匹配的 Constraint 对应的 Rego 规则,返回 Allow 或 Deny 列表。
- 响应返回:Webhook 将决策结果封装为 AdmissionResponse,返回给 API Server。
- 最终执行:如果允许,API Server 将资源写入 etcd;否则拒绝请求并返回错误消息。
| 阶段 | 操作 | 关键数据结构 |
|---|---|---|
| Mutating | 修改资源(Gatekeeper 默认不启用) | AdmissionRequest.object |
| Validating | 校验资源(Gatekeeper 核心模式) | AdmissionRequest + Constraint 匹配 |
性能注意: Admission Webhook 是同步调用,Gatekeeper 的超时时间默认为 3 秒。如果 OPA 规则复杂或数据量大,可能导致请求超时。建议对 Rego 规则进行性能测试,并合理使用缓存。
2.4 本章小结
- OPA 是通用策略引擎,Rego 是其声明式策略语言,Gatekeeper 是 OPA 在 Kubernetes 上的原生集成。
- Gatekeeper 架构由 Controller、Webhook 和 OPA 引擎组成,通过 ConstraintTemplate 和 Constraint 两层抽象管理策略。
- Admission Webhook 是 Kubernetes 的扩展机制,Gatekeeper 利用 ValidatingAdmissionWebhook 实现同步策略校验。
- 理解 OPA 决策流程和 Webhook 请求链路,是后续配置 Gatekeeper 策略和排查问题的基础。