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 组件之间的核心交互流程,从资源请求到策略评估的完整链路:
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 的核心工作流程:
- 用户创建 ConstraintTemplate 对象,定义 Rego 策略逻辑和参数 schema。
- Gatekeeper Controller 监听到 ConstraintTemplate 创建事件,自动生成对应的 CRD(Custom Resource Definition)。
- 用户创建 Constraint 对象(即新 CRD 的实例),传入具体参数(如允许的仓库列表、必需的标签等)。
- Controller 将 Constraint 编译为 OPA 可执行的规则,并注入到 OPA 引擎中。
- 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 定义到最终策略评估的完整数据流,帮助理解三个组件如何协同工作:
架构优势总结:
- 解耦性: 策略逻辑(Template)与策略规则(Constraint)分离,同一模板可复用生成多个不同参数的约束。
- 可扩展性: 用户无需修改 Gatekeeper 核心代码,只需编写 Rego 模板即可扩展任意策略。
- 声明式管理: 所有策略都是 Kubernetes 原生 CRD 对象,可通过 GitOps 流程进行版本管理和审计。
- 性能优化: 策略编译在 Controller 中完成,Admission Controller 仅做轻量级评估调用,减少 Webhook 延迟。