2. K8s 策略引擎介绍:OPA/Gatekeeper、Kyverno、准入控制器的工作原理与对比
在 Kubernetes 集群中,策略引擎是保障安全合规、资源治理与运维规范的核心组件。本章深入剖析三种主流策略实现机制:原生准入控制器(Admission Controller)、OPA/Gatekeeper 与 Kyverno,从工作原理、架构差异到选型建议进行系统性对比。
2.1 准入控制器(Admission Controller)——K8s 原生的策略拦截点
准入控制器是 Kubernetes API Server 内置的插件机制,在请求经过认证与鉴权之后、对象被持久化到 etcd 之前,拦截并处理 API 请求。它分为两类:变更(Mutating)与验证(Validating),分别对应 MutatingAdmissionWebhook 与 ValidatingAdmissionWebhook。
核心工作流程:
- 用户通过 kubectl 或客户端向 API Server 发送请求(如创建 Pod)。
- 请求经过认证(Authentication)与鉴权(Authorization)。
- 进入准入控制阶段:先执行 Mutating 准入控制器(可修改请求对象),再执行 Validating 准入控制器(校验对象是否合规)。
- 通过所有准入控制器后,对象被持久化到 etcd,并返回响应给客户端。
原生准入控制器(如 NamespaceLifecycle、LimitRanger、PodSecurity)以静态编译方式集成在 API Server 中,而 Webhook 模式允许用户注册外部 HTTP 回调,实现自定义策略逻辑。
关键区别: 原生准入控制器无需额外部署,但扩展性有限;Webhook 模式灵活但引入网络延迟与外部依赖,需保证高可用与证书管理。
2.2 OPA/Gatekeeper——基于 Rego 的策略即代码
OPA(Open Policy Agent)是一个通用的策略引擎,使用声明式语言 Rego 编写策略。Gatekeeper 是 OPA 在 Kubernetes 上的集成实现,作为 Admission Webhook 运行,拦截 API 请求并执行策略评估。
2.2.1 核心架构组件
- ConstraintTemplate:定义策略的 Rego 逻辑模板,描述如何评估资源。
- Constraint:实例化模板,指定作用范围(如命名空间、资源类型)与参数。
- Gatekeeper Webhook:接收 API Server 的准入请求,调用 OPA 引擎执行策略。
- Audit 机制:定期扫描集群中已有资源,标记违反策略的对象。
典型策略示例:禁止使用 latest 镜像标签
# constraint-template.yaml
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8sdisallowedtags
spec:
crd:
spec:
names:
kind: K8sDisallowedTags
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8sdisallowedtags
violation[{"msg": msg}] {
container := input.review.object.spec.containers[_]
endswith(container.image, ":latest")
msg := sprintf("Image %v uses tag :latest", [container.image])
}
---
# constraint.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sDisallowedTags
metadata:
name: disallow-latest-tag
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
parameters:
tags: ["latest"]
2.2.2 工作流程
- 管理员创建 ConstraintTemplate 与 Constraint 资源。
- 用户提交创建 Pod 的请求。
- API Server 将请求转发给 Gatekeeper Webhook。
- Gatekeeper 加载匹配的 Constraint,使用 Rego 引擎评估请求。
- 若违反策略,返回拒绝响应;否则放行。
2.3 Kyverno——专为 K8s 设计的策略引擎
Kyverno 是一个云原生策略引擎,使用 Kubernetes 原生资源定义策略,无需学习 Rego 等新语言。它支持 验证(Validate)、变更(Mutate)、生成(Generate) 与 清理(Cleanup) 四种策略类型。
2.3.1 策略定义方式
Kyverno 策略使用 YAML 编写,直接引用 K8s 对象字段,学习曲线低。例如,禁止特权容器的策略:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-privileged-containers
spec:
validationFailureAction: Enforce
rules:
- name: check-privileged
match:
any:
- resources:
kinds:
- Pod
validate:
message: "Privileged containers are not allowed."
pattern:
spec:
containers:
- securityContext:
privileged: "false"
2.3.2 核心特性
- 无需额外语言:策略直接使用 K8s 资源字段匹配,降低学习成本。
- 内置变更能力:可自动注入 Sidecar、添加标签、修改资源字段。
- 资源生成:根据策略自动创建 ConfigMap、Secret 等资源。
- 策略报告:自动生成 PolicyReport 资源,记录策略执行结果。
- Webhook 自动管理:Kyverno 自动注册与更新 Webhook 配置,简化运维。
适用场景: Kyverno 特别适合团队中 K8s 经验丰富但不想学习 Rego 的运维与安全人员,策略可读性强,易于审计。
2.4 三大策略引擎对比
| 对比维度 | 原生准入控制器 | OPA/Gatekeeper | Kyverno |
|---|---|---|---|
| 策略语言 | Go 代码(需编译进 API Server) | Rego 声明式语言 | YAML(K8s 原生字段匹配) |
| 部署复杂度 | 低(内置,无需额外组件) | 中(需部署 Gatekeeper 组件与 OPA) | 低(单一 Deployment) |
| 变更能力 | 部分支持(如 LimitRanger) | 支持(通过 Mutating Webhook) | 原生支持(Mutate 规则) |
| 资源生成 | 不支持 | 不支持 | 支持(Generate 规则) |
| 审计/报告 | 无内置审计 | 支持 Audit 扫描 | 内置 PolicyReport |
| 学习曲线 | 高(需开发 Go 插件) | 中高(需掌握 Rego) | 低(YAML 即可) |
| 社区生态 | 官方维护,扩展有限 | CNCF 毕业项目,生态丰富 | CNCF 孵化项目,增长迅速 |
| 性能开销 | 最低(进程内执行) | 中(外部 HTTP 调用 + Rego 评估) | 中(外部 HTTP 调用) |
2.5 选型建议与最佳实践
避坑指南:
- 不要在生产集群中同时部署 Gatekeeper 与 Kyverno 处理同一类资源,会导致 Webhook 冲突与重复评估。
- Gatekeeper 的 Rego 策略调试困难,建议使用
opa eval命令行工具本地测试后再部署。 - Kyverno 的 Mutate 规则执行顺序敏感,多个规则修改同一字段时需注意优先级。
- 所有 Webhook 必须配置
failurePolicy: Fail或Ignore,避免 Webhook 宕机导致集群不可用。
2.5.1 场景化选型
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 简单资源配额与限制 | 原生准入控制器(LimitRanger、ResourceQuota) | 零额外组件,性能最优 |
| 复杂安全策略(如 Pod Security Standards) | Kyverno 或 Gatekeeper | 支持细粒度匹配与审计报告 |
| 多集群统一策略管理 | OPA/Gatekeeper + OPA 数据平面 | Rego 策略可跨平台复用 |
| 需要自动注入 Sidecar 或配置 | Kyverno | 原生 Mutate 规则,无需额外开发 |
| 已有 Rego 策略资产 | OPA/Gatekeeper | 复用现有策略,降低迁移成本 |
2.5.2 生产部署要点
- 高可用部署:Webhook 服务至少 2 副本,配置 Pod Anti-Affinity 与 PDB。
- 证书轮换:Webhook 证书需定期轮换,建议使用 cert-manager 自动管理。
- 性能监控:监控 Webhook 响应延迟(P99 < 100ms),避免阻塞 API Server。
- 灰度发布:新策略先设为
audit模式(Kyverno)或dryrun(Gatekeeper),确认无影响后再强制实施。 - 策略版本管理:将策略代码纳入 GitOps 流程,使用 CI/CD 自动化测试与部署。
推荐组合: 对于大多数企业级 K8s 集群,建议使用 Kyverno 作为主要策略引擎(低学习成本、内置变更与生成能力),配合 OPA/Gatekeeper 处理跨平台或已有 Rego 策略的场景。原生准入控制器用于基础资源限制,三者形成互补策略体系。