3. OPA 策略引擎入门:Rego 语言基础、OPA 架构、策略决策点(ADMISSION_CONTROLLER)
在 Kubernetes 与 Helm 的发布治理中,OPA(Open Policy Agent) 是事实标准策略引擎。本章从 Rego 语言基础、OPA 架构、以及 Admission Controller 集成三个维度,建立策略即代码的完整认知。
3.1 Rego 语言基础:策略即代码
Rego 是 OPA 专用的声明式查询语言,专为结构化数据(JSON/YAML)的规则评估设计。核心概念包括:
| 概念 | 说明 | 示例 |
|---|---|---|
| 规则(Rule) | 定义策略判断逻辑,返回 true/false 或集合 | allow { input.role == "admin" } |
| 查询(Query) | 对规则求值,获取决策结果 | data.example.allow |
| 输入(Input) | 外部传入的待评估数据(如 AdmissionReview) | input.request.object.spec.replicas |
| 数据(Data) | OPA 内置的全局文档,可加载外部 JSON | data.whitelist.registries |
| 迭代(Iteration) | 使用 some 关键字遍历集合 |
some i; input.containers[i].image |
关键语法:Rego 使用
= 进行赋值,== 进行相等比较;:= 用于局部变量声明。默认规则为“允许”,拒绝需显式定义 deny 规则。
# 示例:拒绝镜像仓库不在白名单中的容器
package kubernetes.admission
deny[msg] {
input.request.kind.kind == "Pod"
some i
image := input.request.object.spec.containers[i].image
not startswith(image, "registry.example.com/")
msg := sprintf("容器镜像 %v 不在允许的仓库中", [image])
}
3.2 OPA 架构:策略引擎核心组件
OPA 采用 解耦策略决策 架构,将策略从业务服务中剥离。核心组件包括:
- Policy Engine(策略引擎):加载 Rego 规则,对输入求值并返回决策。
- Bundle Server(策略包服务器):分发策略包(.tar.gz),支持热更新。
- Data Store(数据存储):缓存外部数据文档,支持增量推送。
- Decision Log(决策日志):记录每次决策的输入、输出、耗时,用于审计。
- REST API:对外提供
/v1/data查询接口和/v1/policies管理接口。
3.3 策略决策点:Admission Controller 集成
在 Kubernetes 中,OPA 通过 ValidatingAdmissionWebhook 作为策略决策点。当 API 请求到达时,kube-apiserver 将 AdmissionReview 对象发送给 OPA,OPA 返回是否允许创建/更新资源。
集成方式:OPA 以 sidecar 或独立 Deployment 运行,暴露
/v1/admit 端点。Helm Chart 发布时,OPA 策略可校验 values.yaml 中的镜像、标签、副本数、命名空间等字段。
3.4 策略决策点对比:Admission Controller vs. 其他集成
| 集成方式 | 触发时机 | 适用场景 | 性能影响 |
|---|---|---|---|
| Admission Controller | 资源创建/更新/删除前 | Helm 发布校验、安全基线 | 中等(同步阻塞) |
| Sidecar 注入 | Pod 创建时 MutatingWebhook | 自动注入 OPA sidecar | 低(异步) |
| REST API 查询 | 业务代码主动调用 | 微服务内部授权 | 低(异步/同步可选) |
| Kafka 事件驱动 | 事件到达时 | 审计、合规检查 | 低(异步) |
注意:Admission Controller 是 Helm Chart 发布治理中最关键的决策点。策略必须幂等,避免因网络超时或 OPA 重启导致集群不可用。建议为 OPA 设置
failurePolicy: Fail 并配置健康检查。
3.5 本章小结
- Rego 语言 以声明式规则定义策略,核心是
input、data、deny模式。 - OPA 架构 包含策略引擎、Bundle Server、Data Store、Decision Log 四大组件,支持热更新。
- Admission Controller 是 Kubernetes 原生策略决策点,在 Helm 发布时拦截并校验资源定义。
- 下一章将基于本章基础,实现 Helm Chart 发布前的镜像仓库、标签规范、副本数等策略校验。