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。

核心工作流程:
  1. 用户通过 kubectl 或客户端向 API Server 发送请求(如创建 Pod)。
  2. 请求经过认证(Authentication)与鉴权(Authorization)。
  3. 进入准入控制阶段:先执行 Mutating 准入控制器(可修改请求对象),再执行 Validating 准入控制器(校验对象是否合规)。
  4. 通过所有准入控制器后,对象被持久化到 etcd,并返回响应给客户端。

原生准入控制器(如 NamespaceLifecycle、LimitRanger、PodSecurity)以静态编译方式集成在 API Server 中,而 Webhook 模式允许用户注册外部 HTTP 回调,实现自定义策略逻辑。

关键区别: 原生准入控制器无需额外部署,但扩展性有限;Webhook 模式灵活但引入网络延迟与外部依赖,需保证高可用与证书管理。
K8s API 请求准入控制流程 用户/kubectl API Server 认证 → 鉴权 准入控制阶段 Mutating Webhook Validating Webhook 原生准入控制器 etcd 持久化 拒绝并返回错误

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 工作流程

  1. 管理员创建 ConstraintTemplate 与 Constraint 资源。
  2. 用户提交创建 Pod 的请求。
  3. API Server 将请求转发给 Gatekeeper Webhook。
  4. Gatekeeper 加载匹配的 Constraint,使用 Rego 引擎评估请求。
  5. 若违反策略,返回拒绝响应;否则放行。

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 调用)
三大策略引擎架构对比 原生准入控制器 API Server 进程内 静态编译插件 无外部依赖 扩展需改 Go 代码 OPA / Gatekeeper Admission Webhook Rego 策略引擎 ConstraintTemplate + Constraint 需学习 Rego 语言 Kyverno Admission Webhook YAML 原生策略 Validate / Mutate / Generate 自动 Webhook 管理

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 策略的场景。原生准入控制器用于基础资源限制,三者形成互补策略体系。