2. Kyverno 架构解析:核心组件与策略执行流程

Kyverno 作为云原生策略引擎,其架构围绕 Kubernetes 动态准入控制机制设计。理解其核心组件与策略执行流程,是诊断冷启动瓶颈的前提。本章将拆解 Kyverno 的三个核心组件——Webhook、Controller 和 Cache,并梳理一条请求从触发到策略生效的完整路径。

2.1 核心组件总览

Kyverno 采用微服务架构,主要包含以下三个关键组件,它们协同工作以实现策略的加载、匹配与执行。

组件 职责 关键特性
Webhook 拦截 Kubernetes API Server 的资源请求(CREATE/UPDATE/DELETE) MutatingWebhookConfiguration 与 ValidatingWebhookConfiguration;是策略执行的入口
Controller 管理策略生命周期、处理策略变更、协调资源状态 包含策略控制器、报告控制器、后台扫描控制器等
Cache 缓存策略定义、资源上下文、集群状态,减少对 API Server 的直接查询 基于 Informer 的本地缓存;冷启动时缓存未命中是主要瓶颈之一
架构要点: Webhook 是同步阻塞的,直接影响 API 响应延迟;Controller 是异步的,负责后台任务;Cache 是性能的关键,冷启动时缓存为空,会导致 Webhook 回退到 API Server 查询,显著增加延迟。

2.2 组件交互架构图

下图展示了 Kyverno 核心组件之间的交互关系,以及它们如何与 Kubernetes API Server 协同工作。

Kyverno 核心组件交互架构 Kyverno 核心组件交互架构 Kubernetes API Server Webhook Mutating / Validating Controller 策略 / 报告 / 后台扫描 Cache Informer 本地缓存 资源请求(CREATE/UPDATE/DELETE) 查询策略与上下文 缓存未命中时回退查询 策略变更 / 状态同步 更新缓存 冷启动关键路径: 1. Webhook 拦截请求 → 2. 查询 Cache(未命中) → 3. 回退查询 API Server → 4. 策略评估 → 5. 返回结果 缓存未命中是冷启动延迟的主要来源,Controller 的异步预热速度直接影响后续请求性能。

2.3 Webhook 组件详解

Webhook 是 Kyverno 与 Kubernetes API Server 交互的桥梁。它通过注册 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration 来拦截资源请求。

  • Mutating Webhook:在资源持久化之前执行,用于修改资源(如注入 Sidecar、添加标签)。
  • Validating Webhook:在资源持久化之后执行,用于验证资源是否符合策略(如检查镜像来源、禁止特权容器)。
  • 故障模式:Webhook 的 failurePolicy 可设置为 Fail 或 Ignore。冷启动时,如果 Webhook 响应超时,API Server 会根据此策略决定是否允许请求通过。
冷启动风险: 当 Kyverno Pod 刚启动时,Webhook 可能尚未就绪。如果 failurePolicy 设置为 Fail,API Server 会拒绝所有匹配的资源请求,导致集群服务中断。建议在冷启动阶段使用 Ignore 策略,或配置 webhookTimeoutSeconds 为合理值(默认 30 秒)。

2.4 Controller 组件详解

Controller 是 Kyverno 的大脑,负责策略的生命周期管理。它包含多个子控制器,每个控制器专注于不同的任务。

子控制器 职责 冷启动影响
策略控制器 监听策略资源(ClusterPolicy/Policy)的创建、更新、删除 冷启动时需加载所有策略到 Cache,策略数量越多,预热时间越长
报告控制器 生成策略执行报告(PolicyReport / ClusterPolicyReport) 冷启动时可能触发大量报告生成,增加 API Server 负载
后台扫描控制器 定期扫描现有资源,检查是否符合策略 冷启动后立即启动扫描,可能造成资源竞争
Webhook 控制器 管理 Webhook 配置的注册与更新 冷启动时需重新注册 Webhook,期间请求可能被忽略或拒绝

2.5 Cache 组件详解

Cache 是 Kyverno 性能的核心。它基于 Kubernetes Informer 机制,维护策略定义、资源上下文和集群状态的本地副本。

  • 缓存内容:策略定义(Policy/ClusterPolicy)、资源上下文(Namespace、Pod、Deployment 等)、集群状态(节点、CRD 等)。
  • 缓存更新:Informer 通过 Watch API 监听资源变化,增量更新缓存。
  • 冷启动问题:Pod 重启后,缓存为空。Webhook 处理请求时,如果缓存中缺少策略或上下文,必须回退到 API Server 查询,导致延迟从微秒级飙升到毫秒级甚至秒级。
性能指标: 在缓存命中时,Kyverno 策略评估延迟通常在 1-5ms 以内;缓存未命中时,延迟可能达到 50-200ms,甚至更高(取决于 API Server 负载和网络延迟)。冷启动期间,缓存命中率从 0% 逐步上升,直到所有策略和上下文加载完毕。

2.6 策略执行流程

一条资源请求从触发到策略生效,经历以下完整流程。理解此流程有助于定位冷启动瓶颈。

  1. 请求触发:用户或控制器向 API Server 发送资源请求(如 kubectl apply -f pod.yaml)。
  2. Webhook 拦截:API Server 根据注册的 Webhook 配置,将请求转发给 Kyverno Webhook 服务。
  3. 策略匹配:Webhook 从 Cache 中查询匹配的策略。如果缓存未命中,回退到 API Server 查询。
  4. 上下文准备:Webhook 从 Cache 中获取资源上下文(如 Namespace 标签、集群配置)。如果缓存未命中,回退到 API Server 查询。
  5. 策略评估:Kyverno 引擎执行策略规则(如验证、突变、生成)。
  6. 结果返回:Webhook 将评估结果(允许/拒绝/突变)返回给 API Server。
  7. 资源持久化:API Server 根据 Webhook 结果决定是否持久化资源。

2.7 策略执行流程图

下图展示了策略执行的完整流程,并标注了冷启动期间可能出现的瓶颈点。

Kyverno 策略执行流程与冷启动瓶颈 Kyverno 策略执行流程与冷启动瓶颈 1. 请求触发 2. Webhook 拦截 3. 策略匹配 ⚠ 瓶颈:缓存未命中 回退查询 API Server,延迟增加 10-50x 4. 上下文准备 ⚠ 瓶颈:上下文缺失 Namespace 标签、集群配置未缓存 5. 策略评估 6. 结果返回 7. 资源持久化

2.8 冷启动瓶颈总结

基于上述架构分析,冷启动阶段的主要瓶颈集中在以下三个环节:

瓶颈环节 根因 影响 初步缓解思路
Webhook 就绪延迟 Pod 启动后需要时间注册 Webhook 配置 请求被拒绝或忽略,服务中断 配置 failurePolicy: Ignore;使用 livenessProbe 加速就绪
Cache 预热不足 Informer 需要时间从 API Server 同步数据 策略评估延迟飙升,API Server 负载增加 预加载策略;调整 resyncPeriod;使用持久化缓存
后台扫描风暴 冷启动后立即触发全量资源扫描 API Server 和 Kyverno 资源消耗激增 延迟扫描启动;分批扫描;限制并发