2. Gatekeeper 基础回顾:OPA Constraint Framework、ConstraintTemplate、Constraint 核心概念

在深入快照回滚演练之前,必须牢固掌握 Gatekeeper 的三个核心抽象层。它们构成了策略即代码的声明式骨架,也是后续所有回滚操作的作用对象。

2.1 三层架构总览

Gatekeeper 的策略体系建立在 OPA Constraint Framework 之上,分为三个逻辑层:

  • OPA Constraint Framework:底层框架,提供 Rego 策略引擎与 Kubernetes API 的集成能力,定义约束的通用生命周期。
  • ConstraintTemplate:策略模板层,用 Rego 语言编写具体的校验逻辑,并声明模板的输入参数(parameters)。
  • Constraint:策略实例层,通过实例化 ConstraintTemplate 并传入具体参数,生成一条可执行的策略规则。
关键理解: ConstraintTemplate 相当于“策略类”,Constraint 相当于“策略对象”。一个模板可以被多次实例化,每个实例针对不同的资源或命名空间生效。
Gatekeeper 三层架构关系图 OPA Constraint Framework 底层框架:Rego 引擎 + Kubernetes API 集成 ConstraintTemplate 策略模板:Rego 逻辑 + 参数声明 Constraint 策略实例:模板实例化 + 具体参数 实例化关系:一个 ConstraintTemplate → 多个 Constraint

2.2 OPA Constraint Framework:策略引擎基石

OPA Constraint Framework 是 Gatekeeper 与 OPA 之间的桥梁。它负责:

  • 资源监听:通过 Kubernetes Admission Webhook 监听资源创建、更新操作。
  • 策略评估:将请求对象和 Constraint 列表传递给 OPA 引擎,执行 Rego 规则。
  • 结果判定:根据 Rego 返回的 violation 集合,决定允许或拒绝请求。
  • 缓存管理:维护 Constraint 和 ConstraintTemplate 的本地缓存,减少 API Server 压力。
组件 职责 关键接口
Admission Webhook 拦截资源变更请求 ValidatingWebhookConfiguration
OPA Engine 执行 Rego 策略 data.system.main
Constraint Framework 管理模板与约束生命周期 constraints/v1beta1

2.3 ConstraintTemplate:策略逻辑的载体

ConstraintTemplate 是一个 CRD(Custom Resource Definition),它包含两个核心部分:

  • metadata:模板名称、版本等元信息。
  • spec.crd.spec:定义模板的输入参数结构(parameters),使用 OpenAPI v3 格式。
  • spec.targets.rego:Rego 策略代码,包含 violation 规则。
最佳实践: 每个 ConstraintTemplate 只关注一个策略维度(如:镜像仓库白名单、容器特权模式、资源配额限制),保持 Rego 逻辑单一职责。

以下是一个典型的 ConstraintTemplate 示例,用于限制容器镜像必须来自指定仓库:

apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: k8sallowedrepos
spec:
  crd:
    spec:
      names:
        kind: K8sAllowedRepos
      validation:
        openAPIV3Schema:
          type: object
          properties:
            repos:
              type: array
              items:
                type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8sallowedrepos

        violation[{"msg": msg}] {
          container := input.review.object.spec.containers[_]
          not startswith(container.image, input.parameters.repos[_])
          msg := sprintf("container <%v> uses image <%v>, not in allowed repos", [container.name, container.image])
        }

2.4 Constraint:策略实例的生效单元

Constraint 是 ConstraintTemplate 的实例化产物。它通过 spec.match 字段定义策略的生效范围,通过 spec.parameters 传入具体参数。

Constraint 的关键字段:

字段 说明 示例值
apiVersion 约束 API 版本 constraints.gatekeeper.sh/v1beta1
kind 对应 ConstraintTemplate 中定义的 kind K8sAllowedRepos
spec.match 策略匹配范围(命名空间、资源类型、标签等) kinds: [{apiGroups: [""], kinds: ["Pod"]}]
spec.parameters 传入模板的具体参数 repos: ["docker.io/"]

基于上述模板的 Constraint 实例:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sAllowedRepos
metadata:
  name: repo-must-be-dockerhub
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces: ["production"]
  parameters:
    repos:
      - "docker.io/"
注意: 如果 Constraint 的 spec.match 为空,则策略默认应用到集群中所有匹配的资源类型。在生产环境中,务必明确限定生效范围,避免意外拒绝关键系统 Pod。

2.5 三者协作流程

当用户提交一个 Pod 创建请求时,Gatekeeper 的完整策略评估流程如下:

  1. Webhook 拦截:API Server 将请求转发给 Gatekeeper 的 ValidatingWebhook。
  2. 约束收集:Gatekeeper 从缓存中获取所有与请求资源类型匹配的 Constraint。
  3. 模板加载:根据每个 Constraint 的 kind,找到对应的 ConstraintTemplate 并加载 Rego 代码。
  4. 参数注入:将 Constraint 的 spec.parameters 注入到 Rego 的 input.parameters 中。
  5. Rego 执行:OPA 引擎执行 Rego 规则,生成 violation 集合。
  6. 结果返回:如果有 violation,Gatekeeper 返回拒绝响应;否则允许请求通过。
Gatekeeper 策略评估流程图 用户提交 Pod Webhook 拦截 约束收集 模板加载 参数注入 Rego 执行 允许 / 拒绝

2.6 核心概念对比总结

概念 类型 作用域 是否可复用 回滚影响范围
OPA Constraint Framework 系统组件 集群全局 — 影响所有策略评估
ConstraintTemplate CRD 资源 集群全局 是(可实例化多次) 影响所有关联的 Constraint
Constraint CR 资源 命名空间/集群 否(每个实例独立) 仅影响自身匹配的资源
回滚视角: 在后续章节的快照回滚演练中,Constraint 是回滚的最小粒度单元,ConstraintTemplate 是回滚的中等粒度单元,而 OPA Constraint Framework 的配置变更(如 Webhook 配置)属于集群级高风险回滚操作。