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 管理接口。
OPA 策略引擎核心架构 外部请求 策略引擎 Rego 规则求值 Bundle Server Data Store Decision Log REST API input 加载策略 查询数据 记录决策 决策结果 说明 策略包支持热更新 无需重启引擎

3.3 策略决策点:Admission Controller 集成

在 Kubernetes 中,OPA 通过 ValidatingAdmissionWebhook 作为策略决策点。当 API 请求到达时,kube-apiserver 将 AdmissionReview 对象发送给 OPA,OPA 返回是否允许创建/更新资源。

集成方式:OPA 以 sidecar 或独立 Deployment 运行,暴露 /v1/admit 端点。Helm Chart 发布时,OPA 策略可校验 values.yaml 中的镜像、标签、副本数、命名空间等字段。
Admission Controller 策略决策流程 用户/CI kube-apiserver OPA 引擎 etcd kubectl apply AdmissionReview 允许/拒绝 持久化(仅允许时) 决策点说明 • 同步调用 • 超时默认 30s • 失败时默认拒绝

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 发布前的镜像仓库、标签规范、副本数等策略校验。