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):定义策略执行的顺序与逻辑管道。
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 处理准入请求的 执行顺序与逻辑管道。典型的链式处理包括:
- 请求预处理:解析 AdmissionReview 请求,提取资源对象、用户信息、操作类型。
- 策略匹配:从缓存中查询适用于当前资源的所有策略。
- 规则执行:按策略优先级(background.background 或 spec.rules 顺序)依次执行。
- 变量解析:替换策略中的变量(如
{{ request.object.metadata.name }})。 - 结果聚合:汇总所有策略的执行结果,生成允许/变异/拒绝响应。
3.6 组件协作与冷启动瓶颈
在冷启动场景下,各组件之间的协作顺序决定了策略加载的总体耗时:
| 阶段 | 涉及组件 | 耗时因素 | 优化方向 |
|---|---|---|---|
| 策略发现 | 策略控制器 | API Server 响应、Informer 初始同步 | 减少策略数量、使用标签选择器 |
| 策略编译 | 策略控制器 | 规则复杂度、变量数量、JMESPath 表达式 | 简化规则、预编译、缓存复用 |
| 缓存填充 | 策略缓存 | 索引构建、内存分配 | 分片加载、懒加载非关键策略 |
| Webhook 就绪 | Webhook 服务器 | TLS 证书加载、监听端口绑定 | 延迟注册、启动探针 |