2. OPA与Rego基础:OPA架构概述、Rego策略语言核心概念、策略即代码

2.1 OPA 架构概述

Open Policy Agent (OPA) 是一个开源的、通用策略引擎,它将策略决策与业务逻辑解耦。OPA 不直接管理资源,而是作为一个独立的服务或库,接收来自任何软件系统(如 Kubernetes、微服务、CI/CD 管道)的查询,并基于预定义的策略返回决策结果。

OPA 的核心架构遵循 “决策请求-策略评估-决策响应” 的模型,其关键组件包括:

  • 服务 (Service):需要执行策略决策的外部系统,例如 API 网关、Kubernete API Server 或 CI 工具。
  • 查询 (Query):服务向 OPA 发送的结构化请求,通常包含需要评估的上下文数据(如用户、资源、操作)。
  • 策略 (Policy):使用 Rego 语言编写的规则集合,定义了允许或拒绝特定操作的逻辑。
  • 数据 (Data):OPA 加载的文档数据,可以是 JSON 或 YAML 格式,用于支持策略决策(如白名单、角色定义)。
  • 引擎 (Engine):OPA 的核心组件,负责解析 Rego 策略、加载数据并执行查询评估。
架构要点: OPA 通过将策略决策从服务中抽离,实现了策略的集中管理、版本控制和独立审计,是“策略即代码”理念的典型实践。
OPA 架构与决策流程 外部服务 (K8s / API / CI) 查询 (JSON) OPA 引擎 策略评估 (Rego 解释器) 加载 策略存储 (Rego 文件 / Bundle) 加载 数据文档 (JSON / YAML) 决策 (allow/deny) 说明: OPA 通过 Bundle API 或 Sidecar 模式加载策略和数据,对外提供统一的 RESTful 或 gRPC 查询接口。

2.2 Rego 策略语言核心概念

Rego 是 OPA 的原生策略语言,专为在复杂嵌套文档上表达策略逻辑而设计。Rego 不是一种通用编程语言,而是一种声明式查询语言,其核心概念包括:

概念 描述 示例
规则 (Rule) 策略的基本单元,定义了一个条件判断。规则可以生成布尔值、集合或对象。 allow { input.method == "GET" }
文档 (Document) Rego 中的基本数据结构,包括 input(查询输入)、data(全局数据)和自定义文档。 input.user.role == "admin"
表达式 (Expression) 构成规则主体的条件语句,支持比较、逻辑运算、集合操作等。 count(violations) == 0
迭代 (Iteration) 使用 some 关键字遍历集合或数组中的元素。 some container; input.containers[container]
内置函数 (Built-in) OPA 提供丰富的内置函数,用于字符串处理、正则匹配、时间操作等。 regex.match("^[a-z]+$", input.name)
关键理解: Rego 规则默认是“全称”的——所有规则必须同时为真,整个策略才为真。这与传统 if-else 逻辑不同,更接近逻辑编程范式。

2.2.1 规则结构与评估模型

一个典型的 Rego 规则包含头部和主体。头部定义规则名称和输出,主体包含一系列表达式。当主体中的所有表达式都为真时,规则被满足。

# 规则头部:定义规则名称为 "allow",输出布尔值
allow {
    # 规则主体:所有表达式必须为真
    input.request.method == "POST"
    input.request.path == "/api/v1/deployments"
    data.roles[input.user.role].permissions[_] == "deploy"
}

Rego 的评估模型基于 “部分评估” 和 “绑定”。当查询到达时,OPA 会尝试为规则中的变量寻找满足条件的值,如果存在至少一组绑定使所有表达式为真,则规则成立。

2.3 策略即代码 (Policy as Code)

“策略即代码”是将策略决策逻辑以代码形式进行管理、版本控制、测试和部署的实践。OPA 与 Rego 天然支持这一理念,其核心优势体现在:

  • 版本控制:Rego 文件可以存储在 Git 仓库中,支持分支、合并、回滚和代码审查。
  • 自动化测试:Rego 支持编写单元测试,确保策略行为符合预期。
  • 持续集成:策略可以在 CI/CD 管道中自动验证和部署。
  • 可审计性:策略变更历史清晰可追溯,满足合规要求。
实践注意: 策略即代码不仅仅是把策略写成文本文件。它要求团队建立策略的编写规范、测试覆盖标准、部署流程和监控机制,否则策略库可能退化为难以维护的“策略泥潭”。
策略即代码生命周期 1. 编写 Rego 策略文件 2. 版本控制 Git 仓库管理 3. 测试 单元测试 / 集成测试 4. 部署 CI/CD 管道 反馈与迭代 核心价值: 策略即代码将策略管理纳入软件工程最佳实践,实现策略的声明式定义、自动化验证和持续交付。

2.4 核心概念对比与总结

为了帮助快速理解 OPA 与 Rego 在策略体系中的定位,下表对比了传统策略管理与策略即代码模式的关键差异:

维度 传统策略管理 OPA + Rego (策略即代码)
策略存储 配置文件、数据库表、硬编码 文本文件 (Rego)、版本仓库
策略语言 DSL、JSON Schema、自定义脚本 声明式 Rego 语言
测试能力 手动测试、集成测试 自动化单元测试、覆盖率报告
部署方式 重启服务、手动更新 CI/CD 管道、Bundle 分发
审计追溯 日志记录、变更记录 Git 历史、策略版本标签
本章小结: OPA 通过解耦策略决策与业务逻辑,提供了灵活、可扩展的策略引擎。Rego 作为其声明式策略语言,以文档为中心、规则驱动的模式,天然适合处理云原生环境中的复杂策略需求。策略即代码的实践则确保了策略的可维护性、可靠性和可审计性,为后续 Gatekeeper 集成奠定了坚实基础。