Kyverno策略管理实战:云原生安全运行基线自动化核验 - 第2节
2.1 Kyverno 的起源与发展
Kyverno 由 Nirmata 公司于 2019 年发起,并于 2020 年正式开源。其名称源自希腊语“κυβερνάω”(kybernáo),意为“掌舵”或“治理”,直接反映了项目的核心使命——为 Kubernetes 集群提供声明式的策略治理能力。2021 年,Kyverno 成为 CNCF(云原生计算基金会)的沙箱项目,并在 2022 年晋升为孵化项目,社区贡献者与生产部署案例快速增长。
与早期策略引擎不同,Kyverno 的设计哲学是“Kubernetes 原生”:
- 无专用策略语言:策略使用 Kubernetes 资源(CustomResourceDefinition, CRD)定义,无需学习 OPA 的 Rego 或 Gatekeeper 的模板语言。
- 动态准入控制:通过 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration 拦截资源请求,实现变更与验证。
- 资源状态审计:支持对集群中已有资源进行后台扫描,生成策略违规报告,无需重新提交请求。
2.2 与 OPA/Gatekeeper 的对比
OPA(Open Policy Agent)与 Gatekeeper 是 Kubernetes 生态中另一套主流的策略引擎组合。OPA 提供通用策略引擎,Gatekeeper 则是 OPA 在 Kubernetes 上的集成层。两者与 Kyverno 在架构、语言、运维复杂度上存在显著差异。下表从多个维度进行对比:
| 对比维度 | Kyverno | OPA + Gatekeeper |
|---|---|---|
| 策略定义语言 | YAML(Kubernetes CRD) | Rego(声明式查询语言) |
| 学习曲线 | 低(熟悉 K8s YAML 即可上手) | 中高(需学习 Rego 语法与逻辑) |
| 策略类型 | 验证(Validate)、变更(Mutate)、生成(Generate) | 验证为主,变更需额外开发 |
| 资源审计 | 内置背景扫描与报告 | 需额外部署审计组件 |
| 策略复用 | 通过 ClusterPolicy/Policy 与规则组合 | 通过 ConstraintTemplate 与 Constraint |
| 社区生态 | CNCF 孵化,策略市场(Policy Library)丰富 | CNCF 毕业,企业级生态成熟 |
| 适用场景 | Kubernetes 原生策略、安全基线、合规自动化 | 通用策略引擎、跨平台策略、复杂逻辑 |
2.3 策略引擎架构
Kyverno 的策略引擎以 Kubernetes 控制器模式运行,核心组件包括 Webhook Server、Controller Manager 和 Report Manager。下图展示了请求处理与审计扫描的完整流程:
架构中的三个核心组件职责如下:
- Webhook Server:接收 API Server 的准入请求,根据匹配的策略规则执行变更(Mutate)或验证(Validate)操作,返回准入响应。
- Controller Manager:负责策略的同步、缓存与状态管理,驱动生成规则(Generate)和后台扫描任务。
- Report Manager:收集策略执行结果,生成标准化的 PolicyReport 资源,支持集群范围的合规可视化。
2.4 策略(Policy)与规则(Rule)的概念
Kyverno 的策略模型围绕 Policy 和 Rule 两个核心抽象构建。理解两者的关系是编写策略的基础。
2.4.1 策略(Policy)
策略是最高级别的资源对象,定义了一组规则的集合及其作用范围。Kyverno 提供两种策略类型:
- Policy:命名空间级别的策略,仅对指定命名空间内的资源生效。
- ClusterPolicy:集群级别的策略,对所有命名空间或通过资源选择器匹配的资源生效。
一个策略对象包含以下关键字段:
| 字段 | 说明 | 示例值 |
|---|---|---|
spec.rules |
规则列表,定义具体的匹配与执行逻辑 | — |
spec.validationFailureAction |
验证失败时的行为:enforce(拒绝)或 audit(仅报告) |
audit |
spec.background |
是否启用后台扫描(默认 true) |
true |
spec.schemaValidation |
是否对策略本身进行 schema 校验 | true |
2.4.2 规则(Rule)
规则是策略的执行单元,每个规则包含三个核心部分:
- 匹配条件(Match):定义规则适用的资源类型、标签、命名空间等。支持
any和all逻辑组合。 - 排除条件(Exclude):定义规则不适用的情况,优先级高于匹配条件。
- 执行动作(Mutate / Validate / Generate):定义对匹配资源的具体操作。
以下是一个完整的 ClusterPolicy 示例,展示策略与规则的组合:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-labels
spec:
validationFailureAction: enforce
background: true
rules:
- name: check-app-label
match:
any:
- resources:
kinds:
- Pod
- Deployment
validate:
message: "标签 'app' 是必需的"
pattern:
metadata:
labels:
app: "?*"
- name: check-team-label
match:
any:
- resources:
kinds:
- Namespace
validate:
message: "命名空间必须包含 'team' 标签"
pattern:
metadata:
labels:
team: "?*"
上述策略包含两条规则:第一条要求所有 Pod 和 Deployment 必须包含 app 标签;第二条要求所有命名空间必须包含 team 标签。两条规则独立匹配,互不影响。