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 通过将策略决策从服务中抽离,实现了策略的集中管理、版本控制和独立审计,是“策略即代码”理念的典型实践。
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 管道中自动验证和部署。
- 可审计性:策略变更历史清晰可追溯,满足合规要求。
实践注意: 策略即代码不仅仅是把策略写成文本文件。它要求团队建立策略的编写规范、测试覆盖标准、部署流程和监控机制,否则策略库可能退化为难以维护的“策略泥潭”。
2.4 核心概念对比与总结
为了帮助快速理解 OPA 与 Rego 在策略体系中的定位,下表对比了传统策略管理与策略即代码模式的关键差异:
| 维度 | 传统策略管理 | OPA + Rego (策略即代码) |
|---|---|---|
| 策略存储 | 配置文件、数据库表、硬编码 | 文本文件 (Rego)、版本仓库 |
| 策略语言 | DSL、JSON Schema、自定义脚本 | 声明式 Rego 语言 |
| 测试能力 | 手动测试、集成测试 | 自动化单元测试、覆盖率报告 |
| 部署方式 | 重启服务、手动更新 | CI/CD 管道、Bundle 分发 |
| 审计追溯 | 日志记录、变更记录 | Git 历史、策略版本标签 |
本章小结: OPA 通过解耦策略决策与业务逻辑,提供了灵活、可扩展的策略引擎。Rego 作为其声明式策略语言,以文档为中心、规则驱动的模式,天然适合处理云原生环境中的复杂策略需求。策略即代码的实践则确保了策略的可维护性、可靠性和可审计性,为后续 Gatekeeper 集成奠定了坚实基础。