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 协同工作。
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 策略执行流程
一条资源请求从触发到策略生效,经历以下完整流程。理解此流程有助于定位冷启动瓶颈。
- 请求触发:用户或控制器向 API Server 发送资源请求(如
kubectl apply -f pod.yaml)。 - Webhook 拦截:API Server 根据注册的 Webhook 配置,将请求转发给 Kyverno Webhook 服务。
- 策略匹配:Webhook 从 Cache 中查询匹配的策略。如果缓存未命中,回退到 API Server 查询。
- 上下文准备:Webhook 从 Cache 中获取资源上下文(如 Namespace 标签、集群配置)。如果缓存未命中,回退到 API Server 查询。
- 策略评估:Kyverno 引擎执行策略规则(如验证、突变、生成)。
- 结果返回:Webhook 将评估结果(允许/拒绝/突变)返回给 API Server。
- 资源持久化:API Server 根据 Webhook 结果决定是否持久化资源。
2.7 策略执行流程图
下图展示了策略执行的完整流程,并标注了冷启动期间可能出现的瓶颈点。
2.8 冷启动瓶颈总结
基于上述架构分析,冷启动阶段的主要瓶颈集中在以下三个环节:
| 瓶颈环节 | 根因 | 影响 | 初步缓解思路 |
|---|---|---|---|
| Webhook 就绪延迟 | Pod 启动后需要时间注册 Webhook 配置 | 请求被拒绝或忽略,服务中断 | 配置 failurePolicy: Ignore;使用 livenessProbe 加速就绪 |
| Cache 预热不足 | Informer 需要时间从 API Server 同步数据 | 策略评估延迟飙升,API Server 负载增加 | 预加载策略;调整 resyncPeriod;使用持久化缓存 |
| 后台扫描风暴 | 冷启动后立即触发全量资源扫描 | API Server 和 Kyverno 资源消耗激增 | 延迟扫描启动;分批扫描;限制并发 |