2. 核心概念:策略即代码(PaC)的定义、与IaC的关系、OPA与Rego语言简介
2.1 策略即代码(PaC)的定义
策略即代码(Policy as Code, PaC)是一种将组织中的策略规则(如安全合规、资源配额、访问控制)以机器可读的代码形式进行声明、存储、版本化、测试和自动执行的实践。其核心思想是将传统上写在文档或人工审批流程中的“策略”转化为可被计算机精确理解和执行的逻辑。
核心特征:
- 声明式:描述“策略期望的状态是什么”,而非“如何实现”。
- 版本化:策略文件与应用程序代码一样,存储在 Git 等版本控制系统中,支持审计、回滚和协作。
- 自动化:策略的评估与执行完全由引擎自动完成,无需人工干预。
- 可测试:可以为策略编写单元测试和集成测试,确保策略逻辑的正确性。
2.2 PaC 与 IaC 的关系
基础设施即代码(Infrastructure as Code, IaC)定义了“系统应该被构建成什么样子”,而策略即代码(PaC)则定义了“系统在运行时必须遵守什么规则”。两者是互补关系,共同构成了云原生环境下的“声明式治理”闭环。
| 维度 | 基础设施即代码 (IaC) | 策略即代码 (PaC) |
|---|---|---|
| 关注点 | 资源的拓扑、配置、版本 | 资源的行为边界、合规性、安全约束 |
| 典型工具 | Terraform, Pulumi, CloudFormation | OPA, Kyverno, Sentinel |
| 输入 | 声明式配置文件(HCL, YAML) | 策略规则 + 运行时数据(请求/资源状态) |
| 输出 | 资源创建/更新/删除的指令 | 允许/拒绝决策,或审计警告 |
| 生命周期 | 资源从创建到销毁的全过程 | 持续运行,在每次请求或变更时触发 |
实践建议:在 CI/CD 流水线中,通常先执行 IaC 生成资源清单,再通过 PaC 引擎对清单进行合规性校验。只有通过策略校验的 IaC 变更才能被应用到生产环境。
2.3 OPA 与 Rego 语言简介
开放策略代理(Open Policy Agent, OPA)是云原生计算基金会(CNCF)的毕业项目,是目前最流行的通用策略引擎。OPA 将策略决策与策略执行(即“策略执行点”)解耦,提供统一的策略评估框架。
2.3.1 OPA 架构概览
下图展示了 OPA 在云原生架构中的核心位置:它作为独立的服务或库,接收来自各种系统(如 Kubernetes API Server、API 网关、CI/CD 系统)的查询,并基于预加载的策略和数据返回决策结果。
2.3.2 Rego 语言基础
Rego 是 OPA 的原生策略语言,受 Datalog 启发,专为在复杂嵌套文档(如 JSON/YAML)上定义策略而设计。Rego 的核心是“规则”,规则的结果是一个布尔值或一个集合。
Rego 策略文件的基本结构:
package kubernetes.admission
# 规则:禁止使用 latest 标签
deny[msg] {
input.request.operation == "CREATE"
container := input.request.object.spec.containers[_]
container.image == "nginx:latest"
msg := sprintf("容器 %v 使用了 latest 标签,这是不允许的", [container.name])
}
# 规则:必须设置 resource limits
deny[msg] {
container := input.request.object.spec.containers[_]
not container.resources.limits
msg := sprintf("容器 %v 未设置资源限制", [container.name])
}
关键语法说明:
- package:每个 Rego 文件必须以
package关键字开头,用于命名空间隔离。 - 规则头:
deny[msg]表示这是一个“拒绝”规则,当条件满足时,生成一条拒绝消息。 - 迭代器:
container := input.request.object.spec.containers[_]中的[_]用于遍历数组。 - 默认值:Rego 中的变量默认是“未绑定”状态,只有在规则体中找到匹配项时才会被赋值。
2.3.3 OPA 与 Rego 在资源配额场景中的角色
在资源配额模型分层设计中,OPA 作为策略决策点(PDP),负责评估配额策略;Rego 则用于编写这些策略的具体逻辑。下图展示了从配额策略定义到最终执行的完整链路。
2.4 本章小结
- PaC 将策略从文档转化为代码,实现了策略的版本化、自动化和可测试性。
- PaC 与 IaC 是云原生治理的两大支柱:IaC 负责“构建”,PaC 负责“约束”。
- OPA 是通用的策略引擎,通过解耦决策与执行,实现了策略的集中管理。
- Rego 是 OPA 的策略语言,擅长处理嵌套数据结构,是编写资源配额策略的核心工具。