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 策略从定义到执行的完整结构关系:
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 |
是否同步更新已有资源 |