Kyverno 策略类型总览
Kyverno 的策略主要分为五类:“校验”、“变更”、“生成”、“删除”、“镜像验证”。它们分别解决 Kubernetes 资源准入控制、配置自动修正、资源自动创建、资源生命周期管理以及容器镜像供应链安全问题 [1]。
| 策略类型 | 作用 | apiVersion | 状态 | 应用场景 |
|---|---|---|---|---|
| ValidatingPolicy | 校验资源配置是否符合要求,决定允许、拒绝或审计 | policies.kyverno.io/v1 | Stable( v1.18) | 禁止特权容器、限制镜像仓库、要求资源配额 |
| MutatingPolicy | 自动修改资源字段,使资源满足平台规范 | policies.kyverno.io/v1 | Stable( v1.18) | 自动添加 Label、设置默认安全上下文、补充资源限制 |
| GeneratingPolicy | 根据触发条件自动创建、同步或克隆其他资源 | policies.kyverno.io/v1 | Stable( v1.18) | 新建 Namespace 时自动生成 NetworkPolicy、ResourceQuota |
| DeletingPolicy | 按条件和调度规则自动删除资源 | policies.kyverno.io/v1 | Stable( v1.18) | 清理过期 Job、临时 Pod、测试资源 |
| ImageValidatingPolicy | 验证容器镜像的签名、证明材料和可信来源 | policies.kyverno.io/v1 | Stable( v1.18) | Cosign 签名验证、SBOM、构建来源证明 |
| ClusterPolicy | 旧版API,统一策略,支持 validate; mutate; generate; verifyImages 规则 | kyverno.io/v1 | 1.19 弃用,v1.20 移除 | 旧版API |
| CleanupPolicy | 旧版API,资源定时清理策略 | kyverno.io/v2 | 1.19 弃用,v1.20 移除 | 旧版API |
CEL 策略详解
ValidatingPolicy
ValidatingPolicy 是 Kubernetes 官方 API “ValidatingAdmissionPolicy” 的超集,增加了 Kyverno 专有字段
核心功能:判断 Kubernetes 资源是否满足安全、合规、配置规范,并根据验证动作拒绝或审计。
常见用途包括:
- 禁止
privileged: true;HostNetwork;HostPID 等高风险配置。 - 限制镜像来源,只允许企业 Harbor 仓库。
- 要求 Pod 配置 CPU/Memory Requests 和 Limits。
- 根据 Namespace 或 CMDB 的团队归属信息校验 Label。
- 要求生产环境 Deployment 至少运行两个副本。
实例:生产环境禁止特权容器
这里的 “all()” 要求所有普通容器都满足条件,“Deny” 表示违规时拒绝请求。
示例中仅检查 containers (”object.spec.containers“)
| |
MutatingPolicy
“MutatingPolicy” 也是 Kubernetes “MutatingAdmissionPolicy” 的超集;
功能: 在创建或更新资源时自动修改配置,也能在适当的策略机制下处理已有资源。例如
- 自动添加
team;owner等 Label。 - 根据 Namespace 设置环境标签。
- 自动配置默认安全上下文。
- 设置 NodeSelector、Tolerations 等调度配置。
- 从 CMDB 获取负责人、运维团队、开发团队信息并写入 Pod。
ApplyConfiguration和 JSONPatch两种变更方式。前者适合声明式字段合并,后者适合精确路径操作。实例:自动添加固定标签
新建 Pod 时自动添加 “managed_by=platform” 和 “env=production”。
| |
实例:添加动态标签
使用 GlobalContextEntry 获取 HTTP 数据
| |
MutatingPolicy 根据 CMDB 自动添加 Label
| |
GeneratingPolicy
用 CEL 创建 Kubernetes 资源
主要功能:根据触发资源的属性和策略条件,自动创建、克隆或管理目标资源。
实例:新建 Namespace 时克隆镜像拉取 Secret
| |
与 MutatingPolicy 的对比:
- MutatingPolicy 修改匹配资源本身;
- GeneratingPolicy 为一个 Namespace 的创建而生成多个不同类型的资源。
核心概念:Trigger; Source; Downstream [2]
- Trigger:谁触发策略
- Source:从哪里复制资源
- Downstream:最终生成什么
| |
Data Source
在 GeneratingPolicy 中定义 Kubernetes 资源,通过 CEL 自动生成,不需要从已有资源克隆。如:创建 Namespace 时,自动创建一个名为 text 的 ConfigMap。
| |
示例: 在名称空间内创建默认 “deny” 的 NetworkPolicy
| |
YAML 模板
直接编写 YAML,通过 CEL 动态填充字段,无需使用 dyn() 构造复杂对象。
示例:创建 ns 时自动生成 NetworkPolicy 和 ConfigMap
| |
资源克隆 - Clone
从已有 Kubernetes 资源复制出新资源,例如将 “kube-system” 的 Secret 复制到新 Namespace。
| |
循环批量生成 - Loop
使用 CEL 循环,在多个 NS 中生成资源,而不需要为每个 NS 创建独立策略。
示例:在创建 ConfigMap 时读取 Namespace 列表,向指定 Namespace 复制 Secret。
| |
还可以使用 使用 filter() 排除 Namespace
| |
资源同步 - Synchronization
让 Kyverno 持续检查 Downstream 是否符合期望状态,如果不一致,就自动修复。
示例
| |
存量资源生成 - Generating for Existing
创建策略时,对已经存在的 Trigger 资源执行一次生成逻辑。、
示例中策略将 default/regcred 克隆到 “已有” 及 “未来” 新建的 Namespace
| |
策略作用域 - Policy Scope
“Policy Scope” 提供策略是集群范围还是 namespace 范围
示例,只对 “prod” 中创建的 Pod 触发策略,并生成一个默认 ConfigMap。
| |
DeletingPolicy
使用 cron schedule 自动删除符合条件的资源,对应旧的 CleanupPolicy (v1.19 为 Stable)。与 admission 策略不同,它定时运行、评估集群里已有资源,条件满足即删除。
使用示例:每天 1 点清理测试 Namespace 里带 old=true 标签的 Pod
用途:清理已完成的 Job 等孤儿资源、移除过期 Secret 或 ConfigMap、给关键资源设置有时限的租约。
| |
ImageValidatingPolicy
ImageValidatingPolicy 用于校验容器镜像签名与 attestation
4个核心概念
| 术语 | 作用 |
|---|---|
| Image | 被验证的目标,如 nginx:1.31 |
| Signature | 证明镜像由指定密钥或身份签署,且签名绑定的内容未被篡改 |
| Attestor | 定义信任哪个公钥、证书或身份 |
| Attestation | 描述镜像构建来源、SBOM、安全扫描等信息 |
示例1 只允许使用指定公钥签名的镜像
什么时候执行?:matchConstraints
检查哪些镜像?:matchImageReferences
信任谁?:attestors.company
验证那些镜像?:verifyImageSignatures
| |
示例2: 只允许 GitHub Actions 构建并签名的镜像
示例中不使用固定公钥,而是通过无密钥文件签名验证签名者身份。假设只信任 GitHub 仓库 user/repo 中配置的工作流
| |
Reference
[1] policy overview
[2] Core Concepts