2. Kyverno 基础概念:Policy、Rule、Match/Exclude、Mutate/Validate/Generate 三大动作
Kyverno 的策略模型围绕三个核心抽象构建:Policy(策略)、Rule(规则)以及 Match/Exclude(匹配/排除)声明。规则内部通过 Mutate(变更)、Validate(验证)、Generate(生成)三大动作实现云原生配置的准入控制与权限变更管理。理解这些基础概念是编写和评审 Kyverno 策略的前提。
2.1 Policy 与 Rule:策略的层级结构
一个 Policy 是 Kyverno 中最高级别的资源对象,它包含一个或多个 Rule。Policy 分为两种类型:
- ClusterPolicy:集群作用域,可匹配任何命名空间或集群范围的资源。
- Policy:命名空间作用域,仅匹配同一命名空间内的资源。
每个 Rule 由三部分组成:
- Match/Exclude:定义规则适用的资源范围。
- 动作声明:Mutate、Validate 或 Generate 之一。
- 动作参数:具体执行逻辑,如补丁、条件表达式或模板。
2.2 Match 与 Exclude:精准控制策略作用域
Match 和 Exclude 使用相同的过滤字段,决定规则是否对特定资源生效。两者支持以下匹配维度:
| 匹配维度 | 描述 | 示例值 |
|---|---|---|
| resources.kind | 资源类型(支持通配符 *) | Pod, Deployment, * |
| resources.name | 资源名称(支持通配符 *) | my-pod, *-app |
| resources.namespaces | 命名空间列表 | [production, staging] |
| resources.annotations | 注解键值对匹配 | security.kyverno.io/scan: enabled |
| resources.selector | 标签选择器(matchLabels / matchExpressions) | app: nginx |
| subjects | 用户、组或 ServiceAccount | User: admin |
| roles / clusterRoles | RBAC 角色绑定 | ClusterRole: admin |
resources.selector 而非 resources.name 进行匹配,标签选择器更灵活且不易因资源重命名而失效。
以下是一个典型的 Match/Exclude 配置片段:
spec:
rules:
- name: require-readiness-probe
match:
resources:
kinds:
- Pod
selector:
matchLabels:
app: web
exclude:
resources:
namespaces:
- kube-system
- kyverno
validate:
# ... 验证逻辑
2.3 三大动作:Mutate、Validate、Generate
Kyverno 的规则动作是策略执行的核心。下表对比了三种动作的用途与行为:
| 动作 | 触发时机 | 主要用途 | 副作用 |
|---|---|---|---|
| Mutate | 资源创建/更新时(准入阶段) | 自动注入 sidecar、添加标签/注解、修改安全上下文 | 直接修改资源定义,用户不可见 |
| Validate | 资源创建/更新时(准入阶段) | 强制安全基线、禁止特权容器、检查镜像来源 | 拒绝不符合规则的请求 |
| Generate | 资源创建后(后台异步) | 自动创建 ConfigMap、Secret、NetworkPolicy 等关联资源 | 创建新资源,不修改原始请求 |
2.3.1 Mutate:自动变更资源
Mutate 动作在资源被持久化到 etcd 之前修改其定义。支持两种模式:
- patchesJson6902:使用 JSON Patch 标准(RFC 6902)进行精确修改。
- overlay:使用 Kyverno 的声明式覆盖语法,更易读。
示例:自动为所有 Pod 添加 app.kubernetes.io/managed-by: kyverno 标签。
mutate:
overlay:
metadata:
labels:
app.kubernetes.io/managed-by: kyverno
2.3.2 Validate:强制合规与拒绝违规
Validate 动作在准入阶段检查资源是否符合规则。支持三种验证方式:
- pattern:声明期望的资源状态,不匹配则拒绝。
- anyPattern:多个模式中满足任意一个即通过。
- deny:基于 CEL(Common Expression Language)或自定义条件拒绝特定配置。
anyPattern 且条件过于宽松,可能导致本应拒绝的高危配置被放行。评审时应重点检查 deny 条件是否覆盖了所有已知风险场景。
示例:拒绝未设置 readOnlyRootFilesystem: true 的容器。
validate:
message: "容器的根文件系统必须设置为只读"
pattern:
spec:
containers:
- securityContext:
readOnlyRootFilesystem: true
2.3.3 Generate:自动创建关联资源
Generate 动作在源资源创建后,自动生成一个或多个目标资源。常用于:
- 为每个 Namespace 自动创建默认的 NetworkPolicy。
- 为每个 Deployment 生成对应的 ServiceMonitor(Prometheus 监控)。
- 为每个 ServiceAccount 生成绑定的 Secret(传统 Kubernetes 场景)。
Generate 支持 synchronize 标志:启用后,Kyverno 会持续同步目标资源,即使被手动修改也会被覆盖回原始模板。
generate:
synchronize: true
kind: NetworkPolicy
name: default-deny-all
namespace: "{{request.object.metadata.name}}"
data:
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
2.4 三大动作与 Match/Exclude 的协作流程
下图展示了 Kyverno 策略引擎处理一个准入请求时的完整决策流程:
2.5 动作组合与执行顺序
当一个 Policy 包含多个 Rule 时,Kyverno 严格按照以下顺序执行:
- 所有 Mutate 规则(按定义顺序)
- 所有 Validate 规则(按定义顺序,一旦拒绝则停止后续处理)
- 所有 Generate 规则(后台异步执行,不影响准入决策)
2.6 概念关系总结
下表总结了 Policy、Rule、Match/Exclude 与三大动作之间的层级关系:
| 层级 | 元素 | 职责 | 示例 |
|---|---|---|---|
| 1 | Policy / ClusterPolicy | 策略容器,定义作用域与规则集合 | require-pod-security |
| 2 | Rule | 单个逻辑单元,包含匹配条件与动作 | check-privileged |
| 3 | Match / Exclude | 过滤条件,决定规则是否生效 | match: kinds: [Pod] |
| 4 | Mutate / Validate / Generate | 具体执行动作,实现配置变更、合规检查或资源生成 | validate.pattern |