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 系统)的查询,并基于预加载的策略和数据返回决策结果。

OPA 策略决策架构 OPA 策略决策架构 外部系统 (K8s / API Gateway / CI) 查询 (input) OPA 引擎 (Rego 策略评估) 决策 (allow/deny) 策略执行点 (K8s Admission / 网关) 数据加载 策略加载 外部数据源 (集群状态 / 用户属性) 策略源 (Git / ConfigMap / Bundle)

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 则用于编写这些策略的具体逻辑。下图展示了从配额策略定义到最终执行的完整链路。

资源配额策略执行链路 资源配额策略执行链路 配额策略定义 (Rego 文件) OPA 引擎加载 (Bundle / API) 请求拦截 (Admission Webhook) 决策返回 (allow/deny) 配额策略示例(Rego) namespace 总 CPU 配额 <= 1000m namespace 总内存配额 <= 2Gi

2.4 本章小结

  • PaC 将策略从文档转化为代码,实现了策略的版本化、自动化和可测试性。
  • PaC 与 IaC 是云原生治理的两大支柱:IaC 负责“构建”,PaC 负责“约束”。
  • OPA 是通用的策略引擎,通过解耦决策与执行,实现了策略的集中管理。
  • Rego 是 OPA 的策略语言,擅长处理嵌套数据结构,是编写资源配额策略的核心工具。