3、Kyverno简介:Kyverno项目背景、核心能力(策略即代码),与OPA/Gatekeeper的对比

3.1 项目背景与定位

Kyverno 是一个由 Nirmata 公司发起、后捐赠给 CNCF 的 Kubernetes 原生策略引擎,于 2021 年进入 CNCF Incubating 阶段。其设计哲学是“策略即代码”(Policy as Code),但与其他方案最大的区别在于:Kyverno 使用 Kubernetes 资源(CRD)来定义策略,而非通用编程语言或 DSL。

这意味着任何熟悉 Kubernetes 资源清单的工程师,都可以用 YAML 直接编写策略,无需学习 Rego、Lua 或 JavaScript 等额外语言。Kyverno 以 Admission Webhook 的形式运行在集群内,拦截资源创建/更新请求,并根据策略规则进行验证、变更或生成资源。

核心定位: Kyverno 不是通用策略引擎,而是专为 Kubernetes 设计的策略引擎。它深度集成 Kubernetes 原生对象模型,天然支持 Namespace、Label、Annotation、ServiceAccount 等 Kubernetes 概念。

3.2 核心能力:策略即代码

Kyverno 的策略模型围绕三个核心动作构建,覆盖了准入控制的完整生命周期:

动作类型 策略关键字 功能描述 典型场景
验证(Validate) validate 检查资源是否符合规则,不符合则拒绝创建/更新 强制 Pod 必须设置资源限制、禁止使用 latest 镜像标签
变更(Mutate) mutate 在资源持久化前自动修改其字段 自动注入 Sidecar、添加默认 Label、设置 Pod 安全上下文
生成(Generate) generate 根据源资源自动创建关联资源 为每个 Namespace 自动创建 NetworkPolicy、ResourceQuota

以下是一个典型的验证策略示例,禁止 Pod 使用 latest 镜像标签:

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: disallow-latest-tag
spec:
  validationFailureAction: Enforce
  rules:
  - name: require-image-tag
    match:
      any:
      - resources:
          kinds:
          - Pod
    validate:
      message: "使用 'latest' 标签的镜像是不允许的。"
      pattern:
        spec:
          containers:
          - image: "!*:latest"
策略即代码的关键特征:
  • 声明式: 策略以 YAML 资源清单形式存在,可纳入 GitOps 流程。
  • 可测试: 支持 kyverno test 命令对策略进行单元测试。
  • 可观测: 提供策略执行报告(PolicyReport)和集群策略报告(ClusterPolicyReport)。
  • 可组合: 支持策略集(PolicySet)和策略异常(PolicyException)。

3.3 与 OPA/Gatekeeper 的对比

OPA(Open Policy Agent)结合 Gatekeeper 是目前 Kubernetes 生态中最广泛使用的策略引擎方案。两者在架构、策略语言、运维复杂度上存在显著差异。以下从多个维度进行对比:

对比维度 Kyverno OPA + Gatekeeper
策略语言 YAML(Kubernetes 原生资源) Rego(声明式查询语言)
学习曲线 低:熟悉 K8s YAML 即可上手 高:需学习 Rego 语法和逻辑
架构模式 单一 Webhook + CRD 控制器 OPA 作为独立服务 + Gatekeeper 作为 Webhook 适配器
变更能力 原生支持 mutate 动作 需额外编写 Rego 规则实现,复杂度高
生成能力 原生支持 generate 动作 不支持,需外部控制器配合
策略分发 通过 ClusterPolicy/Policy CRD 分发 通过 ConstraintTemplate + Constraint CRD 分发
性能开销 低:策略编译为 JSON 规则直接匹配 中:Rego 查询需 OPA 引擎评估
社区生态 CNCF Incubating,策略库 300+ CNCF Graduated,策略库 1000+
灾备场景适配 强:原生支持 mutate/generate,适合自动化注入 中:需额外开发 Rego 规则实现类似功能
选型建议: 如果团队以 Kubernetes 工程师为主,追求低学习成本和快速落地,Kyverno 是更优选择;如果团队已有 Rego 经验或需要跨 Kubernetes 的通用策略能力(如 Terraform、Docker、HTTP API),OPA/Gatekeeper 更合适。在灾备场景中,Kyverno 的 mutate 和 generate 能力可以显著降低自动化注入 Sidecar、配置网络策略的复杂度。

3.4 Kyverno 架构概览

下图展示了 Kyverno 的核心组件及其在 Kubernetes 集群中的部署架构:

Kyverno 核心架构组件 Kubernetes API Server Admission Webhook Kyverno Controller CRD 策略存储 策略执行引擎 PolicyReport 生成 准入请求转发 读取策略 策略评估 说明:Kyverno 以单一 Deployment 部署,内部包含 Webhook Server、Controller 和策略引擎,所有组件共享同一进程空间,无需额外部署外部策略服务。

3.5 策略执行流程

当用户通过 kubectl apply 提交资源时,Kyverno 的准入控制流程如下:

  1. 请求拦截: API Server 将创建/更新请求发送至 Kyverno 的 Admission Webhook。
  2. 策略匹配: Webhook 根据请求的资源类型、Namespace、Label 等属性,匹配已加载的 ClusterPolicy/Policy。
  3. 规则执行: 按顺序执行匹配策略中的 validate、mutate、generate 规则。
  4. 变更应用: 如果存在 mutate 规则,Webhook 返回修改后的资源 JSON Patch。
  5. 验证判断: 如果存在 validate 规则,根据 validationFailureAction(Enforce/Audit)决定是否拒绝请求。
  6. 报告生成: 异步生成 PolicyReport 记录策略执行结果。
灾备场景优势: Kyverno 的 mutate 能力可以在资源创建时自动注入灾备 Sidecar(如 Velero 插件、数据同步代理),generate 能力可以为每个 Namespace 自动创建灾备相关的 NetworkPolicy 和 VolumeSnapshotClass,无需人工干预。