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 相当于“策略对象”。一个模板可以被多次实例化,每个实例针对不同的资源或命名空间生效。
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 的完整策略评估流程如下:
- Webhook 拦截:API Server 将请求转发给 Gatekeeper 的 ValidatingWebhook。
- 约束收集:Gatekeeper 从缓存中获取所有与请求资源类型匹配的 Constraint。
- 模板加载:根据每个 Constraint 的
kind,找到对应的 ConstraintTemplate 并加载 Rego 代码。 - 参数注入:将 Constraint 的
spec.parameters注入到 Rego 的input.parameters中。 - Rego 执行:OPA 引擎执行 Rego 规则,生成
violation集合。 - 结果返回:如果有 violation,Gatekeeper 返回拒绝响应;否则允许请求通过。
2.6 核心概念对比总结
| 概念 | 类型 | 作用域 | 是否可复用 | 回滚影响范围 |
|---|---|---|---|---|
| OPA Constraint Framework | 系统组件 | 集群全局 | — | 影响所有策略评估 |
| ConstraintTemplate | CRD 资源 | 集群全局 | 是(可实例化多次) | 影响所有关联的 Constraint |
| Constraint | CR 资源 | 命名空间/集群 | 否(每个实例独立) | 仅影响自身匹配的资源 |
回滚视角: 在后续章节的快照回滚演练中,Constraint 是回滚的最小粒度单元,ConstraintTemplate 是回滚的中等粒度单元,而 OPA Constraint Framework 的配置变更(如 Webhook 配置)属于集群级高风险回滚操作。