2. Kyverno 基础回顾:架构、核心概念与策略模型

在深入性能基准测试之前,必须重新梳理 Kyverno 的架构与核心概念。Kyverno 并非简单的策略引擎,而是一个运行在 Kubernetes 内部的动态准入控制器。理解其内部组件协作方式以及 Policy/Rule/Match/Exclude 的语义,是后续设计压测场景、分析性能瓶颈的基石。

2.1 Kyverno 架构概览

Kyverno 以 Deployment 形式部署在集群中,通常包含三个核心组件:Webhook Server、Policy Controller 和 Report Controller。其中,Webhook Server 直接处理准入请求,是性能测试的核心关注点。

架构要点: Kyverno 的 Webhook Server 接收 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration 发来的 AdmissionReview 请求,在内存中加载并匹配策略,最终返回 AdmissionResponse。整个过程完全在集群内部完成,不依赖外部服务。
Kyverno 核心架构与准入请求流 Kyverno 核心架构与准入请求流 kube-apiserver Webhook Server 策略缓存 (内存) 匹配结果返回 Policy Controller Report Controller 组件职责说明 • Webhook Server:接收 AdmissionReview,解析请求对象,执行策略匹配与处理,返回响应。 • Policy Controller:监听 Policy/ClusterPolicy 资源变化,编译策略并更新内存缓存。 • Report Controller:生成策略执行报告(PolicyReport),用于审计与合规检查。 • 策略缓存:存储已编译的策略规则,支持快速查找,是性能基准测试的关键优化点。

2.2 核心概念:Policy、Rule、Match/Exclude

Kyverno 的策略模型采用分层结构:一个 Policy 包含多个 Rule,每个 Rule 通过 Match 和 Exclude 声明式地定义其适用范围。这种设计使得策略复用与组合非常灵活,但也直接影响准入请求的处理路径长度。

概念 作用域 说明 性能影响
Policy Namespaced / Cluster 策略的顶层容器,包含元数据、背景检查和规则列表。 每个 Policy 的加载与缓存占用内存;规则数量影响匹配循环。
Rule Policy 内部 定义具体的匹配条件、验证或变更逻辑。每个 Rule 独立执行。 规则数量线性增加处理时间;复杂逻辑(如 JSON 补丁)增加 CPU 开销。
Match Rule 内部 声明哪些资源(kind、label、namespace、name)应触发该 Rule。 匹配条件越精确,跳过不相关请求越快;宽泛匹配增加无效评估。
Exclude Rule 内部 声明哪些资源应被排除,优先级高于 Match。 Exclude 列表过长会额外增加匹配开销,建议使用标签而非名称列表。
性能提示: 在基准测试中,应分别测试“全匹配命中”、“部分匹配命中”和“全部跳过”三种场景。Match/Exclude 的复杂度直接影响 Webhook Server 的吞吐量,尤其是当规则数量超过 50 条时,匹配算法的效率差异会显著放大。

2.3 策略执行流程与匹配逻辑

当一个 AdmissionReview 请求到达 Webhook Server 时,Kyverno 会按以下顺序执行策略匹配。理解这个流程有助于在性能测试中定位瓶颈点。

  1. 请求解析: 从 AdmissionReview 中提取资源类型(Kind)、命名空间、名称、标签等元数据。
  2. 策略筛选: 遍历所有已缓存的 Policy,检查是否适用于当前资源类型(通过 Match 中的 kind 字段)。
  3. Rule 匹配: 对每个命中的 Policy,依次评估其 Rule 的 Match 条件;若 Match 通过,则检查 Exclude 条件。
  4. 策略执行: 对匹配成功的 Rule,执行 validate / mutate / generate 等操作。
  5. 响应组装: 将执行结果(允许/拒绝/补丁)封装为 AdmissionResponse 返回。
Kyverno 策略匹配与执行流程 Kyverno 策略匹配与执行流程 1. 请求解析 2. 策略筛选 3. Rule 匹配 4. 策略执行 匹配失败 → 跳过 5. 响应组装 匹配逻辑关键点 • 策略筛选阶段:Kyverno 会跳过不匹配资源类型的 Policy,减少无效评估。 • Rule 匹配阶段:支持任意(any)和全部(all)两种匹配条件,any 模式在第一个条件满足时即停止。 • 性能优化:将高频匹配的规则放在 Policy 列表前面,利用 any 条件减少评估次数。

2.4 策略类型与性能特征

Kyverno 支持三种策略动作:validate(验证)、mutate(变更)和 generate(生成)。在准入阶段,validate 和 mutate 是性能测试的主要对象,generate 通常发生在后台。

策略类型 执行时机 典型操作 性能特征
validate 准入阶段(AdmissionReview) 检查字段值、标签、注解、镜像签名等 CPU 密集型,尤其是 pattern 表达式和 deny 条件;JSON 解析开销大
mutate 准入阶段(AdmissionReview) 添加标签、修改镜像地址、注入 Sidecar 内存与 CPU 混合型;JSON Patch 生成与合并增加响应体大小
generate 后台异步(非准入) 创建 ConfigMap、Secret、Namespace 等 不直接影响准入延迟,但可能增加 etcd 与 API Server 负载
基准测试注意: mutate 策略会修改 AdmissionReview 中的 object,导致响应体变大,进而增加网络传输与序列化/反序列化开销。在测试中,应分别测量 validate-only 和 mutate-only 场景的延迟分布,避免混合结果掩盖真实瓶颈。

2.5 本章小结