3. Kyverno 架构与核心组件:Webhook 模式、策略控制器、策略缓存、准入控制链

Kyverno 作为 Kubernetes 原生的策略引擎,其架构设计围绕 动态准入控制(Dynamic Admission Control) 展开。在冷启动场景下,理解其核心组件之间的协作关系,是定位策略加载瓶颈、优化启动性能的前提。本章深入剖析 Kyverno 的四大核心组件:Webhook 模式、策略控制器、策略缓存以及准入控制链。

3.1 核心架构总览

Kyverno 以 Operator 模式 运行在集群内,通过注册 Kubernetes MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration 来拦截资源请求。其核心组件包括:

  • Webhook 服务器:接收 API Server 的准入请求,执行策略匹配与处理。
  • 策略控制器(Policy Controller):监听策略资源(ClusterPolicy/Policy)的变化,负责策略的编译、验证与分发。
  • 策略缓存(Policy Cache):存储已编译的策略规则,加速准入决策。
  • 准入控制链(Admission Control Chain):定义策略执行的顺序与逻辑管道。
Kyverno 核心架构组件关系图 Kubernetes API Server Webhook 服务器 策略控制器 策略缓存 准入控制链 准入请求 查询策略 编译/更新 返回规则 执行结果 说明: 冷启动时,策略控制器需完成所有策略的编译并填充缓存,Webhook 服务器才能高效响应准入请求。缓存未就绪将导致准入延迟或拒绝。

3.2 Webhook 模式:策略执行的入口

Kyverno 采用 Webhook 模式 与 Kubernetes API Server 交互。当 API Server 收到资源创建、更新或删除请求时,会根据配置的 Webhook 规则,将请求转发给 Kyverno 的 Webhook 服务器。

Webhook 类型 作用 Kyverno 对应组件
MutatingWebhook 拦截请求,允许修改资源(如注入 Sidecar、添加标签) Kyverno Webhook Server(Mutating 端点)
ValidatingWebhook 拦截请求,仅验证资源是否符合策略,拒绝不合规请求 Kyverno Webhook Server(Validating 端点)
冷启动关注点: Webhook 配置在 Kyverno 启动时即注册到集群。如果策略缓存尚未就绪,Webhook 服务器可能返回 "Service Unavailable" 或超时,导致资源创建失败。优化方向包括:延迟 Webhook 注册、使用启动探针确保缓存就绪。

3.3 策略控制器:策略生命周期的管理者

策略控制器是 Kyverno 的 控制面核心,负责:

  • 策略监听:通过 Informer 监听 ClusterPolicy 和 Policy 资源的变化。
  • 策略编译:将 YAML 定义的策略规则编译为内部可执行的匹配树。
  • 策略验证:检查策略语法、背景上下文(Context)引用是否有效。
  • 状态更新:将策略的 Ready 状态写回 API Server。

在冷启动时,策略控制器需要遍历所有已定义的策略,逐一完成编译。策略数量越多、规则越复杂(如包含大量变量、JMESPath 表达式),编译耗时越长。

3.4 策略缓存:加速准入决策的关键

策略缓存是一个 内存中的索引结构,用于存储已编译的策略规则。其设计目标是:

  • 快速匹配:根据资源类型(Kind)、操作(Create/Update/Delete)、标签等维度,快速定位适用的策略。
  • 减少重复编译:策略一旦编译,除非策略本身更新,否则直接从缓存读取。
  • 并发安全:支持多个 Webhook 请求同时读取缓存。
缓存维度 说明 冷启动影响
资源类型索引 按 Kind(如 Pod、Deployment)建立索引 需遍历所有策略,构建索引表
操作类型索引 按 CREATE / UPDATE / DELETE 建立索引 需解析每个策略的 match 规则
标签/注解索引 按 selector 表达式建立索引 编译复杂表达式耗时较长
冷启动风险: 如果策略缓存未完全填充,Webhook 服务器可能回退到实时编译模式,导致准入延迟从毫秒级飙升到秒级。在生产环境中,这可能导致 Pod 启动超时、Deployment 滚动更新失败。

3.5 准入控制链:策略执行的逻辑管道

准入控制链定义了 Kyverno 处理准入请求的 执行顺序与逻辑管道。典型的链式处理包括:

  1. 请求预处理:解析 AdmissionReview 请求,提取资源对象、用户信息、操作类型。
  2. 策略匹配:从缓存中查询适用于当前资源的所有策略。
  3. 规则执行:按策略优先级(background.background 或 spec.rules 顺序)依次执行。
  4. 变量解析:替换策略中的变量(如 {{ request.object.metadata.name }})。
  5. 结果聚合:汇总所有策略的执行结果,生成允许/变异/拒绝响应。
准入控制链处理流程 请求预处理 策略匹配 规则执行 变量解析 结果聚合 冷启动优化点: 策略匹配阶段依赖缓存,缓存未就绪时需回退到实时编译,导致整个链路过长。优化策略包括:预编译缓存、延迟加载非关键策略、并行编译。

3.6 组件协作与冷启动瓶颈

在冷启动场景下,各组件之间的协作顺序决定了策略加载的总体耗时:

阶段 涉及组件 耗时因素 优化方向
策略发现 策略控制器 API Server 响应、Informer 初始同步 减少策略数量、使用标签选择器
策略编译 策略控制器 规则复杂度、变量数量、JMESPath 表达式 简化规则、预编译、缓存复用
缓存填充 策略缓存 索引构建、内存分配 分片加载、懒加载非关键策略
Webhook 就绪 Webhook 服务器 TLS 证书加载、监听端口绑定 延迟注册、启动探针