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。整个过程完全在集群内部完成,不依赖外部服务。
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 会按以下顺序执行策略匹配。理解这个流程有助于在性能测试中定位瓶颈点。
- 请求解析: 从 AdmissionReview 中提取资源类型(Kind)、命名空间、名称、标签等元数据。
- 策略筛选: 遍历所有已缓存的 Policy,检查是否适用于当前资源类型(通过 Match 中的 kind 字段)。
- Rule 匹配: 对每个命中的 Policy,依次评估其 Rule 的 Match 条件;若 Match 通过,则检查 Exclude 条件。
- 策略执行: 对匹配成功的 Rule,执行 validate / mutate / generate 等操作。
- 响应组装: 将执行结果(允许/拒绝/补丁)封装为 AdmissionResponse 返回。
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 场景的延迟分布,避免混合结果掩盖真实瓶颈。