2. Kyverno 架构基础:Admission Controller 工作流、Webhook 与缓存的关系、策略引擎核心组件
2.1 Admission Controller 工作流:从请求到决策
Kubernetes API Server 在持久化任何资源(Pod、Service、Deployment 等)之前,会依次调用注册的 Admission Controller。Kyverno 作为 动态准入 Webhook,在 Mutating 和 Validating 两个阶段介入,形成“请求 → 变更 → 校验 → 存储”的完整链路。
关键路径: 用户执行
kubectl apply -f pod.yaml → API Server 认证/授权 → MutatingWebhookConfiguration 匹配 → Kyverno 执行 mutate 策略 → 返回补丁 → API Server 合并请求 → ValidatingWebhookConfiguration 匹配 → Kyverno 执行 validate 策略 → 返回允许/拒绝 → 最终写入 etcd。
2.2 Webhook 与缓存的关系:为什么缓存命中如此重要
Kyverno 在启动时从 ConfigMap 或 CRD 加载所有策略,并在内存中构建策略缓存。当 Webhook 请求到达时,Kyverno 优先查询本地缓存,而不是每次都从 etcd 重新读取策略。缓存命中率直接影响请求延迟和 API Server 压力。
| 组件 | 缓存内容 | 更新机制 | 缓存失效影响 |
|---|---|---|---|
| 策略缓存 | ClusterPolicy / Policy 对象 | Informer Watch 事件驱动 | 策略变更延迟生效,可能误判 |
| Webhook 配置缓存 | MutatingWebhookConfiguration / ValidatingWebhookConfiguration | 启动时加载 + 定时同步 | Webhook 注册丢失,请求绕过 Kyverno |
| 资源缓存 | 已处理的 AdmissionReview 请求摘要 | LRU 淘汰 + TTL 过期 | 重复请求导致重复策略计算 |
| Kubernetes 资源索引 | Namespace、Pod、Service 等关联资源 | Informer 同步 | 策略中引用资源查找失败 |
巡检要点: 缓存命中率低于 95% 时,应检查 Kyverno 的
--cacheResyncPeriod 参数(默认 15 分钟)是否过长,以及 Informer 是否因 RBAC 权限不足而无法同步资源。
2.3 策略引擎核心组件:从策略定义到执行
Kyverno 的策略引擎由四个核心模块组成,它们协同完成策略的解析、匹配、执行和报告。
2.4 核心组件职责与交互
| 组件 | 职责 | 与缓存的关系 | 故障排查关注点 |
|---|---|---|---|
| 规则引擎 | 解析策略的 match 和 exclude 条件,判断当前请求是否命中策略 |
依赖策略缓存获取最新规则;资源索引缓存用于匹配 Namespace 标签等 | 缓存未更新导致策略匹配失效;match 条件过于宽泛导致性能下降 |
| 变更引擎 | 执行 mutate 策略,生成 JSON Patch 补丁 |
依赖策略缓存;补丁模板中引用的 ConfigMap/Secret 来自资源缓存 | 缓存中 ConfigMap 过期导致补丁内容错误;补丁过大导致 API Server 拒绝 |
| 校验引擎 | 执行 validate 策略,返回 allow/deny 决策 |
依赖策略缓存;deny 条件中的变量来自资源缓存 |
缓存不一致导致误判(允许本应拒绝的资源);变量解析失败导致策略跳过 |
| 生成引擎 | 执行 generate 策略,在资源创建时自动生成关联资源(如 NetworkPolicy) |
依赖策略缓存;生成模板中的变量来自资源缓存 | 缓存未同步导致生成延迟或重复生成;生成资源与已有资源冲突 |
| 策略缓存层 | 维护所有策略对象、Webhook 配置、资源索引的内存缓存 | 通过 Informer Watch 与 etcd 保持最终一致 | Informer 断开导致缓存停滞;内存压力导致 LRU 淘汰频繁 |
| 报告与审计层 | 生成 PolicyReport 和 ClusterPolicyReport,记录策略执行结果 | 从缓存读取策略名称和匹配结果;写入报告时直接调用 API Server | 报告写入失败导致审计缺失;报告数量过多导致 etcd 存储压力 |
2.5 缓存命中巡检的关键指标
在后续章节的故障排查实践中,你将频繁使用以下指标定位缓存问题。建议在 Prometheus 中配置告警规则。
- kyverno_admission_requests_total:总请求数,按策略和操作类型(mutate/validate)区分。
- kyverno_admission_latency_seconds:请求处理延迟,缓存命中时通常 < 10ms,缓存未命中时可能 > 100ms。
- kyverno_cache_hit_ratio:策略缓存命中率,低于 0.95 应触发告警。
- kyverno_informer_sync_failures_total:Informer 同步失败次数,持续增长表示缓存可能停滞。
- kyverno_policy_execution_duration_seconds:策略执行耗时,缓存未命中时该指标会显著升高。
常见陷阱: 当 Kyverno 重启或 Leader 选举切换时,缓存会完全清空并重新构建。在此期间(通常 30-60 秒),所有 Webhook 请求都会直接查询 etcd,导致延迟飙升。生产环境应配置至少 2 个 Kyverno 副本,并启用
--replicas=2 参数减少重启影响。