4. 策略引擎核心概念:Policy、Rule、Match、Exclude、Mutate、Validate、Generate
Kyverno 策略引擎围绕一组精确定义的核心概念构建。理解 Policy、Rule、Match、Exclude、Mutate、Validate 和 Generate 之间的关系,是编写高效、可维护策略的基础。本节将逐一拆解这些概念,并展示它们如何在引擎中协同工作。
4.1 策略(Policy)与规则(Rule)
Policy 是 Kyverno 中的顶级资源对象,它包含一个或多个 Rule。Policy 定义了策略的生效范围(集群级别或命名空间级别),而 Rule 则定义了具体的匹配条件和执行动作。
| 概念 | 作用域 | 核心职责 | 示例 |
|---|---|---|---|
| Policy | 集群 / 命名空间 | 策略的容器,定义生效范围、后台扫描模式、失败行为 | ClusterPolicy 或 Policy |
| Rule | Policy 内部 | 定义匹配条件(Match/Exclude)和执行动作(Mutate/Validate/Generate) | 一条规则:匹配所有 Pod,验证是否包含 runAsNonRoot: true |
关键区别: Policy 是“策略文件”,Rule 是“策略逻辑单元”。一个 Policy 可以包含多条 Rule,引擎会按顺序评估每条 Rule。
4.2 匹配(Match)与排除(Exclude)
Match 和 Exclude 是 Rule 的“过滤器”。它们决定了当前 Rule 应该应用于哪些 Kubernetes 资源。两者都支持基于资源类型、标签选择器、命名空间、名称、用户信息等条件进行筛选。
- Match:定义规则应该应用的资源集合。只有匹配的资源才会进入后续的 Mutate/Validate/Generate 处理流程。
- Exclude:定义规则不应该应用的资源集合。Exclude 的优先级高于 Match,即如果一个资源同时匹配了 Match 和 Exclude,该资源会被排除。
最佳实践: 使用 Exclude 来豁免特定的命名空间(如
kube-system)或特定的标签(如 app: istio-init),避免策略误伤基础设施组件。
4.3 三大动作:Mutate、Validate、Generate
这是 Kyverno 策略引擎的核心执行能力。每条 Rule 必须且只能选择其中一个动作。
| 动作 | 触发时机 | 行为描述 | 典型场景 |
|---|---|---|---|
| Mutate | Admission 请求时 | 在资源持久化到 etcd 之前,修改资源的配置。可以覆盖、补丁或删除字段。 | 自动注入 Sidecar 容器、添加安全上下文、设置资源限制 |
| Validate | Admission 请求时 / 后台扫描 | 检查资源是否符合预期规范。如果不符合,可以拒绝请求(enforce)或生成告警(audit)。 | 强制要求所有镜像来自私有仓库、禁止特权容器、检查标签合规性 |
| Generate | Admission 请求时 / 后台扫描 | 根据源资源或模板,创建新的 Kubernetes 资源。生成的资源与源资源保持同步。 | 为每个 Namespace 自动创建 NetworkPolicy、为每个 Deployment 生成对应的 ServiceAccount |
注意: Generate 动作在创建资源时,会触发新的 Admission 请求,这可能导致递归生成。Kyverno 通过
generate.kyverno.io/generated-by 标签来防止无限循环。
4.4 核心概念关系图
下图展示了 Policy、Rule、Match/Exclude 以及三大动作之间的完整数据流关系:
4.5 动作执行顺序与引擎流程
当一个 Admission 请求到达 Kyverno 时,引擎会按照以下顺序处理所有匹配的 Rule:
- Match 检查: 遍历所有 Policy 中的所有 Rule,检查请求资源是否匹配 Rule 的 Match 条件。
- Exclude 检查: 对匹配的 Rule,进一步检查 Exclude 条件。如果命中 Exclude,则跳过该 Rule。
- Mutate 执行: 所有匹配的 Mutate Rule 按顺序执行,对资源进行修改。修改后的资源会传递给后续的 Validate 和 Generate 步骤。
- Validate 执行: 所有匹配的 Validate Rule 按顺序执行。如果任何一条 Validate Rule 失败(enforce 模式),整个请求将被拒绝。
- Generate 执行: 所有匹配的 Generate Rule 按顺序执行,创建或更新关联资源。
重要顺序: Mutate 总是在 Validate 之前执行。这意味着 Validate 规则检查的是经过 Mutate 修改后的资源状态,而不是用户原始提交的配置。这一特性常用于“先注入安全配置,再验证合规性”的场景。
4.6 完整策略示例:安全基线组合
以下是一个结合了 Mutate 和 Validate 的完整策略示例,展示了核心概念如何协同工作:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: pod-security-baseline
spec:
validationFailureAction: Enforce
rules:
# Rule 1: Mutate - 自动添加只读根文件系统
- name: auto-readonly-rootfs
match:
resources:
kinds:
- Pod
mutate:
patchStrategicMerge:
spec:
containers:
- (name): "*"
securityContext:
readOnlyRootFilesystem: true
# Rule 2: Validate - 禁止特权容器
- name: disallow-privileged
match:
resources:
kinds:
- Pod
exclude:
resources:
namespaces:
- kube-system
validate:
message: "特权容器是不允许的。"
pattern:
spec:
containers:
- securityContext:
privileged: false
策略解读: 该策略包含两条 Rule。第一条 Rule 使用 Mutate 自动为所有 Pod 容器添加
readOnlyRootFilesystem: true。第二条 Rule 使用 Validate 检查所有 Pod(排除 kube-system 命名空间)是否包含 privileged: false。由于 Mutate 先执行,用户提交的 Pod 即使没有设置 readOnlyRootFilesystem,也会被自动补全,然后 Validate 规则再检查特权设置。