Kyverno 策略引擎基础:架构、策略定义语言与执行流程

Kyverno 是专为 Kubernetes 设计的云原生策略引擎,以 动态准入控制(Dynamic Admission Control) 为核心机制,在资源创建、更新或删除时拦截请求并执行策略校验。本章从架构组件、策略定义语言(PDL)以及匹配与执行流程三个维度展开,为后续 eBPF 配额校准的通信机制奠定策略层基础。

2.1 Kyverno 架构组件

Kyverno 以 Kubernetes 原生方式部署,由以下核心组件构成,各组件通过标准 Kubernetes API 和 Webhook 机制协作。

组件 角色 关键说明
Kyverno Admission Controller 策略执行引擎 注册 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration,拦截资源请求
Kyverno Policy Controller 策略生命周期管理 监听 ClusterPolicy / Policy 资源变化,实时更新策略规则缓存
Kyverno Report Controller 策略审计与报告 生成 PolicyReport / ClusterPolicyReport,记录策略评估结果
Kyverno Background Controller 后台扫描与清理 对已有资源执行策略扫描,清理过期报告
Kyverno CLI 离线测试工具 支持 YAML 文件级别的策略预验证,无需真实集群
架构要点: Kyverno 不引入自定义 API 服务器,所有策略评估通过标准 AdmissionReview 请求完成,与 Kubernetes 原生准入链完全兼容。
Kyverno 架构组件与通信关系 Kyverno 架构组件与通信关系 Kubernetes API Server Kyverno Admission Controller Policy Controller Report Controller Background Controller 所有组件通过 Kubernetes API 通信,Admission Controller 是策略执行的唯一入口

2.2 策略定义语言(PDL)

Kyverno 策略定义语言(PDL)基于 YAML 声明式语法,核心结构包含 match、exclude、preconditions 和 validate/mutate/generate 规则块。PDL 支持两种策略作用域:

  • ClusterPolicy:集群级别,可匹配所有命名空间中的资源。
  • Policy:命名空间级别,仅作用于指定命名空间。

2.2.1 策略规则结构

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-pod-resource-limits
spec:
  validationFailureAction: Enforce   # Enforce | Audit
  rules:
    - name: check-container-resources
      match:
        any:
          - resources:
              kinds:
                - Pod
      validate:
        message: "容器必须设置 resource limits"
        pattern:
          spec:
            containers:
              - resources:
                  limits:
                    memory: "?*"     # 必须存在且非空
                    cpu: "?*"
PDL 设计原则: 策略规则采用“匹配-排除-前置条件-执行”四段式结构,any 和 all 条件块支持复杂的资源选择逻辑,避免策略规则膨胀。

2.2.2 策略动作类型对比

动作类型 作用时机 典型场景 示例
validate 资源创建/更新时 强制安全基线、合规检查 检查容器是否以非 root 用户运行
mutate 资源创建/更新时(先于 validate) 自动注入 Sidecar、添加标签 为所有 Pod 注入 Istio Sidecar
generate 资源创建后 自动创建关联资源 为每个 Namespace 创建 NetworkPolicy
verifyImages 镜像拉取时 镜像签名验证 验证镜像是否由可信仓库签名

2.3 策略匹配与执行流程

Kyverno 的策略匹配与执行遵循严格的时序和优先级规则,确保在 Kubernetes 准入链中正确生效。完整流程分为以下阶段:

  1. Webhook 注册与请求拦截:Kyverno Admission Controller 在启动时向 API Server 注册 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration。当资源请求到达 API Server 时,根据 webhook 规则匹配后转发 AdmissionReview 请求。
  2. 策略规则匹配:Admission Controller 根据请求资源的 kind、apiVersion、namespace、labels 等字段,与所有已加载的 ClusterPolicy/Policy 中的 match 块进行匹配。匹配顺序为:先匹配 any 条件,再匹配 all 条件。
  3. 排除与前置条件检查:通过匹配的资源进一步检查 exclude 块(排除特定资源)和 preconditions 块(基于上下文变量的条件判断)。只有全部通过才进入执行阶段。
  4. 策略动作执行:按 mutate → validate → generate 的顺序执行。Mutate 规则先修改资源,Validate 规则校验修改后的资源,Generate 规则在资源创建完成后异步触发。
  5. 响应返回与审计:Admission Controller 将评估结果(允许/拒绝/补丁)封装为 AdmissionReview 响应返回 API Server。同时,Report Controller 异步生成 PolicyReport 记录。
Kyverno 策略匹配与执行流程 Kyverno 策略匹配与执行流程 1. Webhook 注册与请求拦截 2. 策略规则匹配(match any/all) 3. 排除与前置条件检查 4. 策略动作执行 Mutate → Validate → Generate(顺序执行) 5. 响应返回与审计报告 Mutate 规则在 Validate 之前执行,确保校验的是修改后的资源 Generate 规则异步执行,不阻塞准入响应

2.4 策略执行上下文与变量

Kyverno PDL 支持丰富的上下文变量,用于在策略规则中引用请求信息、集群状态或外部数据。常用变量分类如下:

变量类别 前缀 示例 说明
请求对象 request.object {{ request.object.metadata.name }} 当前被评估资源的完整对象
旧对象 request.oldObject {{ request.oldObject.spec.replicas }} 更新操作前的资源状态(仅 Update 请求)
集群信息 cluster {{ cluster.name }} 集群名称、版本等元数据
外部数据 configMap {{ configMap "namespace" "name" .data.key }} 从 ConfigMap 中动态读取数据
JMESPath 表达式 内置函数 {{ request.object.spec.containers[].name }} 支持数组遍历、条件过滤等复杂查询
变量使用注意事项: 在 preconditions 块中使用变量时,必须确保变量在请求上下文中存在,否则策略评估会失败。建议对可能缺失的字段使用 contains 或 has 函数进行前置检查。

2.5 策略冲突与优先级

当多个策略规则作用于同一资源时,Kyverno 遵循以下优先级和冲突解决机制:

  • Mutate 规则顺序:按策略创建时间升序执行,后创建的策略补丁叠加在先创建的补丁之上。可通过 spec.rules[].mutate.patches.jsonPatch 的 op: replace 覆盖已有字段。
  • Validate 规则冲突:只要任一 Validate 规则拒绝请求,整个准入请求即被拒绝。不存在“覆盖”或“优先级”概念。
  • Generate 规则去重:Generate 规则在创建资源前会检查目标资源是否已存在,避免重复创建。
  • 策略作用域优先级:命名空间级别的 Policy 优先于集群级别的 ClusterPolicy 匹配同一资源。当两者冲突时,Policy 生效。
与 eBPF 配额校准的关联: 在后续章节中,我们将利用 Kyverno 的 Mutate 规则自动注入 eBPF 配额校准 Sidecar,并通过 Validate 规则校验配额参数是否在安全范围内。策略执行上下文中的 request.object 变量将用于提取 Pod 的 resource limits 信息,作为 eBPF 程序配置的输入。