4. Gatekeeper 组件架构:Controller Manager、Audit Controller、Webhook Server、Constraint Template 与 Constraint
OPA Gatekeeper 是 Kubernetes 的 可审计、可策略、可扩展 的准入控制与合规核验引擎。其组件架构围绕 策略定义、实时拦截、周期性审计 与 状态管理 四个核心职责展开。理解每个组件的角色与协作关系,是集成资源模型实现基线核验的基础。
4.1 组件全景与协作关系
Gatekeeper 由四个主要组件构成,它们共同实现了从策略注册、实时校验到合规审计的闭环。下图展示了各组件的逻辑架构与数据流。
4.2 Gatekeeper Controller Manager
Controller Manager 是 Gatekeeper 的 核心协调器,负责管理所有 CRD 资源的生命周期。它运行在 gatekeeper-controller-manager Pod 中,包含多个子控制器。
| 子控制器 | 职责 | 监听资源 |
|---|---|---|
| ConstraintTemplate Controller | 注册/更新/删除 ConstraintTemplate CRD,编译 Rego 策略 | constrainttemplates.gatekeeper.sh |
| Constraint Controller | 管理 Constraint 实例,将策略绑定到目标资源 | constraints.gatekeeper.sh(动态 CRD) |
| Status Controller | 更新 Constraint 和 ConstraintTemplate 的状态(violations、byPod) | 所有 Gatekeeper CRD |
| Sync Controller | 将集群资源缓存到 OPA 引擎,供 Rego 策略查询 | 用户配置的同步资源(如 Namespace、Pod) |
4.3 Webhook Server
Webhook Server 是 Gatekeeper 的 实时准入拦截器。它作为 Kubernetes ValidatingAdmissionWebhook 注册,在资源创建、更新、删除时被 API Server 调用。
- 工作流程:
- API Server 将准入请求(AdmissionReview)发送到 Webhook Server 的
/v1/admit端点。 - Webhook Server 提取请求中的资源对象(Object)和旧对象(OldObject)。
- 将请求数据注入 OPA 引擎,执行所有匹配的 Constraint 策略。
- 返回
allowed: true/false及拒绝消息。
- API Server 将准入请求(AdmissionReview)发送到 Webhook Server 的
- 超时与容错:默认超时 3 秒;超时或不可用时,API Server 根据
failurePolicy(Fail/Ignore)决定是否放行。 - TLS 安全:Webhook Server 使用 TLS 证书与 API Server 通信,证书由 Gatekeeper 自带的证书管理器自动轮换。
4.4 Audit Controller
Audit Controller 是 Gatekeeper 的 合规审计引擎,负责对集群中 已有资源 进行周期性策略核验。它弥补了 Webhook 只拦截实时请求的不足,确保历史资源也符合基线要求。
| 属性 | 说明 |
|---|---|
| 审计周期 | 默认每 60 秒执行一次(可通过 --audit-interval 调整) |
| 审计范围 | 集群中所有匹配 Constraint match 字段的资源 |
| 结果存储 | 写入 Constraint 的 status.violations 字段,包含违规资源名称、命名空间、消息 |
| 审计缓存 | 使用 OPA 引擎的缓存数据,避免重复调用 API Server |
| 审计模式 | 支持 dryrun(仅记录,不拦截)和 warn(返回警告) |
resources.limits 和 securityContext,并将违规结果暴露给监控系统(如 Prometheus)。
4.5 Constraint Template
Constraint Template 是 Gatekeeper 的 策略模板,它是一个 Kubernetes CRD,定义了策略的 逻辑结构 和 Rego 代码。用户通过编写 ConstraintTemplate 来声明一类策略规则。
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8srequiredlabels
spec:
crd:
spec:
names:
kind: K8sRequiredLabels # 生成的 Constraint CRD 名称
validation:
openAPIV3Schema:
type: object
properties:
labels:
type: array
items:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8srequiredlabels
violation[{"msg": msg}] {
input.review.object.metadata.labels == null
msg := "资源必须包含标签"
}
violation[{"msg": msg}] {
required := input.parameters.labels[_]
not input.review.object.metadata.labels[required]
msg := sprintf("缺少必要标签: %v", [required])
}
- CRD 生成:每个 ConstraintTemplate 会自动生成一个同名的 CRD(如
K8sRequiredLabels),用户通过创建该 CRD 的实例来应用策略。 - Rego 策略:
violation规则返回违规消息;input.parameters接收 Constraint 传入的参数。 - 版本管理:更新 ConstraintTemplate 时,Controller Manager 会重新编译 Rego 并更新所有关联的 Constraint。
4.6 Constraint
Constraint 是 ConstraintTemplate 的 具体实例,它提供了策略的 参数值 和 匹配范围。一个 ConstraintTemplate 可以被实例化为多个 Constraint,每个 Constraint 针对不同的资源或命名空间。
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
name: require-labels-prod
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
namespaces: ["production"]
parameters:
labels:
- "app"
- "env"
- "owner"
| 字段 | 说明 | 示例 |
|---|---|---|
match |
定义策略作用的资源范围(kinds、namespaces、labelSelector、namespaceSelector) | kinds: ["Pod"] + namespaces: ["production"] |
parameters |
传递给 Rego 策略的参数,由 ConstraintTemplate 的 openAPIV3Schema 定义结构 |
labels: ["app", "env"] |
enforcementAction |
策略执行模式:deny(拦截)、dryrun(仅审计)、warn(警告) |
enforcementAction: deny |
status |
由 Audit Controller 和 Webhook Server 自动填充,包含违规列表和每个 Gatekeeper 实例的状态 | status.violations |
namespaceSelector 或 labelSelector 精确控制策略范围,避免误拦截。
4.7 组件协作流程总结
下图展示了从策略定义到审计结果输出的完整协作流程,帮助理解各组件在基线核验中的具体角色。
- Controller Manager 负责策略的生命周期管理(CRD 注册、Rego 编译、状态同步)。
- Webhook Server 提供实时准入控制,延迟敏感(毫秒级)。
- Audit Controller 提供周期性合规审计,适合基线核验和批量扫描。
- ConstraintTemplate 定义策略逻辑(Rego),Constraint 提供参数和匹配范围。