3. OPA 本地环境搭建:安装 OPA CLI、运行 OPA 服务器、使用 curl 测试策略

在将 OPA 集成到 Helm 发布流水线之前,首先需要在本地搭建一个可用的 OPA 环境。本章将指导你完成 OPA CLI 的安装、OPA 服务器的启动,并通过 curl 验证策略是否生效。这是后续所有多集群合规校验的基础设施。

3.1 安装 OPA CLI

OPA 提供了跨平台的二进制分发,支持 Linux、macOS 和 Windows。推荐使用最新稳定版本(当前为 v0.60.0+)。

操作系统 安装命令 验证命令
Linux (amd64)
curl -sL -o opa https://openpolicyagent.org/downloads/v0.60.0/opa_linux_amd64
chmod +x opa
sudo mv opa /usr/local/bin/
opa version
macOS (Intel/Apple Silicon)
curl -sL -o opa https://openpolicyagent.org/downloads/v0.60.0/opa_darwin_amd64
chmod +x opa
sudo mv opa /usr/local/bin/
opa version
Windows (PowerShell)
Invoke-WebRequest -Uri https://openpolicyagent.org/downloads/v0.60.0/opa_windows_amd64.exe -OutFile opa.exe
# 将 opa.exe 添加到 PATH
opa version
💡 提示: 如果你使用 Docker 环境,也可以直接拉取 OPA 官方镜像:docker pull openpolicyagent/opa:latest。但本课程推荐使用 CLI 方式,以便更直观地理解 OPA 的内部机制。

3.2 运行 OPA 服务器

OPA 可以以独立服务器模式运行,通过 REST API 对外提供策略评估服务。这是与 Helm 发布流水线集成的标准方式。

启动 OPA 服务器需要指定监听地址和端口,同时加载策略文件(.rego)。以下命令启动一个开发模式下的 OPA 服务器:

# 启动 OPA 服务器,监听 8181 端口,加载当前目录下的所有 .rego 文件
opa run --server --addr=0.0.0.0:8181 ./policies/

启动成功后,终端会输出类似以下信息:

{"level":"info","msg":"Initializing server.","time":"2025-01-15T10:00:00Z"}
{"level":"info","msg":"Server started.","time":"2025-01-15T10:00:00Z","addr":":8181"}

OPA 服务器默认提供以下核心 API 端点:

端点 方法 用途
/v1/policies PUT / DELETE 管理策略(上传、删除)
/v1/data POST 执行策略查询(输入数据 + 策略评估)
/v1/health GET 健康检查
⚠️ 注意: 生产环境中请勿使用 --addr=0.0.0.0 暴露到公网。建议绑定到 127.0.0.1 或使用内部网络,并启用 TLS 和认证。

3.3 使用 curl 测试策略

OPA 服务器启动后,我们可以通过 curl 命令上传策略、提交输入数据并获取评估结果。以下是一个完整的测试流程。

3.3.1 准备示例策略

创建一个简单的 Rego 策略文件 check_namespace.rego,用于校验 Kubernetes 命名空间是否包含必需的标签:

package kubernetes.admission

# 默认拒绝
default allow := false

# 允许:命名空间必须包含 "env" 标签,且值在允许列表中
allow {
    input.kind == "Namespace"
    input.metadata.labels.env
    input.metadata.labels.env in ["prod", "staging", "dev"]
}

# 允许:非 Namespace 资源默认放行(仅用于演示)
allow {
    input.kind != "Namespace"
}

3.3.2 上传策略到 OPA

# 将策略文件上传到 OPA
curl -X PUT --data-binary @check_namespace.rego \
  http://localhost:8181/v1/policies/check_namespace

成功响应:

{"result":{"id":"check_namespace"}}

3.3.3 执行策略查询

构造一个合规的 Namespace 输入:

# 测试合规的 Namespace(env=prod)
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
    "input": {
      "kind": "Namespace",
      "metadata": {
        "name": "production",
        "labels": {
          "env": "prod"
        }
      }
    }
  }' \
  http://localhost:8181/v1/data/kubernetes/admission/allow

预期响应(允许):

{"result":true}

构造一个不合规的 Namespace 输入(缺少 env 标签):

# 测试不合规的 Namespace(缺少 env 标签)
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
    "input": {
      "kind": "Namespace",
      "metadata": {
        "name": "default",
        "labels": {}
      }
    }
  }' \
  http://localhost:8181/v1/data/kubernetes/admission/allow

预期响应(拒绝):

{"result":false}
🔑 关键理解: OPA 的评估模型是 输入(input) + 策略(policy) → 决策(decision)。在 Helm 发布流水线中,input 就是 Helm Chart 渲染后的 Kubernetes 资源清单,policy 就是你的合规规则,decision 就是是否允许发布。

3.4 本地环境架构图

下图展示了 OPA 本地开发环境的组件关系与数据流:

OPA 本地开发环境架构 用户 / curl HTTP 客户端 OPA 服务器 端口 :8181 REST API .rego 策略 文件系统 POST /v1/data 加载策略 决策结果 true / false 📋 数据流说明 1. curl 构造包含 Kubernetes 资源的 JSON 输入 2. OPA 服务器加载 .rego 策略文件,执行 Rego 查询 3. 返回布尔值决策结果,用于流水线门禁判断

3.5 常见问题与排查

  • 端口冲突:如果 8181 端口被占用,使用 --addr=0.0.0.0:8182 指定其他端口。
  • 策略未加载:检查 OPA 启动时指定的策略目录路径是否正确,或通过 curl http://localhost:8181/v1/policies 列出已加载的策略。
  • JSON 格式错误:curl 的 -d 参数必须使用双引号包裹键名,且不能有多余的逗号。
  • 跨域问题:如果从浏览器调用 OPA API,需要添加 --cors 标志启动 OPA。
💡 调试技巧: 使用 opa eval 命令可以在不启动服务器的情况下直接测试 Rego 策略:opa eval --data check_namespace.rego --input input.json "data.kubernetes.admission.allow"。这比 curl 测试更快速,适合策略开发阶段。

3.6 环境验证清单

完成上述步骤后,使用以下清单确认环境就绪:

检查项 验证方法 预期结果
OPA CLI 安装 opa version 显示版本号,无报错
OPA 服务器启动 curl http://localhost:8181/v1/health 返回 {"healthy":true}
策略上传 curl http://localhost:8181/v1/policies 返回已上传的策略列表
策略评估 执行合规/不合规的 curl 测试 分别返回 true 和 false