3. Gatekeeper 组件架构:Admission Controller、Constraint Framework、Constraint Template

OPA Gatekeeper 的核心架构围绕三个关键组件构建:Admission Controller(准入控制器)、Constraint Framework(约束框架)和 Constraint Template(约束模板)。三者协同工作,将策略定义、策略实例化与策略执行解耦,形成可扩展、可复用的策略引擎体系。

架构核心原则: 策略即代码(Policy as Code)。通过声明式模板定义策略逻辑,通过 CRD 实例化策略规则,通过 Webhook 拦截并评估所有资源变更请求。

3.1 组件总览与职责划分

下表清晰展示了三个核心组件在 Gatekeeper 架构中的角色与职责:

组件 类型 核心职责 关键对象
Admission Controller Kubernetes Webhook 拦截资源变更请求,调用 OPA 引擎执行策略评估,决定允许或拒绝 ValidatingWebhookConfiguration, MutatingWebhookConfiguration
Constraint Framework CRD + Controller 管理约束的生命周期,将 ConstraintTemplate 实例化为可执行的 Constraint 对象 ConstraintTemplate, Constraint, Config
Constraint Template CRD 定义 使用 Rego 语言编写策略逻辑,定义参数 schema,作为策略的“类” ConstraintTemplate (CRD)
理解要点: ConstraintTemplate 相当于面向对象编程中的“类”,Constraint 则是“实例”。Admission Controller 是策略执行的“触发器”和“裁判”。

3.2 组件交互流程与架构图

下图展示了 Gatekeeper 组件之间的核心交互流程,从资源请求到策略评估的完整链路:

Gatekeeper 组件架构与交互流程 kube-apiserver 资源变更请求 Admission Controller ValidatingWebhook OPA 策略引擎 Rego 策略评估 允许/拒绝决策 Constraint Framework(约束框架) ConstraintTemplate Rego 策略逻辑 + 参数 Schema Constraint (CRD 实例) 参数化策略规则 同步策略 用户通过 kubectl apply -f constraint.yaml 创建 Constraint 实例,Gatekeeper Controller 自动将其编译为 OPA 可执行的策略规则

3.3 Admission Controller:策略执行的守门人

Admission Controller 是 Gatekeeper 与 Kubernetes API Server 交互的桥梁。它通过注册 ValidatingWebhookConfiguration 来拦截资源创建、更新、删除等操作。

  • 工作模式: 仅支持 ValidatingAdmissionWebhook(验证准入),不支持 MutatingAdmissionWebhook(变更准入)。所有策略评估结果直接决定请求是否被允许。
  • 超时控制: Webhook 调用必须在 30 秒内完成,否则 API Server 会超时并允许请求通过(fail-open 策略需谨慎配置)。
  • 失败策略: 支持 Fail(严格模式,Webhook 不可用时拒绝所有请求)和 Ignore(宽松模式,Webhook 不可用时允许请求)。生产环境建议使用 Fail。
  • 资源过滤: 可通过 namespaceSelector 和 objectSelector 精确控制哪些资源需要经过策略评估,降低集群控制面压力。
生产注意事项: 如果 Gatekeeper 组件故障或网络不可达,且失败策略设置为 Fail,整个集群的资源变更操作将被阻塞。建议部署多个 Gatekeeper 副本(至少 2 个),并配置 PodDisruptionBudget 保障高可用。

3.4 Constraint Framework:策略的生命周期管理者

Constraint Framework 是 Gatekeeper 的核心控制平面,负责将 ConstraintTemplate 实例化为可执行的 Constraint 对象,并管理其生命周期。

组件对象 API 版本 作用域 描述
ConstraintTemplate templates.gatekeeper.sh/v1 集群级 定义策略逻辑(Rego)和参数结构(OpenAPI v3 schema),是策略的“蓝图”
Constraint constraints.gatekeeper.sh/v1beta1 集群级 ConstraintTemplate 的实例化对象,通过 spec.parameters 传入具体参数
Config config.gatekeeper.sh/v1alpha1 命名空间级 配置 Gatekeeper 的同步白名单、排除规则等运行时行为

Constraint Framework 的核心工作流程:

  1. 用户创建 ConstraintTemplate 对象,定义 Rego 策略逻辑和参数 schema。
  2. Gatekeeper Controller 监听到 ConstraintTemplate 创建事件,自动生成对应的 CRD(Custom Resource Definition)。
  3. 用户创建 Constraint 对象(即新 CRD 的实例),传入具体参数(如允许的仓库列表、必需的标签等)。
  4. Controller 将 Constraint 编译为 OPA 可执行的规则,并注入到 OPA 引擎中。
  5. Admission Controller 在收到资源请求时,从 OPA 引擎获取评估结果。

3.5 Constraint Template:策略逻辑的载体

ConstraintTemplate 是 Gatekeeper 策略能力的核心抽象。它使用 Rego 语言编写策略逻辑,并通过 OpenAPI v3 schema 定义可配置的参数。

一个典型的 ConstraintTemplate 结构如下:

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

        violation[{"msg": msg}] {
          provided := {label | input.review.object.metadata.labels[label]}
          required := {label | label := input.parameters.labels[_]}
          missing := required - provided
          count(missing) > 0
          msg := sprintf("缺少必需的标签: %v", [missing])
        }
关键设计要点:
  • spec.crd.spec.names.kind 定义了 Constraint 的 CRD 类型名称,用户后续创建 Constraint 时使用该 kind。
  • spec.crd.spec.validation.openAPIV3Schema 定义了参数结构,Gatekeeper 会自动校验用户传入的参数是否符合 schema。
  • spec.targets[0].rego 是策略逻辑主体,使用 Rego 语言编写,input.review 是准入审查对象,input.parameters 是用户传入的参数。
  • Rego 中的 violation 规则是 Gatekeeper 的约定:如果规则产生输出,则判定为违反策略。

3.6 组件协作的完整数据流

下图展示了从 ConstraintTemplate 定义到最终策略评估的完整数据流,帮助理解三个组件如何协同工作:

Gatekeeper 组件协作数据流 ① ConstraintTemplate Rego 策略 + 参数 Schema kubectl apply -f template.yaml ② CRD 自动注册 Gatekeeper Controller 生成 K8sRequiredLabels CRD ③ Constraint 传入参数 kubectl apply -f constraint.yaml ④ 策略编译与注入 Controller 编译 Rego → OPA 缓存 OPA 引擎就绪 ⑤ Admission Controller 拦截请求 → OPA 评估 → 允许/拒绝
架构优势总结:
  • 解耦性: 策略逻辑(Template)与策略规则(Constraint)分离,同一模板可复用生成多个不同参数的约束。
  • 可扩展性: 用户无需修改 Gatekeeper 核心代码,只需编写 Rego 模板即可扩展任意策略。
  • 声明式管理: 所有策略都是 Kubernetes 原生 CRD 对象,可通过 GitOps 流程进行版本管理和审计。
  • 性能优化: 策略编译在 Controller 中完成,Admission Controller 仅做轻量级评估调用,减少 Webhook 延迟。