无需学习新语言,YAML 即可定义策略,CNCF 孵化项目 Kyverno 凭什么这么火?# 🔥 深度解读 Kyverno:Kubernetes 原生的策略引擎,安全合规的终极利器
摘要:Kyverno 是一个 Kubernetes 原生的策略引擎,作为 CNCF 孵化项目,它允许用户使用 YAML 定义策略而无需学习新语言。本文全面解析 Kyverno 的核心能力,包括验证、变更、生成、清理和镜像验证五大策略类型;深入剖析其多组件架构(Admission Controller、Background Controller、Cleanup Controller、Reports Controller);对比其与 OPA/Gatekeeper 的差异化优势;展示其强大的供应链安全特性(Cosign/Notary/Sigstore 集成);介绍丰富的生态系统工具(Kyverno CLI、Policy Reporter、Chainsaw 等);分析其工程实践与安全标准(SLSA Level 3、SBOM 等);列举平台工程、安全、DevOps/SRE、合规等团队的实战应用场景;并提供快速上手指南。Kyverno 以其简洁的 YAML 策略定义、全面的功能覆盖和强大的社区生态,为 Kubernetes 集群治理提供了零学习成本的一站式解决方案。
无需学习新语言,YAML 即可定义策略,CNCF 孵化项目 Kyverno 凭什么这么火?
一、背景:K8s 策略管理的痛点
在最近的集群治理过程中,就发现有些权限没有完全收回,业务配置的很多pod中还是有没有配置健康检查,资源request;还有就是在openclaw agent火爆情况下,会生成很多pod(带有特权),这里既要在agent所在pod中增加权限配置(也可以用kyverno实现,agent自身所在服务创建时候必须要有rbac绑定,权限还不能过大),然后再agent自己创建pod时候同时走到兜底的kyverno中,不允许创建特权容器,减少安全风险。
所以只管相关就是在没法完全拦住入口的情况下,增加一些webhook,但写了后发现不同场景限制不一样,不可能一直加代码,后发发现了kyverno项目,解放了。
在 Kubernetes 集群运维中,我们经常面临这样的问题:
- 安全合规:哪些镜像可以运行?容器是否以 root 运行?是否需要特定的 label?
- 成本控制:有没有人创建了没有资源限制的 Pod?Namespace 是否缺少成本标签?
- 运维规范:所有 Deployment 都必须有 readiness probe,Ingress 必须配置 TLS。
- 治理要求:某些资源只能由特定团队创建,某些命名空间禁止运行特权容器。
传统方案要么靠人工审核(效率低),要么用OPA/Gatekeeper(需要学 Rego 语言,有学习成本)。
而Kyverno给出了一个更优雅的答案。
二、什么是 Kyverno?
Kyverno(希腊语 κυβερνάω,意为“治理/管理”)是一个Kubernetes 原生的策略引擎,由Nirmata公司创建并捐赠给CNCF,目前是CNCF 孵化项目。
它的核心理念是:
无需学习新语言,用 YAML 定义策略,直接在 Kubernetes 中执行。
Kyverno 能做什么?
| 能力 | 说明 |
|---|---|
| ✅验证 (Validate) | 检查资源是否符合规范,不符合则拒绝 |
| ✏️变更 (Mutate) | 自动修改资源,注入 sidecar、添加 label |
| 🚀生成 (Generate) | 基于某个资源自动创建其他资源 |
| 🧹清理 (Cleanup) | 定时清理过期或不符合规范的资源 |
| 🔐镜像验证 | 验证容器镜像签名,保障供应链安全 |
| 🔍后台扫描 | 对已有资源进行周期性策略扫描 |
三、架构解析:不止是一个 Admission Controller
Kyverno 的架构由多个微服务组件组成,每个组件各司其职:
┌─────────────────────────────────────────────────────┐ │ Kubernetes API Server │ └──────┬──────────────┬───────────┬──────────┬─────────┘ │ │ │ │ ▼ ▼ ▼ ▼ ┌──────────┐ ┌────────────┐ ┌────────┐ ┌──────────┐ │ Admission │ │ Background │ │ Cleanup│ │ Reports │ │Controller │ │ Controller │ │Control │ │Controller │ ├──────────┤ ├────────────┤ ├────────┤ ├──────────┤ │ 实时拦截 │ │ 后台生成/ │ │ 定时清理 │ │ 生成策略 │ │ 验证+变更 │ │ 变更已有资源│ │ 资源 │ │ 合规报告 │ └──────────┘ └────────────┘ └────────┘ └──────────┘1️⃣ Admission Controller(核心组件)
这是 Kyverno 的大脑。它注册到 Kubernetes 的MutatingWebhookConfiguration和ValidatingWebhookConfiguration,在资源创建/更新时实时拦截。
- 变更阶段:先执行 mutate 策略,修改资源
- 验证阶段:再执行 validate 策略,决定接受还是拒绝
2️⃣ Background Controller
对于已有资源,Kyverno 会进行后台扫描,检查它们是否违反策略。它还负责:
- Generate 策略:当源资源创建时,自动生成目标资源
- 对已有的资源执行 mutate 现有(mutate existing)策略
3️⃣ Cleanup Controller
定时清理策略的执行者。可以设置 Cron 表达式,定期删除符合条件的资源(如过期 Namespace、未使用的 PVC)。
4️⃣ Reports Controller
生成详细的策略合规报告,以ClusterPolicyReport和PolicyReport的 CRD 形式存在,可以对接外部工具(如 Policy Reporter)进行可视化。
5️⃣ Init Container(kyvernopre)
在 Kyverno 启动前,负责对集群中已有资源进行初始化清理和策略应用,确保集群一开始就处于合规状态。
四、Policy 的核心类型
Kyverno 的策略定义非常简洁,全部用 YAML 编写。
1. Validate 策略:拒绝不符合规范的资源
apiVersion:kyverno.io/v1kind:ClusterPolicymetadata:name:require-labelsspec:validationFailureAction:Enforcerules:-name:check-required-labelsmatch:any:-resources:kinds:-Podvalidate:message:"必须包含标签 'app.kubernetes.io/managed-by'"pattern:metadata:labels:app.kubernetes.io/managed-by:"?*"只需定义:
- match:匹配哪些资源
- validate:验证条件
- validationFailureAction:
Enforce(强制拒绝)或Audit(仅记录告警)
2. Mutate 策略:自动注入 Sidecar
apiVersion:kyverno.io/v1kind:ClusterPolicymetadata:name:add-sidecarspec:rules:-name:inject-istio-sidecarmatch:any:-resources:kinds:-Podmutate:patchesJson6902:|- op: add path: /spec/containers/- value: name: istio-proxy image: istio/proxyv2:latest3. Generate 策略:自动创建资源
apiVersion:kyverno.io/v1kind:ClusterPolicymetadata:name:generate-networkpolicyspec:rules:-name:default-denymatch:any:-resources:kinds:-Namespacegenerate:apiVersion:networking.k8s.io/v1kind:NetworkPolicyname:default-denynamespace:"{{request.object.metadata.name}}"data:spec:podSelector:{}policyTypes:-Ingress-Egress4. Cleanup 策略:定时清理过期资源
apiVersion:kyverno.io/v2kind:ClusterCleanupPolicymetadata:name:cleanup-old-jobsspec:match:any:-resources:kinds:-Jobconditions:all:-key:"{{ target.spec.ttlSecondsAfterFinished }}"operator:GreaterThanOrEqualsvalue:86400schedule:"0 0 * * *"5. Image Verification 策略:供应链安全
apiVersion:kyverno.io/v1kind:ClusterPolicymetadata:name:verify-imagespec:rules:-name:verify-cosign-signaturematch:any:-resources:kinds:-PodverifyImages:-image:"ghcr.io/myorg/*"attestors:-entries:-keys:publicKeys:|------BEGIN PUBLIC KEY-----...五、核心能力深度解读
🔥 与 OPA/Gatekeeper 对比:Kyverno 的差异化优势
| 对比维度 | Kyverno | OPA/Gatekeeper |
|---|---|---|
| 策略语言 | YAML(无需学习) | Rego(需要学习新语言) |
| 变更资源 | ✅ 原生支持 mutate | ❌ 不支持,需额外工具 |
| 生成资源 | ✅ 原生支持 generate | ❌ 不支持 |
| 清理资源 | ✅ 原生支持 cleanup | ❌ 不支持 |
| 镜像验证 | ✅ 内置 Cosign/Notary | ❌ 需额外集成 |
| 后台扫描 | ✅ 已有资源也检查 | ❌ 仅拦截新资源 |
| 学习成本 | 低 | 高 |
| 策略模板 | 丰富的内置库 | 社区积累 |
🔐 供应链安全:不只是策略引擎
Kyverno 内置了强大的镜像签名验证能力:
- Cosign集成:验证容器镜像的 Cosign 签名
- Notary集成:支持 Notation 签名验证
- Sigstore集成:支持 Keyless 签名和无密钥验证
- SBOM:所有 Kyverno 镜像都附带 CycloneDX SBOM
- SLSA:达到 SLSA Level 3 的供应链安全标准
🌐 生态系统
Kyverno 拥有丰富的配套工具:
| 工具 | 用途 |
|---|---|
| Kyverno CLI | 本地测试策略,无需集群 |
| Policy Reporter | 策略违规可视化 UI |
| Chainsaw | E2E 测试工具 |
| Kyverno JSON | 非 K8s JSON 的策略评估 |
| Policy Library | 数百个现成策略模板 |
六、社区与工程实力
从项目的源码和工程实践可以看到 Kyverno 团队的工程化水平:
📊 项目数据
| 指标 | 数据 |
|---|---|
| GitHub Stars | ⭐ 高星项目 |
| CNCF 状态 | ✅Incubating 孵化项目 |
| Go 版本 | Go 1.26 |
| K8s 兼容 | v0.35.x |
| 许可证 | Apache 2.0 |
| SLSA | Level 3 |
| OpenSSF Scorecard | ✅ 合规 |
🛡️ 安全工程实践
Kyverno 在安全性上下了真功夫:
- SAST:golangci-lint + gosec
- SCA:Dependabot 依赖扫描
- 容器扫描:Trivy
- 容器签名:Cosign
- SBOM:CycloneDX 格式 SBOM
- SLSA 生成器:构建来源验证
- 威胁模型:已建立并文档化
- 安全邮件:kyverno-security@googlegroups.com
🌟 最近的版本亮点(v1.18+)
- CEL 策略评估支持
- Global Context 入口(跨集群数据)
- Prometheus 指标增强
- 改进的 CLI 离线测试能力
- 策略报告性能优化
七、实战场景:哪些团队应该用 Kyverno?
👨💼 平台工程团队
- 制定统一的集群治理规范
- 自动注入 Sidecar、配置
- 资源配额和成本标签强制
🔒 安全团队
- 只允许签名镜像运行
- 禁止特权容器
- 强制 Pod 安全标准(PSA)
- 合规审计报告
🚀 DevOps/SRE 团队
- 自动生成 NetworkPolicy
- 清理过期资源
- 强制 deployment 健康检查配置
📋 合规团队
- 定期扫描集群合规状态
- 生成合规报告
- 对接审计系统
八、快速上手
安装 Kyverno
# 使用 Helmhelm repoaddkyverno https://kyverno.github.io/kyverno/ helm repo update helminstallkyverno kyverno/kyverno-nkyverno --create-namespace安装 CLI
# macOSbrewinstallkyverno# 或直接下载二进制curl-LOhttps://github.com/kyverno/kyverno/releases/latest/download/kyverno-cli_{os}_{arch}.tar.gz本地测试策略
# 用 CLI 测试策略效果,无需集群kyverno apply policy.yaml--resourcepod.yaml九、总结
Kyverno 的魅力在于它的简洁和强大:
- 零学习成本:用 YAML 写策略,K8s 用户直接上手
- 原生化设计:基于 Admission Webhook,深度集成 K8s
- 全能选手:验证 + 变更 + 生成 + 清理 + 镜像验证,一站式搞定
- CNCF 背书:孵化项目,社区活跃,生态丰富
- 供应链安全:内置 Cosign/Notary/Sigstore,DevSecOps 利器
如果你正在为 Kubernetes 集群的策略管理发愁,或者还在纠结要不要学 Rego,不妨试试 Kyverno —— 你会发现,原来策略管理可以如此简单。
🔗相关链接
- 官网:https://kyverno.io
- GitHub:https://github.com/kyverno/kyverno
- 策略库:https://kyverno.io/policies/
- Slack:https://slack.k8s.io/#kyverno
本文基于 Kyverno v1.18+ 源码解读撰写,如需深入技术细节,欢迎关注后续系列文章。
细节,欢迎关注后续系列文章。*