2. Kyverno 基础回顾:策略引擎架构、策略类型与匹配规则

在深入排查 Kyverno 与 Helm 的冲突之前,必须牢固掌握 Kyverno 自身的核心机制。本章将系统梳理 Kyverno 的策略引擎架构、三种策略类型(Mutate / Validate / Generate)以及策略匹配规则,为后续的故障域隔离分析打下基础。

2.1 策略引擎架构

Kyverno 以 Kubernetes 动态准入控制器(Dynamic Admission Controller)的形式运行,通过 Webhook 拦截资源请求,并基于用户定义的策略执行校验、变更或生成操作。其核心组件包括:

  • Webhook 控制器:注册 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration,拦截对应资源的 CREATE、UPDATE、DELETE 请求。
  • 策略控制器:监听 ClusterPolicy / Policy 资源,将策略规则编译为可执行的匹配与处理链。
  • 报告控制器:生成 PolicyReport / ClusterPolicyReport,记录策略执行结果,支持审计模式。
  • 后台控制器:处理 Generate 类型的策略,在后台创建或同步生成的目标资源。
关键理解: Kyverno 不修改 Kubernetes 核心代码,而是以标准 Webhook 方式嵌入 API 请求路径。这意味着任何与 Helm 的冲突都发生在资源创建/更新的准入阶段,而非运行时。
Kyverno 策略引擎架构 kubectl / Helm / API Kubernetes API Server Mutating / Validating Webhook Kyverno 策略引擎 策略匹配 → 规则执行(Mutate / Validate / Generate) etcd(资源存储)

2.2 策略类型:Mutate / Validate / Generate

Kyverno 的策略规则(rule)通过 match 字段选择目标资源,然后根据 mutate、validate 或 generate 字段执行对应操作。三种类型在故障域隔离场景中的角色截然不同:

策略类型 执行时机 核心行为 与 Helm 冲突典型场景
Mutate 资源持久化之前(MutatingWebhook) 修改资源字段(如注入标签、Sidecar、调整资源限制) Helm 模板中未定义的字段被 Kyverno 注入,导致 Helm 下次升级时 diff 异常或回滚失败
Validate 资源持久化之前(ValidatingWebhook) 校验资源字段是否符合规则(如强制标签、禁止特权容器) Helm 安装/升级时资源被 Kyverno 拒绝,导致 Release 失败或部分资源残留
Generate 资源创建后(后台异步) 根据源资源自动生成额外资源(如 Namespace 自动生成 NetworkPolicy) Helm 管理的资源被 Kyverno 额外生成资源覆盖或冲突,导致 Helm 无法正确管理生成物
故障域隔离视角: Mutate 和 Validate 在准入阶段同步执行,直接影响 Helm 操作的成功与否;Generate 在后台异步执行,其冲突往往在 Helm 后续操作(如升级、删除)时才暴露。

2.3 策略匹配规则

策略规则通过 match 和 exclude 字段定义资源选择逻辑。匹配规则支持多种资源描述方式,理解这些规则是定位策略冲突的前提。

2.3.1 匹配字段结构

spec:
  rules:
  - name: require-labels
    match:
      any:
      - resources:
          kinds:
          - Deployment
          - StatefulSet
          namespaces:
          - production
          - staging
          selector:
            matchLabels:
              app: frontend
    exclude:
      any:
      - resources:
          namespaces:
          - kube-system
    validate:
      message: "必须包含 'owner' 标签"
      pattern:
        metadata:
          labels:
            owner: "?*"

2.3.2 匹配逻辑详解

  • match.any / match.all:any 表示满足任一条件即匹配;all 表示必须满足所有条件才匹配。默认使用 any。
  • exclude.any / exclude.all:排除逻辑与 match 类似,优先级高于 match。如果资源同时匹配 match 和 exclude,则排除生效。
  • 资源描述方式:支持 kinds(资源类型)、namespaces(命名空间)、selector(标签选择器)、names(资源名称)、annotations(注解)等。
  • 集群范围 vs 命名空间范围:ClusterPolicy 可以匹配所有命名空间;Policy 只能匹配其所在命名空间。
策略匹配规则执行流程 资源准入请求 match.any / match.all 检查 匹配成功 → 进入排除检查 匹配失败 → 跳过策略 exclude.any / exclude.all 检查 排除匹配 → 跳过策略 未排除 → 执行策略规则

2.4 策略匹配优先级与冲突处理

当多个策略同时匹配同一资源时,Kyverno 按以下顺序处理:

  1. 背景检查(Background):先执行所有 Validate 策略的 background 扫描。
  2. Mutate 策略:按策略名称字典序依次执行,后执行的 Mutate 可能覆盖先执行的修改。
  3. Validate 策略:在 Mutate 完成后执行,校验最终资源状态。
  4. Generate 策略:异步执行,不参与准入阶段的顺序。
注意: 如果多个 Mutate 策略修改同一字段,后执行的策略会覆盖前一个。这在与 Helm 配合时尤其危险——Helm 可能期望某个字段保持模板中的值,但 Kyverno 的 Mutate 策略在 Helm 之后执行,导致 Helm 下次升级时检测到 drift。

2.5 本章小结