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 组件会介入。整个处理流程可以概括为以下步骤:
- 请求拦截:API Server 根据 Webhook 配置,将请求发送给 Kyverno 的 Webhook 服务。
- 策略匹配:Webhook 从 Cache 中获取所有匹配该资源类型和操作的策略规则。
- 规则引擎执行:对匹配的策略规则进行逐一评估,包括
match/exclude条件检查、validate/mutate/generate规则执行。 - 决策与响应:
- 变更(Mutate):生成 JSON Patch 返回给 API Server,在资源持久化前修改。
- 验证(Validate):返回允许或拒绝响应。拒绝时附带错误信息。
- 生成(Generate):Controller 异步创建关联资源。
- 审计与报告:处理结果被记录为 PolicyReport 或 ClusterPolicyReport 资源。
调试提示:当策略未生效时,首先检查 Webhook 配置是否被正确创建,以及 Kyverno Pod 的日志中是否有请求被拦截的记录。
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 配置的更新存在短暂延迟(通常几秒)。在此期间,新创建的资源可能仍按旧策略执行。这是调试时需要考虑的“最终一致性”问题。
3.4 组件协作与调试切入点
在实际调试中,了解组件间的协作关系至关重要。以下是几个关键的调试切入点:
- Webhook 未触发:检查
MutatingWebhookConfiguration和ValidatingWebhookConfiguration是否存在且failurePolicy设置正确。查看 Kyverno 的webhook容器日志。 - 策略规则未生效:检查 Controller 日志,确认策略是否被成功解析和注册。使用
kubectl describe clusterpolicy查看策略状态。 - 决策延迟或错误:检查 Cache 是否与 API Server 同步。可以通过重启 Kyverno Pod 来强制刷新缓存。
- 后台扫描结果不符:检查
PolicyReport资源,确认扫描范围和时间戳。后台扫描默认每 1 小时执行一次。
最佳实践:在开发策略时,使用
--audit 模式(通过设置 validationFailureAction: audit)先观察策略效果,确认无误后再切换到 enforce 模式,避免误拒绝生产资源。