2. OPA Gatekeeper 架构解析:核心组件、工作流程与数据流

在生产环境中实施镜像拉取流量控制,首先需要理解 OPA Gatekeeper 的底层架构。本章将拆解其三大核心组件(OPA、Gatekeeper、Admission Webhook),梳理一次准入请求的完整生命周期,并通过数据流图展示组件间的协作关系。

2.1 核心组件

OPA Gatekeeper 并非单一二进制,而是由三个独立但紧密协作的组件构成。下表总结了各组件的职责与部署形态:

组件 职责 部署形态 关键接口
OPA(Open Policy Agent) 通用策略引擎,执行 Rego 策略并返回决策 作为 sidecar 或独立 DaemonSet 运行 REST API(/v1/data)
Gatekeeper Kubernetes 原生策略控制器,管理约束模板与约束实例 以 Deployment 形式运行在集群内 Kubernetes API(CRD)
Admission Webhook Kubernetes API Server 的准入扩展点,拦截资源请求 由 Gatekeeper 自动注册的 MutatingWebhookConfiguration / ValidatingWebhookConfiguration HTTPS / JSON
关键理解:Gatekeeper 是 Kubernetes 与 OPA 之间的“翻译层”。它负责将 Kubernetes 的 CRD 资源(ConstraintTemplate、Constraint)转换为 OPA 可执行的 Rego 查询,并将 OPA 的决策结果映射为 Kubernetes 准入响应。

2.2 组件协作关系图

下图展示了三个组件在集群内的部署位置与通信链路。注意 OPA 通常以 sidecar 模式与 Gatekeeper 容器共享同一个 Pod。

OPA Gatekeeper 核心组件架构图 OPA Gatekeeper 核心组件架构 Kubernetes API Server Admission Hook 触发点 Gatekeeper Pod (gatekeeper-system 命名空间) Gatekeeper 控制器 管理 CRD / 同步缓存 / 注册 Webhook OPA 引擎 (sidecar) 执行 Rego 策略 / 返回决策 kubectl / 客户端 发起资源创建/更新请求 1. 发送请求 2. 调用 Webhook 3. 查询决策 4. 返回决策 5. 准入响应

2.3 工作流程:一次准入请求的完整生命周期

当用户执行 kubectl apply 创建包含镜像拉取配置的 Pod 时,Gatekeeper 的准入控制流程分为以下六个步骤:

  1. 请求触发:用户或 CI/CD 系统向 Kubernetes API Server 发送资源创建/更新请求。
  2. 准入拦截:API Server 根据注册的 ValidatingWebhookConfiguration,将请求序列化为 AdmissionReview JSON,发送至 Gatekeeper 的 Webhook 端点。
  3. 约束匹配:Gatekeeper 控制器根据请求中的资源类型(如 Pod)、命名空间标签等,匹配已定义的 Constraint 实例。
  4. 策略查询:Gatekeeper 将匹配到的约束与对应 ConstraintTemplate 中的 Rego 代码组合,构造查询请求,发送给同 Pod 内的 OPA sidecar。
  5. 决策执行:OPA 引擎执行 Rego 策略,检查请求中的 imagePullSecrets、image 字段等,返回 true(允许)或 false(拒绝)及可选消息。
  6. 响应返回:Gatekeeper 将 OPA 的决策封装为 AdmissionReview 响应,返回给 API Server。若拒绝,API Server 会终止请求并返回错误给客户端。
性能要点:整个流程在 API Server 超时时间内完成(默认 30 秒)。OPA 引擎通常能在毫秒级返回决策,Gatekeeper 的缓存机制进一步减少了重复查询的开销。

2.4 数据流图:镜像拉取权限检查的详细路径

针对“控制镜像拉取流量”这一具体场景,下图展示了数据在组件间的流动细节,重点关注 imagePullSecrets 和 image 字段的传递路径:

镜像拉取权限检查数据流图 镜像拉取权限检查数据流图 AdmissionReview 包含 Pod 完整 Spec Gatekeeper 数据提取 提取 image / imagePullSecrets OPA 策略引擎 执行 Rego 规则 原始请求 结构化数据 决策结果 allow / deny + message 决策返回 Gatekeeper 缓存 约束 / 模板 / 命名空间 缓存匹配 AdmissionReview 响应 返回给 API Server 关键数据字段: spec.imagePullSecrets[].name → 检查 Secret 引用是否在白名单内 spec.containers[].image → 检查镜像仓库域名是否在允许列表中

2.5 组件间通信协议与端口

理解组件间的通信方式有助于排查网络策略和证书问题。下表列出了关键通信链路:

通信方向 协议 默认端口 认证方式
API Server → Gatekeeper Webhook HTTPS 443 TLS 证书(由 Gatekeeper 自动管理)
Gatekeeper → OPA sidecar HTTP 8181 本地回环,无额外认证
Gatekeeper → Kubernetes API HTTPS 6443 ServiceAccount
安全注意:Gatekeeper 与 OPA 之间的通信默认使用 HTTP 且无认证,因为它们运行在同一个 Pod 内,通过 localhost 通信。如果修改部署拓扑将 OPA 独立部署,必须启用 TLS 和认证机制。

2.6 架构设计要点总结

  • 松耦合:Gatekeeper 与 OPA 通过 REST API 通信,可独立升级或替换策略引擎。
  • 缓存先行:Gatekeeper 维护了约束、模板和命名空间的本地缓存,避免每次请求都查询 Kubernetes API。
  • 失败关闭:当 OPA 不可用时,Gatekeeper 默认行为是拒绝所有请求(fail-closed),防止策略绕过。
  • 审计能力:除了实时准入,Gatekeeper 还支持定期审计(audit),扫描集群中已有资源是否违反当前约束。