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:
      # 验证逻辑...
匹配与排除的筛选流程 准入请求 阶段1:匹配(Match) 按 kinds / labels / namespaces 筛选 阶段2:排除(Exclude) 移除特定命名空间 / 标签 / 用户 最终匹配资源集

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 策略引擎中的完整协作关系:

Kyverno 核心概念协作关系 策略(Policy / ClusterPolicy) 规则(Rule) 匹配(Match) 排除(Exclude) 变异(Mutate) 修改资源字段 验证(Validate) 检查合规性 生成(Generate) 创建关联资源 准入控制 / 后台扫描执行 一条规则必须包含 Match,并至少选择 Mutate / Validate / Generate 中的一个操作 Exclude 为可选,用于从 Match 结果中进一步过滤

2.7 概念对比速查表

概念 是否必须 执行时机 对资源的影响 典型用途
Match 是 规则评估前 无 定义规则的作用目标
Exclude 否 匹配之后 无 从匹配集中移除特定资源
Mutate 至少选一 准入阶段 修改资源字段 注入 Sidecar、添加标签、设置默认值
Validate 至少选一 准入阶段 / 后台扫描 拒绝或告警 强制安全基线、禁止高危配置
Generate 至少选一 源资源创建后 创建新资源 自动创建 NetworkPolicy、Quota
迁移提示: 从 OPA Gatekeeper 迁移到 Kyverno 时,注意 Gatekeeper 的 deny 和 mutate 逻辑在 Kyverno 中分别对应 validate.deny 和 mutate。但 Kyverno 的 generate 能力在 Gatekeeper 中没有直接等价物,需要借助外部工具或 Operator 实现。