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(约束模板)。三者协同工作,形成“定义 → 执行 → 审计”的闭环策略体系。

Gatekeeper 核心架构组件关系图 ConstraintTemplate CRD 定义 封装 Rego 策略逻辑 定义参数 schema 生成约束 CRD 集群级资源 Constraint(约束实例) 引用 ConstraintTemplate 传入具体参数 匹配资源类型 定义生效范围 Webhook(准入控制) ValidatingAdmissionWebhook 拦截 CREATE / UPDATE 实时执行 Rego 策略 返回 allow / deny 低延迟(ms 级) Audit(审计) 周期性扫描已有资源 对比约束规则 标记违规资源 更新 ConstraintStatus 集群管理员 定义策略模板 创建约束实例 策略定义层 准入执行层 审计合规层 约束实例

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 的三个组件并非孤立运行,而是形成完整的策略生命周期:

  1. 定义阶段:管理员创建 ConstraintTemplate(策略模板)和 Constraint(约束实例)
  2. 执行阶段:Webhook 实时拦截新资源请求,执行 Rego 策略,返回 allow/deny
  3. 审计阶段:Audit 周期性扫描集群已有资源,发现违规并更新状态
  4. 反馈阶段:管理员通过 ConstraintStatus 查看违规详情,进行人工干预或自动化修复
Gatekeeper 策略生命周期流程 ① 定义 创建 ConstraintTemplate 创建 Constraint ② 执行 Webhook 拦截请求 Rego 策略判定 ③ 审计 周期性扫描存量资源 标记违规 ④ 反馈 查看状态 人工干预 策略迭代优化(反馈闭环)
注意:Webhook 和 Audit 使用同一套 Constraint 定义,但执行路径不同。Webhook 是同步阻塞,Audit 是异步扫描。如果 Webhook 因超时或故障跳过检查,Audit 会在下一周期发现违规并记录,但不会自动回滚已创建的资源——这正是本课程后续“回滚策略集成”要解决的问题。

组件对比总结

组件 类型 触发方式 覆盖范围 延迟 失败影响
ConstraintTemplate CRD 定义 管理员创建 全局 无 策略无法加载
Webhook 准入控制 API 请求时同步触发 新资源 CREATE/UPDATE 1-10ms 可能放行违规资源
Audit 后台扫描 定时(默认 60s) 所有已有资源 分钟级 延迟发现违规
关键认知:Gatekeeper 的架构设计遵循“防御纵深”原则——Webhook 提供第一道防线(实时拦截),Audit 提供第二道防线(事后发现),ConstraintTemplate 提供统一的策略定义标准。三组件缺一不可,共同构成生产可用的策略门禁系统。