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 的冲突都发生在资源创建/更新的准入阶段,而非运行时。
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只能匹配其所在命名空间。
2.4 策略匹配优先级与冲突处理
当多个策略同时匹配同一资源时,Kyverno 按以下顺序处理:
- 背景检查(Background):先执行所有 Validate 策略的 background 扫描。
- Mutate 策略:按策略名称字典序依次执行,后执行的 Mutate 可能覆盖先执行的修改。
- Validate 策略:在 Mutate 完成后执行,校验最终资源状态。
- Generate 策略:异步执行,不参与准入阶段的顺序。
注意: 如果多个 Mutate 策略修改同一字段,后执行的策略会覆盖前一个。这在与 Helm 配合时尤其危险——Helm 可能期望某个字段保持模板中的值,但 Kyverno 的 Mutate 策略在 Helm 之后执行,导致 Helm 下次升级时检测到 drift。