4. 策略基础:Kyverno策略结构(match/exclude/mutate/validate/generate)、策略类型概览

Kyverno 策略是 Kubernetes 原生的声明式策略引擎核心。理解策略的结构与类型,是编写、调试和审计合规巡检规则的前提。本章将拆解策略的骨架(match/exclude/mutate/validate/generate),并梳理策略的宏观分类。

4.1 策略的顶层骨架

一个 Kyverno 策略资源(ClusterPolicy 或 Policy)由以下顶层字段构成:

字段 类型 说明
apiVersion string kyverno.io/v1 或 kyverno.io/v2
kind string ClusterPolicy(集群范围)或 Policy(命名空间范围)
metadata ObjectMeta 名称、标签、注解
spec PolicySpec 策略规则主体,包含 rules[] 数组

每个 rule 内部包含五个核心声明块:

  • match —— 必选,定义策略生效的目标资源。
  • exclude —— 可选,从匹配中排除特定资源。
  • mutate —— 可选,在资源创建/更新时修改其字段。
  • validate —— 可选,对资源进行合规性校验。
  • generate —— 可选,根据模板自动创建新资源。
关键认知: 一个规则可以同时包含 mutate、validate 和 generate,但通常建议一个规则只做一件事,以保持策略的可读性和可审计性。

4.2 match 与 exclude:资源选择器

match 和 exclude 使用相同的过滤语法,支持按资源类型、标签选择器、命名空间、名称模式、用户信息等维度筛选。

spec:
  rules:
  - name: "require-labels"
    match:
      any:
      - resources:
          kinds:
          - "Pod"
          - "Deployment"
          selector:
            matchLabels:
              app.kubernetes.io/managed-by: "helm"
    exclude:
      any:
      - resources:
          namespaces:
          - "kube-system"
          - "kyverno"
匹配维度 常用字段 示例
资源类型 kinds ["Pod","Service","Namespace"]
命名空间 namespaces ["production","staging"]
标签选择器 selector.matchLabels tier: frontend
名称模式 names ["*-web","api-*"]
用户/组 subjects kind: User, name: admin
避坑提示: match.any 和 match.all 的区别:any 满足任一条件即匹配;all 需同时满足所有条件。默认使用 any 更灵活,all 用于严格的多维度约束。

4.3 策略动作:mutate / validate / generate

这三个动作块是策略的“执行引擎”,各自承担不同的职责:

动作 触发时机 核心行为 典型场景
mutate 资源创建/更新时 修改资源字段(patch/overlay) 自动注入 sidecar、添加标签、设置资源配额
validate 资源创建/更新时 检查资源是否合规(deny/warn/pass) 禁止特权容器、强制只读根文件系统
generate 资源创建时 根据模板创建新资源 自动创建 NetworkPolicy、ConfigMap、RBAC

4.3.1 mutate 示例:自动注入标签

mutate:
  patchesJson6902: |
    - op: add
      path: "/metadata/labels/audit-version"
      value: "v1.0"

4.3.2 validate 示例:禁止特权容器

validate:
  message: "特权容器不被允许。"
  deny:
    conditions:
      any:
      - key: "{{ request.object.spec.containers[].securityContext.privileged[] }}"
        operator: In
        value:
        - "true"

4.3.3 generate 示例:自动创建 NetworkPolicy

generate:
  synchronize: true
  apiVersion: networking.k8s.io/v1
  kind: NetworkPolicy
  name: "default-deny-{{ request.object.metadata.name }}"
  namespace: "{{ request.object.metadata.namespace }}"
  data:
    spec:
      podSelector: {}
      policyTypes:
      - Ingress
      - Egress

4.4 策略类型概览

Kyverno 策略可以从多个维度进行分类,理解分类有助于快速定位策略用途:

分类维度 类型 说明
作用范围 ClusterPolicy 集群全局生效,不依赖命名空间
Policy 仅在指定命名空间内生效
执行动作 Mutating Policy 包含 mutate 块,修改资源
Validating Policy 包含 validate 块,校验资源
Generating Policy 包含 generate 块,创建资源
触发方式 Admission Controller 在 API 请求时实时拦截(默认)
Background Scan 后台定期扫描已有资源(审计模式)
合规等级 Enforce 强制拒绝不合规资源
Audit 仅记录告警,不阻断请求
巡检视角: 在合规巡检场景中,Audit 模式 + Validating Policy 是最常用的组合。它允许集群继续运行,同时通过 PolicyReport 暴露所有不合规项,便于后续整改。

4.5 策略结构全景图

下图展示了 Kyverno 策略从定义到执行的完整结构关系:

Kyverno 策略结构全景图 Kyverno 策略结构全景图 ClusterPolicy / Policy spec.rules[] 单个 rule 内部结构 match 资源选择器(必选) exclude 排除规则(可选) mutate 修改资源字段 validate 合规校验 generate 自动创建新资源(可选) 策略执行流程 1. 资源请求到达 API Server → Kyverno Webhook 拦截 2. match 筛选目标资源 → exclude 排除例外 3. 按顺序执行:mutate → validate → generate(背景扫描)

4.6 策略类型与巡检场景对照

在集群合规巡检中,不同策略类型对应不同的巡检目标:

巡检场景 推荐策略类型 典型规则
基线安全合规(CIS Benchmark) Validating (Audit) 禁止特权容器、禁止 hostNetwork、限制 seccomp
资源标签标准化 Mutating (Enforce) 自动注入 app.kubernetes.io/name 标签
网络策略覆盖检查 Validating (Audit) 检查每个 Namespace 是否有默认拒绝策略
自动创建默认策略 Generating (Enforce) 新 Namespace 自动生成 NetworkPolicy
镜像来源审计 Validating (Audit) 只允许来自私有仓库的镜像
最佳实践: 在巡检初期,所有 validate 策略应设置为 validationFailureAction: Audit,避免误阻断业务。待规则验证成熟后,再切换为 Enforce。

4.7 策略结构速查表

以下速查表总结了每个核心块的常用子字段,方便编写时快速参考:

块 子字段 用途
match / exclude any / all 逻辑组合条件
resources.kinds 匹配资源类型
resources.selector 标签选择器
mutate patchesJson6902 JSON Patch 操作
overlay 声明式覆盖
patchStrategicMerge 策略合并补丁
validate message 失败提示信息
deny 条件拒绝
pattern 期望的资源模式
generate apiVersion / kind 生成资源的类型
data 资源模板内容
synchronize 是否同步更新已有资源