4. 策略引擎架构:Kyverno策略引擎内部组件、策略匹配与执行流程、资源变更与验证链路

Kyverno 的策略引擎并非一个简单的单体服务,而是一组在 Kubernetes 控制平面内外协同工作的组件集合。理解其内部架构是进行性能调优和故障排查的前提。本章将深入剖析引擎的核心组件、策略匹配与执行流程,以及资源变更与验证的完整链路。

4.1 核心内部组件

Kyverno 的策略引擎主要由以下几个关键组件构成,它们各司其职,共同完成策略的加载、匹配、执行与报告生成。

组件名称 职责描述 关键特性
Webhook Server 接收 API Server 发送的准入请求(AdmissionReview),作为策略引擎的入口。 支持 Mutating 和 Validating 两种 Webhook 类型;负责 TLS 终止与请求认证。
Policy Controller 监听集群中的 Policy 资源(如 ClusterPolicy, Policy)的变化,维护策略的缓存与状态。 使用 Informer 机制实时同步;负责策略的语法校验与默认值注入。
Engine 核心执行单元,负责将准入请求与缓存中的策略进行匹配,并执行策略逻辑。 包含匹配引擎、验证引擎、变更引擎;支持 JMESPath 表达式处理。
Report Controller 生成并管理策略执行报告(PolicyReport, ClusterPolicyReport),记录策略结果。 聚合引擎执行结果;支持后台扫描(Background Scan)模式。
Cache Layer 缓存策略定义、资源上下文(如 ConfigMap, Namespace 标签)以及预编译的表达式。 减少对 API Server 的重复查询;提升策略匹配与执行效率。
性能提示: Webhook Server 与 Engine 是性能敏感路径。在高并发场景下,Cache Layer 的命中率直接决定了策略引擎的响应延迟。建议通过监控指标 kyverno_cache_hits_total 与 kyverno_cache_misses_total 评估缓存效率。

4.2 策略匹配与执行流程

当一个资源请求(如创建 Pod)到达 Kyverno 时,引擎会按照严格的顺序执行匹配与处理。下图展示了从请求接收到策略响应的完整流程。

Kyverno 策略匹配与执行流程 1. 接收 AdmissionReview 2. 解析请求资源 (GVK) 3. 策略匹配 (Match/Exclude) 4. 执行 Preconditions 5. 执行规则 (Mutate/Validate) 6. 生成 AdmissionResponse 7. 返回给 API Server 说明:步骤 3-5 为引擎核心处理逻辑,涉及缓存查询、JMESPath 表达式求值与资源对象操作。

上述流程中,策略匹配(步骤 3)是性能的关键瓶颈。Kyverno 会依次检查策略的 match 和 exclude 块,支持按资源类型、标签选择器、命名空间选择器、用户信息等进行匹配。匹配成功后,才会进入 Preconditions 检查,最后执行具体的 Mutate 或 Validate 规则。

4.3 资源变更与验证链路

Kyverno 支持两种准入控制类型:Mutating(资源变更)和 Validating(资源验证)。这两种链路在引擎内部的处理逻辑有所不同,但都遵循“先变更、后验证”的原则。

4.3.1 Mutating 链路

  • 触发时机: 在资源被持久化到 etcd 之前。
  • 处理逻辑: 引擎通过 JSON Patch 操作修改 AdmissionRequest 中的 Object 字段。
  • 关键点: 支持 patchesJson6902 和 patchesStrategicMerge 两种补丁格式。多个 Mutating 策略按优先级顺序执行。
  • 性能考量: 补丁操作涉及深拷贝与 JSON 序列化/反序列化,大对象(如包含大量 ConfigMap 的 Pod)会显著增加延迟。

4.3.2 Validating 链路

  • 触发时机: 在 Mutating 链路执行完毕之后,资源即将写入 etcd 之前。
  • 处理逻辑: 引擎对变更后的资源对象进行条件检查(如 deny 规则)或模式校验(如 pattern 规则)。
  • 关键点: 支持 anyPattern 和 allPattern 逻辑组合。验证失败会返回包含详细原因的 AdmissionResponse。
  • 性能考量: 复杂的 JMESPath 表达式(如嵌套的 contains() 或 filter())是验证链路的主要 CPU 消耗点。
架构决策: Kyverno 将 Mutating 和 Validating 拆分为两个独立的 Webhook 配置(kyverno-mutating-webhook 和 kyverno-validating-webhook)。这种设计允许运维人员独立调整超时时间、失败策略(Failure Policy)和资源配额,从而更精细地控制准入链路的稳定性。

4.4 完整验证链路示意图

下图展示了在 Kubernetes 控制平面中,一个资源请求经过 API Server 认证授权后,如何依次经过 Kyverno 的 Mutating 和 Validating 两个阶段,最终被持久化或拒绝。

Kyverno 资源变更与验证链路 API Server 认证/授权/限流 Mutating Webhook 资源变更 (JSON Patch) Validating Webhook 资源验证 (Deny/Pattern) etcd 持久化存储 拒绝请求 说明:Mutating Webhook 执行成功后,API Server 会使用变更后的资源对象再次发起 Validating Webhook 请求。
避坑指南: 如果 Mutating Webhook 修改了资源,但 Validating Webhook 策略依赖于修改前的资源状态,可能会导致验证失败。建议在 Validating 策略中始终使用 request.object(变更后的对象)而非 request.oldObject,除非你有明确的版本对比需求。

4.5 性能优化关键点

基于上述架构分析,以下是针对策略引擎性能优化的几个核心方向:

  1. 减少不必要的 Webhook 调用: 在 match 块中精确指定资源类型和操作(如 CREATE, UPDATE),避免对所有资源进行拦截。
  2. 优化 Preconditions: 将计算量大的 JMESPath 表达式放在 Preconditions 中,提前过滤掉不满足条件的请求,减少后续规则执行的开销。
  3. 缓存预热: 对于频繁引用的 ConfigMap 或 Namespace 标签,确保 Kyverno 的 Cache Layer 已预热。可以通过启动时触发一次无关紧要的请求来预热缓存。
  4. 调整 Webhook 超时: 根据策略复杂度合理设置 timeoutSeconds(默认 10s)。对于复杂的 Mutate 策略,适当增加超时时间可以避免因超时导致的请求失败。
  5. 监控引擎指标: 重点关注 kyverno_admission_request_duration_seconds 和 kyverno_policy_execution_duration_seconds 两个指标,它们能直接反映引擎的处理性能。