k8s opa集成
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:
apiVersion: apps/v1 kind: Deployment metadata:name: opa spec:replicas: 1selector:matchLabels:app: opatemplate:metadata:labels:app: opaspec:containers:- name: opaimage: openpolicyagent/opa:latestargs: ["run", "--server", "--addr=localhost:8181"]
-
配置 ValidatingWebhookConfiguration:
apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata:name: opa-validating-webhook webhooks:- name: validating-webhook.openpolicyagent.orgrules:- operations: ["CREATE", "UPDATE"]apiGroups: ["*"]apiVersions: ["*"]resources: ["*"]clientConfig:service:name: opanamespace: defaultpath: "/v1/admit"
方法 2:使用 Gatekeeper
-
安装 Gatekeeper:
kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/master/deploy/gatekeeper.yaml
-
创建策略模板(ConstraintTemplate):
apiVersion: templates.gatekeeper.sh/v1 kind: ConstraintTemplate metadata:name: k8srequiredlabels spec:crd:spec:names:kind: K8sRequiredLabelstargets:- target: admission.k8s.gatekeeper.shrego: |package k8srequiredlabelsviolation[{"msg": msg}] {input.review.object.metadata.labels[input.parameters.label]}
-
应用具体约束(Constraint):
apiVersion: constraints.gatekeeper.sh/v1 kind: K8sRequiredLabels metadata:name: require-ns-labels spec:match:kinds:- apiGroups: [""]kinds: ["Namespace"]parameters:label: "environment"
策略示例(Rego 语言)
检查所有 Pod 必须包含特定标签:
package kubernetes.admissiondeny[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 本地测试策略:
curl -X POST http://localhost:8181/v1/data/kubernetes/admission \-H "Content-Type: application/json" \-d @input.json
适用场景
- 强制资源标签/注解
- 禁止使用最新镜像标签(
latest
) - 限制存储类或 Ingress 类的使用
- 确保 Pod 安全上下文配置符合标准
注意事项
- 策略需谨慎设计,避免过度限制影响正常操作。
- 生产环境建议启用 OPA/Gatekeeper 的高可用模式。
- 定期审计策略与实际需求的匹配性。