3. Gatekeeper 架构与组件:核心资源的关系与生命周期

OPA Gatekeeper 是 Kubernetes 的 可审计、可执行的准入控制器,其架构围绕四个核心 CRD(Custom Resource Definition)构建:ConstraintTemplate、Constraint、Config,以及由 Operator 模式实现的 Gatekeeper Controller 和 Admission Webhook。理解这些组件之间的依赖关系与生命周期,是编写可靠约束规则的基础。

3.1 组件全景与职责

下表总结了每个组件在 Gatekeeper 系统中的角色与生命周期特征:

组件 API 类型 核心职责 生命周期
Gatekeeper Controller Deployment(Operator) 协调所有 CRD 状态,监听资源变更,触发 Reconcile 循环 由 Helm/Kustomize 安装,持续运行
Admission Webhook ValidatingWebhookConfiguration 拦截 API Server 请求,执行 OPA 策略评估 随 Controller 自动注册,动态更新
ConstraintTemplate CRD(集群级) 定义 Rego 策略模板,生成对应的 CRD 类型 创建后生成新 CRD,删除后清理所有关联 Constraint
Constraint CRD 实例(集群级) 实例化模板,绑定参数与资源选择器,执行准入检查 依赖 ConstraintTemplate 存在,删除后停止检查
Config CRD(命名空间级) 配置 Controller 行为(如排除命名空间、同步模式) 独立管理,影响 Webhook 与审计行为
关键理解: Gatekeeper 本身是一个 Operator,它通过监听 CRD 的变化来动态生成新的 CRD(由 ConstraintTemplate 驱动),再通过 Admission Webhook 拦截请求并执行由 Constraint 实例化的 Rego 策略。

3.2 组件关系与数据流

下图展示了 Gatekeeper 核心组件之间的依赖关系与请求处理流程:

Gatekeeper 核心组件关系与数据流 Gatekeeper 核心组件关系与数据流 Kubernetes API Server Admission Webhook Gatekeeper Controller ConstraintTemplate Constraint Config OPA Engine (缓存) 准入请求 评估请求 监听 监听 读取 生成 CRD 编译策略 缓存查询 说明: 实线表示直接依赖或请求路径,虚线表示缓存查询路径。Controller 同时监听 ConstraintTemplate 和 Constraint 的变化, 当模板或约束变更时,自动重新编译 OPA 策略并更新 Webhook 配置。

3.3 核心资源生命周期详解

3.3.1 ConstraintTemplate 的生命周期

  1. 创建:用户提交 ConstraintTemplate 资源,Gatekeeper Controller 检测到后,解析 Rego 代码并动态生成一个对应的 CRD(Custom Resource Definition)。
  2. 就绪:CRD 注册成功后,Controller 将 ConstraintTemplate 的状态标记为 Active,此时可以创建该模板的 Constraint 实例。
  3. 更新:修改模板中的 Rego 代码或参数 schema 时,Controller 会重新编译策略,并触发所有关联 Constraint 的重新评估。
  4. 删除:删除 ConstraintTemplate 时,Controller 会级联删除所有基于该模板创建的 Constraint 实例,并清理对应的 CRD。
重要约束: 删除 ConstraintTemplate 会导致其所有 Constraint 实例被强制清理,且不可恢复。在生产环境中,建议先删除所有关联的 Constraint,再删除模板。

3.3.2 Constraint 的生命周期

  1. 创建:用户创建 Constraint 实例时,必须指定 spec.match(资源选择器)和 spec.parameters(模板参数)。Controller 验证实例与模板 schema 匹配后,将其注册到 OPA 引擎。
  2. 生效:Constraint 被编译为 OPA 规则,Admission Webhook 开始拦截匹配的资源请求并执行策略检查。
  3. 更新:修改 spec.match 或 spec.parameters 时,Controller 重新编译该约束,Webhook 立即使用新规则。
  4. 删除:删除 Constraint 后,Controller 从 OPA 引擎中移除对应规则,Webhook 停止对该约束的检查。

3.3.3 Config 资源的生命周期

Config 资源用于控制 Gatekeeper 的运行时行为,其生命周期独立于策略资源:

  • 创建:在 gatekeeper-system 命名空间(或自定义命名空间)中创建 Config 资源,Controller 读取后应用配置。
  • 更新:修改 spec.sync(同步模式)、spec.match(排除命名空间)等字段时,Controller 动态调整行为,无需重启。
  • 删除:删除 Config 资源后,Controller 恢复为默认配置(通常为全量同步、无排除)。

3.4 组件依赖关系总结

下图以层级依赖的方式展示组件之间的创建与依赖顺序:

Gatekeeper 组件依赖层级 Gatekeeper 组件依赖层级 层级 1:Gatekeeper Controller + Admission Webhook 层级 2:ConstraintTemplate(定义策略模板) 层级 3:Constraint(实例化策略规则) 层级 4:Config(运行时配置) 依赖方向:下层组件必须在上层组件就绪后才能正常工作

3.5 生命周期管理最佳实践

生产环境建议:
  • 版本控制:将 ConstraintTemplate 和 Constraint 的 YAML 文件纳入 GitOps 管理,使用 kubectl apply --server-side 确保一致性。
  • 灰度发布:通过 spec.enforcementAction: dryrun 先进行试运行,确认无意外拒绝后再切换为 deny。
  • 审计先行:在启用 Webhook 强制执行前,先使用 kubectl gatekeeper audit 检查现有资源是否违反约束。
  • Config 隔离:为不同环境(开发/预发/生产)使用独立的 Config 资源,避免排除命名空间配置混乱。

3.6 常见生命周期问题排查

现象 可能原因 排查步骤
Constraint 创建后不生效 ConstraintTemplate 未就绪或 Rego 语法错误 kubectl get constrainttemplate 检查状态;kubectl describe constrainttemplate <name> 查看错误
Webhook 拒绝所有请求 Constraint 配置过于严格或 match 范围过大 检查 Constraint 的 spec.match 字段;临时删除 Constraint 测试
删除 ConstraintTemplate 后残留 CRD Controller 异常或 CRD 被手动修改 手动清理 CRD:kubectl delete crd <crd-name>
Config 修改后未生效 Config 资源命名空间错误或 Controller 未重启 确认 Config 在 gatekeeper-system 命名空间;重启 Controller Pod