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 由三部分组成:

  1. Match/Exclude:定义规则适用的资源范围。
  2. 动作声明:Mutate、Validate 或 Generate 之一。
  3. 动作参数:具体执行逻辑,如补丁、条件表达式或模板。
关键原则:一个 Rule 只能包含一个动作类型。如果需要同时执行变更和验证,必须拆分为两个独立的 Rule。

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 动作在准入阶段检查资源是否符合规则。支持三种验证方式:

  1. pattern:声明期望的资源状态,不匹配则拒绝。
  2. anyPattern:多个模式中满足任意一个即通过。
  3. deny:基于 CEL(Common Expression Language)或自定义条件拒绝特定配置。
权限变更风险提示:Validate 规则如果错误地使用了 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 策略引擎处理一个准入请求时的完整决策流程:

Kyverno 策略引擎决策流程 准入请求 Match 匹配:资源类型/标签/命名空间 不匹配则跳过该 Rule Exclude 排除:命名空间/用户/角色 匹配则跳过该 Rule 动作分发:Mutate / Validate / Generate Mutate 修改资源定义 Validate 检查合规/拒绝 Generate 创建关联资源 准入决策(通过/拒绝)

2.5 动作组合与执行顺序

当一个 Policy 包含多个 Rule 时,Kyverno 严格按照以下顺序执行:

  1. 所有 Mutate 规则(按定义顺序)
  2. 所有 Validate 规则(按定义顺序,一旦拒绝则停止后续处理)
  3. 所有 Generate 规则(后台异步执行,不影响准入决策)
安全评审要点:Mutate 规则先于 Validate 规则执行。这意味着一个 Mutate 规则可以“修复”一个本会被 Validate 拒绝的配置。例如,Mutate 自动添加只读根文件系统,后续 Validate 检查通过。这种组合在权限变更场景中需特别关注——确保 Mutate 不会意外引入安全漏洞。

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