OPA Gatekeeper与回滚策略集成的变更门禁部署 - 第2节
OPA 与 Gatekeeper 的关系
在 Kubernetes 策略引擎生态中,OPA(Open Policy Agent) 是通用策略引擎,而 Gatekeeper 是 OPA 在 Kubernetes 上的原生集成实现。理解两者关系是掌握 Gatekeeper 架构的前提。
| 维度 | OPA(Open Policy Agent) | Gatekeeper |
|---|---|---|
| 定位 | 通用策略引擎,适用于微服务、API 网关、CI/CD、K8s 等 | Kubernetes 专用策略控制器,基于 OPA 构建 |
| 策略语言 | Rego | Rego(通过 ConstraintTemplate 封装) |
| 部署方式 | Sidecar、独立服务、库嵌入 | Admission Webhook + CRD 控制器 |
| K8s 原生性 | 需手动集成 Admission Webhook | 原生 CRD + Webhook + Audit,开箱即用 |
| 策略管理 | 通过 API 或文件加载策略 | 通过 Kubernetes 资源(Constraint/ConstraintTemplate)管理 |
| 审计能力 | 需自行实现 | 内置周期性审计,自动标记违规资源 |
核心结论:Gatekeeper 是 OPA 在 Kubernetes 生态中的“策略控制器实现”,它将 OPA 的通用策略能力封装为 Kubernetes 原生资源模型,使运维人员无需手动管理 Webhook 配置或 Rego 文件加载。
Gatekeeper 架构组件
Gatekeeper 由三个核心组件构成:Audit(审计)、Webhook(准入控制)、ConstraintTemplate(约束模板)。三者协同工作,形成“定义 → 执行 → 审计”的闭环策略体系。
1. ConstraintTemplate(约束模板)
ConstraintTemplate 是 Gatekeeper 的策略定义层,本质上是一个 CustomResourceDefinition(CRD)。它封装了 Rego 策略逻辑和参数 schema,是策略的“蓝图”。
- Rego 策略体:使用 Rego 语言编写,定义违规判定逻辑
- 参数 schema:使用 OpenAPI v3 格式定义约束实例可传入的参数
- 目标资源类型:指定该策略作用于哪些 Kubernetes 资源(如 Pod、Service、Namespace)
- 自动生成 CRD:创建 ConstraintTemplate 后,Gatekeeper 自动生成对应的约束 CRD
# ConstraintTemplate 示例:禁止特权容器
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8spspprivilegedcontainer
spec:
crd:
spec:
names:
kind: K8sPSPPrivilegedContainer
validation:
openAPIV3Schema:
type: object
properties:
exemptImages:
type: array
items:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8spspprivilegedcontainer
violation[{"msg": msg}] {
container := input.review.object.spec.containers[_]
container.securityContext.privileged == true
msg := sprintf("容器 %v 设置了 privileged=true,禁止运行", [container.name])
}
2. Webhook(准入控制)
Webhook 是 Gatekeeper 的 实时策略执行层。它通过 Kubernetes ValidatingAdmissionWebhook 机制,在资源创建或更新时拦截请求,执行 Rego 策略判定。
| 特性 | 说明 |
|---|---|
| 触发时机 | CREATE、UPDATE 操作(默认不拦截 DELETE) |
| 执行流程 | API Server → Webhook → 执行所有匹配的 Constraint → 返回 allow/deny |
| 超时控制 | 默认 3 秒超时,超时后默认 allow(failurePolicy: Ignore) |
| 匹配规则 | 按资源类型、操作、Namespace 标签选择器匹配 |
| 性能要求 | 单次判定通常在 1-10ms 内完成 |
最佳实践:Webhook 的 failurePolicy 建议设置为
Ignore,避免 Gatekeeper 自身故障导致整个集群无法写入资源。关键策略可通过 Audit 审计兜底。
3. Audit(审计)
Audit 是 Gatekeeper 的 合规扫描层,弥补 Webhook 无法覆盖的场景(如已存在的资源、Webhook 超时绕过、DELETE 操作)。
- 扫描周期:默认每 60 秒扫描一次集群中所有已有资源
- 违规标记:将违规结果写入
ConstraintStatus对象的violations字段 - 审计结果查询:通过
kubectl get constraintstatus查看 - 与 Webhook 互补:Webhook 拦截新请求,Audit 扫描存量资源
# 查看审计结果
kubectl get constraintstatus K8sPSPPrivilegedContainer -o yaml
# 输出示例(简化)
apiVersion: status.gatekeeper.sh/v1beta1
kind: ConstraintStatus
metadata:
name: k8spspprivilegedcontainer
status:
auditTimestamp: "2025-01-15T10:30:00Z"
violations:
- enforcementAction: deny
kind: Pod
name: privileged-pod-xyz
namespace: default
message: "容器 nginx 设置了 privileged=true,禁止运行"
三组件协作流程
Gatekeeper 的三个组件并非孤立运行,而是形成完整的策略生命周期:
- 定义阶段:管理员创建 ConstraintTemplate(策略模板)和 Constraint(约束实例)
- 执行阶段:Webhook 实时拦截新资源请求,执行 Rego 策略,返回 allow/deny
- 审计阶段:Audit 周期性扫描集群已有资源,发现违规并更新状态
- 反馈阶段:管理员通过 ConstraintStatus 查看违规详情,进行人工干预或自动化修复
注意:Webhook 和 Audit 使用同一套 Constraint 定义,但执行路径不同。Webhook 是同步阻塞,Audit 是异步扫描。如果 Webhook 因超时或故障跳过检查,Audit 会在下一周期发现违规并记录,但不会自动回滚已创建的资源——这正是本课程后续“回滚策略集成”要解决的问题。
组件对比总结
| 组件 | 类型 | 触发方式 | 覆盖范围 | 延迟 | 失败影响 |
|---|---|---|---|---|---|
| ConstraintTemplate | CRD 定义 | 管理员创建 | 全局 | 无 | 策略无法加载 |
| Webhook | 准入控制 | API 请求时同步触发 | 新资源 CREATE/UPDATE | 1-10ms | 可能放行违规资源 |
| Audit | 后台扫描 | 定时(默认 60s) | 所有已有资源 | 分钟级 | 延迟发现违规 |
关键认知:Gatekeeper 的架构设计遵循“防御纵深”原则——Webhook 提供第一道防线(实时拦截),Audit 提供第二道防线(事后发现),ConstraintTemplate 提供统一的策略定义标准。三组件缺一不可,共同构成生产可用的策略门禁系统。