2. OPA 基础回顾:OPA 架构、Rego 策略语言核心概念、策略执行流程

在深入分析资源配额对 OPA 策略延迟的影响之前,必须牢固掌握 OPA 的基础架构、Rego 语言的核心概念以及策略的执行流程。本节将系统性地回顾这三个关键领域,为后续的性能分析奠定坚实的理论基础。

2.1 OPA 架构:解耦策略与决策

Open Policy Agent (OPA) 是一个开源的、通用策略引擎,其核心设计理念是将策略决策与策略执行完全解耦。OPA 本身不负责管理或控制任何系统,它仅作为一个决策点,根据外部系统(如 Kubernetes、Envoy、微服务)提供的上下文数据(输入)和预先定义的策略(Rego 代码)来做出决策。

OPA 的架构主要由以下核心组件构成:

  • OPA 服务 (opa 进程):核心引擎,负责加载策略、处理查询请求并返回决策结果。它可以通过 CLI、HTTP API 或作为 Go 库被集成。
  • Rego 策略:使用 Rego 语言编写的声明式策略代码,定义了决策逻辑。策略通常包含规则、数据引用和内置函数。
  • 数据文档 (Data Document):OPA 内部维护的全局数据缓存,用于存储从外部系统同步的静态数据(如用户列表、角色、黑名单)或策略本身。
  • 输入文档 (Input Document):每次策略查询时,由外部系统(如 API 网关、Kubernete API Server)传入的临时数据,代表请求的上下文(如用户、操作、资源)。
  • 决策日志 (Decision Logs):OPA 记录的所有决策请求和结果的日志,用于审计、调试和性能分析。
架构要点: OPA 的“无状态”决策模型(输入 + 数据 + 策略 = 决策)是其高性能和可扩展性的基础。策略和数据可以独立于执行系统进行更新和分发。
OPA 核心架构与决策流程 外部系统 (K8s API / 网关) 输入文档 (input) OPA 策略引擎 (Rego 评估) 决策 数据文档 (data / 缓存) Rego 策略 请求上下文 查询 加载 说明: 1. 外部系统发送请求 2. OPA 结合 input + data 评估策略 3. 返回 allow/deny 决策

2.2 Rego 策略语言核心概念

Rego 是一种受 Datalog 启发的声明式查询语言,专门用于在复杂嵌套数据结构上定义策略。理解其核心概念是编写高效、可维护策略的前提。

概念 描述 示例
规则 (Rule) 策略的基本单元,定义了一个决策或数据派生。规则可以是完整的(默认值)或部分的(条件集合)。 allow { input.role == "admin" }
文档 (Document) Rego 中的变量和规则都代表文档。顶级文档是 data 和 input。 data.users, input.request.path
查询 (Query) 向 OPA 引擎提出的问题,返回规则评估的结果。 data.example.allow
迭代 (Iteration) 使用 some 关键字或隐式迭代遍历集合。 some user; data.users[user].name == input.user
内置函数 (Built-in) 预定义的函数,用于执行字符串操作、聚合、加密、HTTP 请求等。 count(), split(), time.now_ns()
否定 (Negation) 使用 not 关键字表示条件不成立。 not input.user in data.blacklist
默认值 (Default) 为规则提供一个默认值,避免未定义错误。 default allow = false
性能提示: Rego 的迭代和否定操作在数据量较大时可能成为性能瓶颈。在编写策略时,应优先使用集合操作(如 data.roles[input.role])而非线性迭代,并谨慎使用嵌套的 not 条件。

2.3 策略执行流程

一个典型的 OPA 策略执行流程包含以下步骤,理解每一步对分析延迟至关重要:

  1. 策略加载与编译:OPA 启动时或通过 API 加载 Rego 策略文件。Rego 代码被解析、编译成高效的内部表示形式(IR),并存储在 data 文档中。
  2. 数据同步:OPA 通过 Bundle API 或 Pull 模式从外部数据源(如控制平面)同步静态数据,更新 data 文档。
  3. 接收查询请求:外部系统(如 Kubernetes API Server)通过 HTTP POST 请求向 OPA 的 /v1/data 端点发送查询,请求中包含 input 文档。
  4. 策略评估:OPA 引擎接收 input,结合 data 文档,执行编译后的策略 IR。评估过程是树状递归的,从根规则开始,逐步展开子规则和条件。
  5. 结果返回:评估完成后,OPA 将决策结果(通常是 JSON 对象,包含 allow、deny 等字段)返回给调用方。
  6. 决策日志记录:OPA 异步地将本次决策的输入、输出、耗时等信息写入决策日志。
OPA 策略执行详细流程 1. 加载策略 (Rego -> IR) 2. 同步数据 (更新 data) 3. 接收查询 (POST /v1/data) 4. 策略评估 (IR 执行) 5. 返回结果 (JSON 决策) 6. 记录日志 异步 延迟关键点: • 步骤 4 (评估) 是 CPU 密集型 • 步骤 2 (数据同步) 影响内存和 GC • 步骤 6 (日志) 是 I/O 操作
延迟陷阱: 在步骤 4(策略评估)中,如果 Rego 策略包含大量嵌套迭代、复杂的 walk() 操作或对大型 data 文档进行全量扫描,评估时间会显著增加。资源配额(如 CPU 时间片、内存限制)会直接影响步骤 4 的执行效率,这是本课程后续章节的核心分析对象。