OPA 简介
开放策略代理(Open Policy Agent, OPA)是一个开源的通用策略引擎,可用于统一实现跨技术栈的策略管理。它通过声明式语言(Rego)定义策略,并将策略决策与应用程序解耦,适用于访问控制、资源配额、合规性检查等场景。
OPA 与 Kubernetes 的集成
在 Kubernetes 中,OPA 通常通过以下两种方式集成:
- 作为准入控制器:通过动态准入控制(ValidatingAdmissionWebhook)拦截 API 请求,根据预定义的策略允许或拒绝操作。
- 通过 Gatekeeper :Gatekeeper 是 OPA 的 Kubernetes 专用适配器,提供更易用的 CRD(如
ConstraintTemplate
和Constraint
)管理策略。
核心功能
- 策略即代码:使用 Rego 编写策略,支持版本控制和自动化测试。
- 实时决策:在资源创建、更新或删除时立即执行策略检查。
- 多租户支持:可通过策略划分不同团队或项目的权限边界。
部署 OPA 到 Kubernetes
方法 1:直接部署 OPA 准入控制器
-
创建 OPA 的 Deployment 和 Service:
yamlapiVersion: apps/v1 kind: Deployment metadata: name: opa spec: replicas: 1 selector: matchLabels: app: opa template: metadata: labels: app: opa spec: containers: - name: opa image: openpolicyagent/opa:latest args: ["run", "--server", "--addr=localhost:8181"]
-
配置 ValidatingWebhookConfiguration:
yamlapiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: name: opa-validating-webhook webhooks: - name: validating-webhook.openpolicyagent.org rules: - operations: ["CREATE", "UPDATE"] apiGroups: ["*"] apiVersions: ["*"] resources: ["*"] clientConfig: service: name: opa namespace: default path: "/v1/admit"
方法 2:使用 Gatekeeper
-
安装 Gatekeeper:
bashkubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/master/deploy/gatekeeper.yaml
-
创建策略模板(ConstraintTemplate):
yamlapiVersion: templates.gatekeeper.sh/v1 kind: ConstraintTemplate metadata: name: k8srequiredlabels spec: crd: spec: names: kind: K8sRequiredLabels targets: - target: admission.k8s.gatekeeper.sh rego: | package k8srequiredlabels violation[{"msg": msg}] { input.review.object.metadata.labels[input.parameters.label] }
-
应用具体约束(Constraint):
yamlapiVersion: constraints.gatekeeper.sh/v1 kind: K8sRequiredLabels metadata: name: require-ns-labels spec: match: kinds: - apiGroups: [""] kinds: ["Namespace"] parameters: label: "environment"
策略示例(Rego 语言)
检查所有 Pod 必须包含特定标签:
rego
package kubernetes.admission
deny[msg] {
input.request.kind.kind == "Pod"
not input.request.object.metadata.labels["app"]
msg := "All pods must have an 'app' label"
}
验证与调试
-
使用
kubectl logs
查看 OPA 或 Gatekeeper 日志。 -
通过 OPA 的 REST API 本地测试策略:
bashcurl -X POST http://localhost:8181/v1/data/kubernetes/admission \ -H "Content-Type: application/json" \ -d @input.json
适用场景
- 强制资源标签/注解
- 禁止使用最新镜像标签(
latest
) - 限制存储类或 Ingress 类的使用
- 确保 Pod 安全上下文配置符合标准
注意事项
- 策略需谨慎设计,避免过度限制影响正常操作。
- 生产环境建议启用 OPA/Gatekeeper 的高可用模式。
- 定期审计策略与实际需求的匹配性。