4. Gatekeeper 组件架构:Controller Manager、Audit Controller、Webhook Server、Constraint Template 与 Constraint

OPA Gatekeeper 是 Kubernetes 的 可审计、可策略、可扩展 的准入控制与合规核验引擎。其组件架构围绕 策略定义、实时拦截、周期性审计 与 状态管理 四个核心职责展开。理解每个组件的角色与协作关系,是集成资源模型实现基线核验的基础。

核心原则:Gatekeeper 将 OPA 的 Rego 策略封装为 Kubernetes 原生 CRD(Constraint Template),再通过 Constraint 实例化策略规则。所有组件均运行在集群内,无需外部依赖。

4.1 组件全景与协作关系

Gatekeeper 由四个主要组件构成,它们共同实现了从策略注册、实时校验到合规审计的闭环。下图展示了各组件的逻辑架构与数据流。

Gatekeeper 组件架构与协作关系图 Gatekeeper 组件架构与协作关系 Kubernetes API Server 资源创建/更新/删除请求 Webhook Server ValidatingAdmissionWebhook Controller Manager ConstraintTemplate / Constraint 控制器 Audit Controller 周期性合规审计 ConstraintTemplate (CRD) Constraint (CR 实例) OPA Engine (Rego 策略) 准入请求 同步状态 注册/更新 实例化 加载策略 审计查询 审计结果写入 说明: 1. 所有组件运行在同一个 Pod 内(gatekeeper-controller-manager),通过本地通信。 2. Webhook Server 处理实时准入请求;Audit Controller 定期扫描集群现有资源。 3. ConstraintTemplate 定义策略逻辑(Rego),Constraint 提供策略参数与作用范围。

4.2 Gatekeeper Controller Manager

Controller Manager 是 Gatekeeper 的 核心协调器,负责管理所有 CRD 资源的生命周期。它运行在 gatekeeper-controller-manager Pod 中,包含多个子控制器。

子控制器 职责 监听资源
ConstraintTemplate Controller 注册/更新/删除 ConstraintTemplate CRD,编译 Rego 策略 constrainttemplates.gatekeeper.sh
Constraint Controller 管理 Constraint 实例,将策略绑定到目标资源 constraints.gatekeeper.sh(动态 CRD)
Status Controller 更新 Constraint 和 ConstraintTemplate 的状态(violations、byPod) 所有 Gatekeeper CRD
Sync Controller 将集群资源缓存到 OPA 引擎,供 Rego 策略查询 用户配置的同步资源(如 Namespace、Pod)
关键点:Controller Manager 通过 leader election 保证高可用。多副本部署时,只有一个实例执行协调逻辑,其余副本处于待命状态。

4.3 Webhook Server

Webhook Server 是 Gatekeeper 的 实时准入拦截器。它作为 Kubernetes ValidatingAdmissionWebhook 注册,在资源创建、更新、删除时被 API Server 调用。

  • 工作流程:
    1. API Server 将准入请求(AdmissionReview)发送到 Webhook Server 的 /v1/admit 端点。
    2. Webhook Server 提取请求中的资源对象(Object)和旧对象(OldObject)。
    3. 将请求数据注入 OPA 引擎,执行所有匹配的 Constraint 策略。
    4. 返回 allowed: true/false 及拒绝消息。
  • 超时与容错:默认超时 3 秒;超时或不可用时,API Server 根据 failurePolicy(Fail/Ignore)决定是否放行。
  • TLS 安全:Webhook Server 使用 TLS 证书与 API Server 通信,证书由 Gatekeeper 自带的证书管理器自动轮换。
注意:Webhook Server 只拦截 写操作(CREATE、UPDATE、DELETE)。对于只读操作(GET、LIST)和审计场景,由 Audit Controller 负责。

4.4 Audit Controller

Audit Controller 是 Gatekeeper 的 合规审计引擎,负责对集群中 已有资源 进行周期性策略核验。它弥补了 Webhook 只拦截实时请求的不足,确保历史资源也符合基线要求。

属性 说明
审计周期 默认每 60 秒执行一次(可通过 --audit-interval 调整)
审计范围 集群中所有匹配 Constraint match 字段的资源
结果存储 写入 Constraint 的 status.violations 字段,包含违规资源名称、命名空间、消息
审计缓存 使用 OPA 引擎的缓存数据,避免重复调用 API Server
审计模式 支持 dryrun(仅记录,不拦截)和 warn(返回警告)
基线核验场景:在集成资源模型时,Audit Controller 可用于扫描所有现有 Deployment 是否设置了 resources.limits 和 securityContext,并将违规结果暴露给监控系统(如 Prometheus)。

4.5 Constraint Template

Constraint Template 是 Gatekeeper 的 策略模板,它是一个 Kubernetes CRD,定义了策略的 逻辑结构 和 Rego 代码。用户通过编写 ConstraintTemplate 来声明一类策略规则。

apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
  name: k8srequiredlabels
spec:
  crd:
    spec:
      names:
        kind: K8sRequiredLabels          # 生成的 Constraint CRD 名称
      validation:
        openAPIV3Schema:
          type: object
          properties:
            labels:
              type: array
              items:
                type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8srequiredlabels

        violation[{"msg": msg}] {
          input.review.object.metadata.labels == null
          msg := "资源必须包含标签"
        }

        violation[{"msg": msg}] {
          required := input.parameters.labels[_]
          not input.review.object.metadata.labels[required]
          msg := sprintf("缺少必要标签: %v", [required])
        }
  • CRD 生成:每个 ConstraintTemplate 会自动生成一个同名的 CRD(如 K8sRequiredLabels),用户通过创建该 CRD 的实例来应用策略。
  • Rego 策略:violation 规则返回违规消息;input.parameters 接收 Constraint 传入的参数。
  • 版本管理:更新 ConstraintTemplate 时,Controller Manager 会重新编译 Rego 并更新所有关联的 Constraint。

4.6 Constraint

Constraint 是 ConstraintTemplate 的 具体实例,它提供了策略的 参数值 和 匹配范围。一个 ConstraintTemplate 可以被实例化为多个 Constraint,每个 Constraint 针对不同的资源或命名空间。

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: require-labels-prod
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces: ["production"]
  parameters:
    labels:
      - "app"
      - "env"
      - "owner"
字段 说明 示例
match 定义策略作用的资源范围(kinds、namespaces、labelSelector、namespaceSelector) kinds: ["Pod"] + namespaces: ["production"]
parameters 传递给 Rego 策略的参数,由 ConstraintTemplate 的 openAPIV3Schema 定义结构 labels: ["app", "env"]
enforcementAction 策略执行模式:deny(拦截)、dryrun(仅审计)、warn(警告) enforcementAction: deny
status 由 Audit Controller 和 Webhook Server 自动填充,包含违规列表和每个 Gatekeeper 实例的状态 status.violations
最佳实践:在资源模型基线核验中,建议为不同环境(dev/staging/prod)创建独立的 Constraint,并利用 namespaceSelector 或 labelSelector 精确控制策略范围,避免误拦截。

4.7 组件协作流程总结

下图展示了从策略定义到审计结果输出的完整协作流程,帮助理解各组件在基线核验中的具体角色。

Gatekeeper 策略执行与审计流程 Gatekeeper 策略执行与审计流程 1. 创建 ConstraintTemplate 2. 创建 Constraint 3. 策略加载到 OPA 4. 就绪 实时路径:Webhook 拦截 审计路径:Audit 扫描 允许/拒绝 / 违规记录 status.violations 更新 两条路径共享同一套 Constraint 和 Rego 策略,确保实时拦截与审计结果一致。
架构要点回顾:
  • Controller Manager 负责策略的生命周期管理(CRD 注册、Rego 编译、状态同步)。
  • Webhook Server 提供实时准入控制,延迟敏感(毫秒级)。
  • Audit Controller 提供周期性合规审计,适合基线核验和批量扫描。
  • ConstraintTemplate 定义策略逻辑(Rego),Constraint 提供参数和匹配范围。