3. Kyverno 架构解析:组件、请求处理流程与策略执行生命周期

Kyverno 是一个为 Kubernetes 设计的策略引擎,其架构围绕 Kubernetes 原生扩展机制构建。理解其核心组件、请求处理流程以及策略执行的生命周期,是编写可靠策略和进行有效调试的基础。本章将深入解析这三个关键维度。

3.1 核心组件:Webhook、Controller 与 Cache

Kyverno 由多个协同工作的组件构成,其中最重要的三个是 Webhook、Controller 和 Cache。它们各自承担不同的职责,共同保障策略的实时生效与集群的稳定。

组件 核心职责 关键行为
Webhook 拦截 API 请求 注册为 Kubernetes 的 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration,在资源创建、更新、删除时被 API Server 调用。
Controller 策略管理与后台处理 监听 ClusterPolicy/Policy 资源变化,管理策略的注册、更新、删除;处理后台扫描(Background Scan)和报告生成。
Cache 策略与状态缓存 在内存中维护策略规则、资源状态和 Webhook 配置的快照,减少对 API Server 的直接查询,提升响应速度。
关键点:Webhook 是策略执行的“前哨”,负责实时拦截;Controller 是“大脑”,负责策略生命周期管理;Cache 是“加速器”,确保决策效率。

3.2 请求处理流程:从拦截到决策

当一个 Kubernetes API 请求(例如创建 Pod)到达 API Server 时,Kyverno 的 Webhook 组件会介入。整个处理流程可以概括为以下步骤:

  1. 请求拦截:API Server 根据 Webhook 配置,将请求发送给 Kyverno 的 Webhook 服务。
  2. 策略匹配:Webhook 从 Cache 中获取所有匹配该资源类型和操作的策略规则。
  3. 规则引擎执行:对匹配的策略规则进行逐一评估,包括 match/exclude 条件检查、validate/mutate/generate 规则执行。
  4. 决策与响应:
    • 变更(Mutate):生成 JSON Patch 返回给 API Server,在资源持久化前修改。
    • 验证(Validate):返回允许或拒绝响应。拒绝时附带错误信息。
    • 生成(Generate):Controller 异步创建关联资源。
  5. 审计与报告:处理结果被记录为 PolicyReport 或 ClusterPolicyReport 资源。
调试提示:当策略未生效时,首先检查 Webhook 配置是否被正确创建,以及 Kyverno Pod 的日志中是否有请求被拦截的记录。
Kyverno 请求处理流程 API Server Webhook 规则引擎 Cache 决策响应 流程:API Server 拦截请求 → Webhook 接收 → 规则引擎查询 Cache 并执行策略 → 返回决策 变更策略在资源持久化前修改请求;验证策略直接允许或拒绝;生成策略由 Controller 异步处理

3.3 策略执行生命周期

一个策略从定义到最终影响集群资源,经历了一个完整的生命周期。理解这个生命周期有助于定位策略未按预期执行的原因。

阶段 描述 关键事件
1. 策略创建 用户通过 kubectl apply 创建 ClusterPolicy 或 Policy 资源。 Controller 监听到资源创建事件。
2. 策略注册 Controller 解析策略规则,动态更新 Webhook 配置(MutatingWebhookConfiguration / ValidatingWebhookConfiguration)。 Webhook 配置被更新,API Server 开始将匹配的请求转发给 Kyverno。
3. 规则缓存 策略规则被解析并加载到 Cache 中,供 Webhook 实时查询。 Cache 更新完成,Webhook 可以基于最新规则进行决策。
4. 实时执行 Webhook 拦截匹配的 API 请求,执行规则引擎,返回决策。 资源被变更、验证通过/拒绝、或触发生成操作。
5. 后台扫描 Controller 定期对集群中已有的资源执行策略检查,生成审计报告。 生成 PolicyReport,标记不合规的现有资源。
6. 策略更新/删除 用户更新或删除策略资源。 Controller 更新或移除 Webhook 配置,清理 Cache 中的相关规则。
常见陷阱:策略更新后,Webhook 配置的更新存在短暂延迟(通常几秒)。在此期间,新创建的资源可能仍按旧策略执行。这是调试时需要考虑的“最终一致性”问题。
策略执行生命周期 1. 策略创建 2. 策略注册 3. 规则缓存 4. 实时执行 5. 后台扫描 6. 更新/删除 生命周期关键点: 策略创建后需等待 Webhook 配置更新(阶段2)才能生效;后台扫描(阶段5)用于审计存量资源; 策略更新/删除(阶段6)会触发 Webhook 配置的重新注册,形成闭环。

3.4 组件协作与调试切入点

在实际调试中,了解组件间的协作关系至关重要。以下是几个关键的调试切入点:

  • Webhook 未触发:检查 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration 是否存在且 failurePolicy 设置正确。查看 Kyverno 的 webhook 容器日志。
  • 策略规则未生效:检查 Controller 日志,确认策略是否被成功解析和注册。使用 kubectl describe clusterpolicy 查看策略状态。
  • 决策延迟或错误:检查 Cache 是否与 API Server 同步。可以通过重启 Kyverno Pod 来强制刷新缓存。
  • 后台扫描结果不符:检查 PolicyReport 资源,确认扫描范围和时间戳。后台扫描默认每 1 小时执行一次。
最佳实践:在开发策略时,使用 --audit 模式(通过设置 validationFailureAction: audit)先观察策略效果,确认无误后再切换到 enforce 模式,避免误拒绝生产资源。