3. Kyverno 基础架构:Admission Webhook、Policy Engine、Rule 生命周期

在容量规划视角下,理解 Kyverno 的内部架构是评估其资源消耗与性能瓶颈的前提。Kyverno 作为 Kubernetes 原生的策略引擎,其核心运行机制围绕 Admission Webhook、Policy Engine 和 Rule 生命周期 三个关键组件展开。本节将逐一拆解这些组件,并分析它们对集群资源(CPU、内存、API Server 吞吐量)的影响。

3.1 核心架构总览

Kyverno 以 Pod 形式部署在集群中,通常包含一个或多个副本。其工作流程始于 Kubernetes API Server 的准入请求,终于策略的判定与响应。下图展示了 Kyverno 的核心组件及其交互关系:

Kyverno 核心架构组件图 Kyverno 核心架构组件图 Kubernetes API Server Admission Webhook (Mutating / Validating) Policy Engine (规则匹配与执行) Rule 生命周期 (Load / Cache / Evaluate / Report) 准入响应 (Allow/Deny/Patch) 容量规划关注点 • Webhook 延迟 • 引擎 CPU 消耗 • 规则缓存命中率
容量规划提示: 在 Kyverno 架构中,Admission Webhook 是请求入口,其响应时间直接影响 Pod 创建延迟;Policy Engine 是 CPU 密集型组件,规则复杂度与数量决定了单次请求的消耗;Rule 生命周期 管理则影响内存占用与缓存效率。

3.2 Admission Webhook:请求入口与资源消耗

Kyverno 通过注册 MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook 来拦截资源请求。这是 Kyverno 与 API Server 交互的唯一通道,也是容量规划的首要关注点。

3.2.1 Webhook 类型与作用

Webhook 类型 触发时机 主要操作 对资源的影响
MutatingWebhook 资源持久化之前 修改资源(注入 Sidecar、添加标签、设置默认值) 增加 API Server 序列化/反序列化开销;Kyverno 需返回 JSON Patch
ValidatingWebhook 资源持久化之后、存储之前 验证资源(检查镜像仓库、禁止特权容器) 增加 API Server 等待时间;Kyverno 需返回 Allow/Deny 判定

3.2.2 容量规划关键指标

  • Webhook 超时设置: 默认 30s,但建议根据规则复杂度调整为 5s-15s,避免长时间占用 API Server 连接池。
  • 失败策略 (failurePolicy): Fail 或 Ignore。在容量不足时,Ignore 可避免级联故障,但会降低策略覆盖率。
  • 并发请求数: 每个 Kyverno Pod 默认处理 50 个并发请求。当集群规模较大(如每秒创建 100+ Pod)时,需增加副本数或调整 maxConcurrent 参数。
常见陷阱: 如果 Kyverno 响应缓慢,API Server 会累积未完成的准入请求,导致 API Server 自身内存飙升。务必为 Kyverno 设置 资源请求与限制(如 CPU: 500m, Memory: 512Mi),并监控 webhook_duration_seconds 指标。

3.3 Policy Engine:规则匹配与执行引擎

Policy Engine 是 Kyverno 的大脑,负责加载策略、匹配资源、执行规则并生成结果。从容量规划角度看,引擎的 规则匹配算法 和 执行路径 是性能瓶颈的核心。

3.3.1 引擎工作流程

  1. 策略加载: 从 ConfigMap 或自定义资源 (Policy/ClusterPolicy) 中读取 YAML 定义。
  2. 资源匹配: 根据 match 和 exclude 规则过滤资源(按 kind、label、namespace 等)。
  3. 规则执行: 按顺序执行 validate、mutate、generate 或 verifyImages 规则。
  4. 结果聚合: 将所有规则结果合并为最终的准入响应。

3.3.2 规则类型与性能特征

规则类型 CPU 消耗 内存消耗 典型场景
validate 中 低 检查 Pod 安全上下文、禁止 hostNetwork
mutate 高 中 注入 Sidecar、添加资源限制默认值
generate 低(仅创建时触发) 低 为 Namespace 自动生成 NetworkPolicy
verifyImages 极高 高 验证镜像签名(需下载并检查 OCI 签名)
容量规划建议: verifyImages 规则会引入额外的网络 I/O 和签名验证计算,建议仅在关键命名空间启用,并为其预留独立的 Kyverno 实例或调整资源配额。

3.4 Rule 生命周期:从加载到回收

每条 Kyverno 规则都经历 加载 → 缓存 → 评估 → 报告 → 回收 的完整生命周期。理解这一过程有助于预测内存增长趋势和缓存失效开销。

3.4.1 生命周期阶段详解

Rule 生命周期阶段图 Rule 生命周期阶段图 1. 加载 从 CRD 读取 2. 缓存 编译为 AST 3. 评估 匹配与执行 4. 报告 生成 PolicyReport 5. 回收 GC 清理 容量规划关键点 • 加载阶段: 策略变更时触发全量重加载,导致 CPU 瞬时飙升。建议减少策略变更频率,或使用 --backgroundScanInterval 控制扫描间隔。 • 缓存阶段: 编译后的 AST 存储在内存中。规则越多,内存占用越大。建议定期清理未使用的策略。 • 报告阶段: PolicyReport 对象会持续累积,建议配置 TTL 或定期清理历史报告。

3.4.2 生命周期各阶段的资源消耗

阶段 触发条件 主要资源消耗 容量规划建议
加载 策略创建/更新/删除 CPU(解析 YAML、编译规则) 避免频繁更新策略;使用 --policyCacheMaxSize 限制缓存大小
缓存 策略加载后 内存(存储 AST、正则表达式、变量绑定) 监控 kyverno_policy_rule_count 指标;预估每条规则约占用 50-200KB 内存
评估 每次准入请求 CPU(模式匹配、JMESPath 查询、条件判断) 使用 --maxQueuedRequests 控制队列深度;避免在规则中使用高复杂度正则
报告 评估完成后 API Server 存储(创建/更新 PolicyReport) 启用 --reportingInterval 批量上报;设置报告保留天数
回收 策略删除或 Pod 重启 内存释放(GC 开销) 确保 Pod 有足够的 Memory Limit 避免 OOMKill
最佳实践: 在容量规划测试中,建议使用 kyverno benchmark 命令(或自定义压测脚本)模拟不同规模的规则集和并发请求,观察 Kyverno Pod 的 CPU 和内存曲线。通常,每 100 条规则约增加 50-100MB 内存占用。

3.5 组件协同与容量规划总结

Kyverno 的三个核心组件并非独立运行,而是形成一个完整的请求处理流水线。任何一环的瓶颈都会影响整体性能。下表总结了各组件在容量规划中的关键参数:

组件 关键配置参数 监控指标 扩容策略
Admission Webhook maxConcurrent, failurePolicy, timeoutSeconds webhook_request_duration_seconds, webhook_requests_total 增加 Pod 副本数;调整 maxConcurrent 至 100-200
Policy Engine --maxQueuedRequests, --backgroundScanInterval policy_execution_duration_seconds, policy_evaluation_count 拆分规则到多个 Kyverno 实例;使用 --ruleCapacity 限制单实例规则数
Rule 生命周期 --policyCacheMaxSize, --reportingInterval policy_cache_size, policy_report_count 定期清理缓存和报告;为 Kyverno 设置合适的 Memory Limit