2. Kyverno 核心概念:策略、规则、匹配、排除、变异、验证、生成
Kyverno 的策略引擎围绕一组清晰的核心概念构建。理解这些概念是编写、调试和迁移策略的基础。本章将逐一拆解 策略(Policy)、规则(Rule)、匹配(Match)、排除(Exclude)、变异(Mutate)、验证(Validate) 和 生成(Generate) 七个核心要素,并展示它们之间的协作关系。
核心认知: Kyverno 的策略本质上是“声明式规则集”。你不需要编写 Webhook 代码,只需用 YAML 描述“在什么条件下,对哪些资源做什么操作”。这七个概念构成了完整的策略生命周期。
2.1 策略(Policy)与规则(Rule)
策略是 Kyverno 的最高级资源对象,它包含一个或多个规则。策略分为两种类型:
- ClusterPolicy:集群作用域,可匹配任何命名空间或集群级别的资源。
- Policy:命名空间作用域,仅匹配同一命名空间内的资源。
每个策略下的规则是独立的执行单元。一条规则必须包含一个 match 声明,并至少包含一个操作(mutate、validate 或 generate)。
| 概念 | 作用域 | 包含关系 | 示例 |
|---|---|---|---|
| ClusterPolicy | 集群 | 可包含多条规则 | 要求所有命名空间中的 Pod 必须设置资源限制 |
| Policy | 命名空间 | 可包含多条规则 | 仅对 production 命名空间中的 Deployment 添加标签 |
| Rule | 策略内 | 必须包含 match + 至少一个操作 | 匹配带有 app=web 标签的 Pod,验证其镜像来源 |
# 一个典型的 ClusterPolicy 结构示例
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-pod-limits
spec:
rules:
- name: check-limits
match:
any:
- resources:
kinds:
- Pod
validate:
message: "Pod 必须设置 CPU 和内存限制。"
pattern:
spec:
containers:
- resources:
limits:
memory: "?*"
cpu: "?*"
2.2 匹配(Match)与排除(Exclude)
匹配定义了规则生效的目标资源集合。排除则从匹配集合中移除特定资源。两者共同决定了规则的“作用域”。
匹配和排除支持以下筛选维度:
- 资源类型(kinds):如 Pod、Deployment、Namespace。
- 标签选择器(selector):基于标签的匹配与排除。
- 命名空间(namespaces):仅适用于命名空间作用域的资源。
- 名称(name):精确匹配或通配符匹配资源名称。
- 用户信息(subjects):基于发起请求的 Kubernetes 用户、组或 ServiceAccount。
匹配逻辑演进: Kyverno 1.7+ 引入了
any 和 all 匹配块。在 any 块中,满足任一条件即匹配;在 all 块中,必须满足所有条件。排除块同样支持此逻辑。
# 匹配与排除的典型用法
rules:
- name: exclude-kube-system
match:
any:
- resources:
kinds:
- Pod
exclude:
any:
- resources:
namespaces:
- kube-system
- kube-public
validate:
# 验证逻辑...
2.3 变异(Mutate)
变异在资源被持久化到 etcd 之前,对资源进行修改。这是 Kyverno 最强大的能力之一,常用于注入 Sidecar、添加标签、设置默认值或修补安全上下文。
变异支持两种模式:
- overlay(覆盖):使用 YAML 覆盖层直接修改资源字段。如果目标字段不存在则创建,存在则覆盖。
- patchStrategicMerge / patchJSON6902:使用 JSON 补丁或策略合并补丁进行更精细的修改。
# 使用 overlay 模式为所有 Pod 注入 sidecar 代理
rules:
- name: inject-sidecar
match:
any:
- resources:
kinds:
- Pod
mutate:
overlay:
spec:
containers:
- name: sidecar-proxy
image: proxy:latest
ports:
- containerPort: 8080
变异顺序注意: 当多个策略对同一资源进行变异时,Kyverno 按照策略的
background 和 failurePolicy 属性决定执行顺序。建议在关键变异策略中显式设置 mutateExistingOnPolicyUpdate: true 以处理存量资源。
2.4 验证(Validate)
验证是策略引擎的核心安全功能。它检查资源是否符合预定义规则,不符合时可以选择拒绝请求或仅生成告警。
验证模式包括:
| 验证模式 | 描述 | 适用场景 |
|---|---|---|
| pattern | 定义期望的资源字段值,支持通配符 * 和 ?* |
强制要求资源必须包含特定字段或值 |
| anyPattern | 提供多个可选 pattern,满足任一即通过 | 允许多种合规配置(如允许两种镜像仓库) |
| deny | 定义禁止的条件,满足条件则拒绝 | 黑名单场景(如禁止使用 latest 标签) |
| podSecurity | 基于 Pod Security Standards 的内置验证 | 快速实施 Pod 安全基线/限制级别 |
# 使用 deny 模式禁止 latest 镜像标签
rules:
- name: deny-latest-tag
match:
any:
- resources:
kinds:
- Pod
validate:
message: "禁止使用 latest 镜像标签。"
deny:
conditions:
any:
- key: "{{ request.object.spec.containers[].image }}"
operator: AnyIn
value:
- ":latest"
2.5 生成(Generate)
生成允许 Kyverno 在创建源资源时,自动创建关联资源。这是实现“策略即代码”自动化的关键能力,常用于:
- 为每个 Namespace 自动创建 NetworkPolicy。
- 为特定标签的 Pod 自动生成对应的 Service。
- 为每个团队 Namespace 创建 ResourceQuota 和 LimitRange。
生成规则支持 synchronize 属性:启用后,Kyverno 会持续同步生成的资源,确保源资源更新时生成资源也随之更新。
# 为每个新 Namespace 自动生成默认的 NetworkPolicy
rules:
- name: generate-default-networkpolicy
match:
any:
- resources:
kinds:
- Namespace
generate:
kind: NetworkPolicy
name: default-deny-all
namespace: "{{ request.object.metadata.name }}"
synchronize: true
data:
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
2.6 核心概念关系总览
下图展示了七个核心概念在 Kyverno 策略引擎中的完整协作关系:
2.7 概念对比速查表
| 概念 | 是否必须 | 执行时机 | 对资源的影响 | 典型用途 |
|---|---|---|---|---|
| Match | 是 | 规则评估前 | 无 | 定义规则的作用目标 |
| Exclude | 否 | 匹配之后 | 无 | 从匹配集中移除特定资源 |
| Mutate | 至少选一 | 准入阶段 | 修改资源字段 | 注入 Sidecar、添加标签、设置默认值 |
| Validate | 至少选一 | 准入阶段 / 后台扫描 | 拒绝或告警 | 强制安全基线、禁止高危配置 |
| Generate | 至少选一 | 源资源创建后 | 创建新资源 | 自动创建 NetworkPolicy、Quota |
迁移提示: 从 OPA Gatekeeper 迁移到 Kyverno 时,注意 Gatekeeper 的
deny 和 mutate 逻辑在 Kyverno 中分别对应 validate.deny 和 mutate。但 Kyverno 的 generate 能力在 Gatekeeper 中没有直接等价物,需要借助外部工具或 Operator 实现。