3. OPA 与 Gatekeeper 介绍

在 Kubernetes 集群中实施细粒度的准入控制,需要一种能够将策略决策与策略执行分离的通用框架。OPA(Open Policy Agent)正是为此而生,而 Gatekeeper 则是 OPA 在 Kubernetes 生态中的原生集成方案。本节将系统介绍 OPA 的核心概念、Rego 策略语言基础以及 Gatekeeper 的项目架构。

3.1 OPA(Open Policy Agent)简介

OPA 是一个开源的、通用策略引擎,它将策略决策从软件的业务逻辑中解耦出来。无论你的服务是微服务、CI/CD 流水线还是 Kubernetes 集群,OPA 都能提供统一的策略即代码(Policy as Code)能力。

核心设计理念:OPA 不负责执行策略,只负责做出决策。它通过接收 JSON 格式的输入(Input),结合预先定义的策略规则(Policy),输出决策结果(Decision)。这种“问-答”模式使得 OPA 可以嵌入到任何需要策略判断的系统中。

OPA 的关键特性

特性 说明
策略即代码 使用声明式语言 Rego 编写策略,支持版本控制、测试和自动化部署。
上下文感知 决策不仅依赖请求本身,还可以查询外部数据(如集群状态、用户属性)。
高性能 支持策略预编译和缓存,单次决策延迟通常在微秒级。
平台无关 可作为 Sidecar、库或独立服务运行,与 Kubernetes、Envoy、Kafka 等集成。
细粒度控制 支持 allow/deny、mutate(修改请求)、warn(告警)等多种决策类型。
OPA 在 K8s 中的角色:OPA 本身是一个通用引擎,但通过 Gatekeeper 项目,它被转化为 Kubernetes 的动态准入控制器(Dynamic Admission Controller),拦截所有 API Server 请求并执行策略检查。

3.2 Rego 语言概述

Rego 是 OPA 的专用查询语言,灵感来源于 Datalog。它是一种声明式语言,意味着你只需要描述“策略应该是什么”,而不需要描述“如何实现策略”。Rego 的核心是规则(Rules)和查询(Queries)。

Rego 基础语法

  • 包(Package): 每个 Rego 文件以 package 关键字开头,用于组织策略。
  • 规则(Rule): 使用 rule_name { condition } 定义,条件为真时规则成立。
  • 默认值(Default): 使用 default allow = false 设置规则的默认值。
  • 迭代(Iteration): 使用 some 关键字遍历集合或数组。
  • 内置函数: 提供 count()、split()、regex.match() 等丰富函数。
典型 Rego 策略示例:禁止所有容器使用 latest 标签。
package kubernetes.admission

import data.kubernetes.namespaces

# 默认拒绝所有请求
default deny = false

# 定义拒绝规则:如果任何容器镜像标签为 "latest",则拒绝
deny[msg] {
    input.request.kind.kind == "Pod"
    some container in input.request.object.spec.containers
    endswith(container.image, ":latest")
    msg := sprintf("容器 %v 使用了禁止的 latest 标签", [container.name])
}

Rego 与 JSON 的交互

Rego 原生支持 JSON 数据结构。OPA 将输入(Input)和外部数据(Data)都视为 JSON 文档,Rego 规则通过点号(.)或方括号([])访问这些文档的字段。

概念 Rego 表示 说明
输入 input.request.object.metadata.name 访问被审查的 K8s 资源名称
数据 data.kubernetes.namespaces 访问集群中的命名空间列表
迭代 some container in input.request.object.spec.containers 遍历 Pod 中的所有容器
集合操作 { "a", "b" } == { "b", "a" } 集合无序比较,结果为 true
常见陷阱:Rego 中的变量一旦绑定,在同一规则内不可重新赋值。这与传统编程语言不同,容易导致逻辑错误。建议使用 some 关键字显式声明迭代变量。

3.3 Gatekeeper 项目架构

Gatekeeper 是 OPA 在 Kubernetes 生态中的官方集成项目,由 Google 和微软联合维护,现为 CNCF 毕业项目。它将 OPA 作为准入 Webhook 部署在集群中,并通过 CRD(Custom Resource Definition)提供声明式的策略管理接口。

核心组件

  • Gatekeeper Controller: 管理 CRD 资源(ConstraintTemplate、Constraint),并负责 OPA 策略的生命周期。
  • OPA Sidecar: 与 Controller 同 Pod 运行,提供策略评估引擎。
  • Admission Webhook: 注册到 API Server,拦截 CREATE、UPDATE 等操作。
  • Audit 组件: 定期对集群中已有资源进行策略合规性检查,生成审计结果。

Gatekeeper 架构图

Gatekeeper 核心架构 Kubernetes API Server Admission Webhook Gatekeeper Controller OPA Sidecar CRD 存储 (etcd) Audit 组件 请求转发 注册/同步 策略下发 读写 审计检查 策略评估 工作流程说明: 1. 用户通过 kubectl 或 API 创建/更新资源 → API Server 触发 Admission Webhook 2. Webhook 将请求转发给 OPA Sidecar 进行策略评估 → 返回 allow/deny 决策 3. Controller 同步 CRD 中的策略到 OPA,Audit 组件定期检查已有资源合规性

关键 CRD 资源

CRD 名称 作用 示例
ConstraintTemplate 定义 Rego 策略模板,描述“如何检查” K8sRequiredLabels 模板检查必填标签
Constraint 实例化模板,定义“检查什么”和“参数” required-labels-prod 约束要求生产命名空间必须有 env: prod 标签
Config 配置 Gatekeeper 的全局行为,如排除特定命名空间 排除 kube-system 命名空间

Gatekeeper 与原生 OPA 的对比

维度 原生 OPA Gatekeeper
部署方式 需手动部署 OPA 服务并配置 Webhook Operator 模式,一键部署,自动配置 Webhook
策略管理 通过 ConfigMap 或 API 管理策略 通过 CRD(ConstraintTemplate + Constraint)管理,原生 K8s 体验
审计能力 需自行实现审计逻辑 内置审计组件,自动检查已有资源
社区生态 通用引擎,社区库较少 CNCF 毕业项目,提供丰富的预置策略库(Gatekeeper Library)
适用场景 需要高度自定义策略引擎的场景 Kubernetes 原生策略管理,开箱即用
生产建议:对于大多数 Kubernetes 集群,推荐直接使用 Gatekeeper。它不仅简化了 OPA 的部署和运维,还提供了审计、约束模板等企业级功能。如果需要在非 K8s 环境中使用 OPA,则选择原生 OPA 部署方式。

3.4 本章小结

OPA 提供了强大的策略即代码能力,Rego 语言以其声明式特性简化了复杂策略的编写。Gatekeeper 作为 OPA 在 Kubernetes 中的官方集成,通过 CRD 和 Webhook 机制,将策略管理完全融入 K8s 原生生态。理解这三者的关系,是后续学习准入控制策略编写与调度器参数调优的基础。