2. Kyverno 基础:Kyverno 是什么?核心概念
2.1 Kyverno 是什么?
Kyverno 是一个为 Kubernetes 设计的云原生策略引擎。它允许平台团队和安全团队将策略定义为 Kubernetes 资源(CRD),无需编写 Webhook 或学习复杂的准入控制器语言。Kyverno 通过动态准入 Webhook 拦截对 Kubernetes API 的请求,并根据定义的策略进行验证、变更或生成资源。
关键特性: 原生 Kubernetes 资源、无需新语言、支持验证/变更/生成、策略即代码、GitOps 友好。
与 OPA/Gatekeeper 使用 Rego 不同,Kyverno 策略使用 YAML 编写,学习曲线更低,特别适合与 CI/CD 流水线集成,实现“回滚护栏”等自动化安全门禁。
2.2 核心概念总览
Kyverno 的策略模型由以下核心概念构成,它们共同定义了“策略如何匹配资源、执行何种操作”。
| 概念 | 说明 | 作用阶段 |
|---|---|---|
| Policy / ClusterPolicy | 策略的顶层容器,定义一组规则。Policy 作用于命名空间,ClusterPolicy 作用于集群全局。 | 定义时 |
| Rule | 策略内的具体规则单元,包含 Match、Mutate/Validate/Generate 等子字段。 | 定义时 |
| Match | 定义规则匹配哪些资源(按 kind、label、namespace、name 等)。 | 准入拦截时 |
| Mutate | 对匹配的资源进行修改(patch/overlay),常用于注入 sidecar、添加标签。 | Mutating Webhook |
| Validate | 对匹配的资源进行校验,返回 pass/fail,拒绝不符合策略的请求。 | Validating Webhook |
| Generate | 基于匹配的资源自动生成新的资源(如为每个 Namespace 创建 NetworkPolicy)。 | 后台控制器 |
提示: 在“回滚护栏”场景中,Validate 用于拒绝不安全的回滚(如跳过审批),Mutate 用于自动注入回滚审计标签,Generate 用于自动创建回滚快照策略。
2.3 Policy 与 ClusterPolicy
Policy 是 Kyverno 的顶层资源。两者的区别在于作用域:
- Policy(命名空间级): 只能匹配和作用于同一命名空间内的资源。
- ClusterPolicy(集群级): 可以匹配所有命名空间或特定命名空间的资源,常用于全局安全基线。
在回滚护栏场景中,通常使用 ClusterPolicy 来确保所有命名空间的回滚操作都受到统一策略约束。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: rollback-safety-gate
spec:
rules:
- name: require-rollback-approval
match:
resources:
kinds:
- Deployment
validate:
message: "回滚操作必须包含 'rollback-approved: true' 标签"
pattern:
metadata:
labels:
rollback-approved: "true"
2.4 Rule 与 Match:精准定位目标资源
每个 Rule 包含一个 Match 声明,用于定义该规则生效的资源范围。Match 支持多种匹配条件:
| 匹配字段 | 示例 | 说明 |
|---|---|---|
| kinds | [Deployment, StatefulSet] |
按资源类型匹配 |
| names | [app-prod, app-staging] |
按资源名称精确匹配 |
| namespaces | [production, staging] |
按命名空间匹配 |
| selector | matchLabels: { app: myapp } |
按标签选择器匹配 |
| any / all | any: [{ kinds: [Pod] }, { kinds: [Deployment] }] |
逻辑或/与组合条件 |
注意: Match 条件写得太宽泛可能导致策略意外影响大量资源。建议在回滚护栏策略中,结合
namespaces 和 selector 精确锁定目标工作负载。
2.5 Mutate:自动注入与修复
Mutate 规则在资源创建或更新时自动修改资源内容。Kyverno 支持两种变更方式:
- patchesJson6902: 使用 JSON Patch 操作(add/remove/replace)。
- overlay: 使用 YAML 覆盖层,将定义的字段合并到目标资源中。
在回滚场景中,Mutate 可用于自动注入回滚审计标签或 sidecar 代理:
rules:
- name: inject-rollback-audit-label
match:
resources:
kinds:
- Deployment
mutate:
overlay:
metadata:
labels:
rollback-audit-enabled: "true"
last-rollback-time: "{{ time.now() }}"
2.6 Validate:安全门禁的核心
Validate 是 Kyverno 最常用的能力,用于在资源进入集群前进行校验。校验模式包括:
| 模式 | 说明 | 回滚护栏应用 |
|---|---|---|
| pattern | 定义期望的资源字段值,不匹配则拒绝 | 强制要求回滚审批标签 |
| anyPattern | 满足任意一个模式即通过 | 允许多种回滚审批方式 |
| deny | 定义拒绝条件,满足条件则拒绝 | 禁止回滚到低于某个版本的镜像 |
| podSecurity | 内置 Pod Security Standards 校验 | 确保回滚后的 Pod 仍符合安全基线 |
rules:
- name: deny-rollback-to-old-image
match:
resources:
kinds:
- Deployment
validate:
message: "禁止回滚到镜像标签为 'latest' 或 'old-*' 的版本"
deny:
conditions:
any:
- key: "{{ request.object.spec.template.spec.containers[0].image }}"
operator: Equals
value: "nginx:latest"
- key: "{{ request.object.spec.template.spec.containers[0].image }}"
operator: Pattern
value: "old-*"
2.7 Generate:自动创建关联资源
Generate 规则在匹配资源创建时,自动生成另一个 Kubernetes 资源。生成方式有两种:
- data: 直接定义要生成的资源内容。
- clone: 从指定命名空间克隆一个已有资源。
在回滚护栏中,Generate 可用于自动创建回滚快照或备份 ConfigMap:
rules:
- name: generate-rollback-snapshot
match:
resources:
kinds:
- Deployment
namespaces:
- production
generate:
kind: ConfigMap
name: "rollback-snapshot-{{ request.object.metadata.name }}"
namespace: "{{ request.object.metadata.namespace }}"
synchronize: true
data:
spec: "{{ request.object.spec }}"
最佳实践: 在回滚护栏流水线中,Validate 作为第一道门禁拒绝非法回滚,Mutate 自动注入审计标签,Generate 创建备份资源。三者组合形成完整的“回滚安全三角”。
2.8 核心概念关系图
下图展示了 Policy、Rule、Match、Mutate、Validate、Generate 之间的逻辑关系与执行顺序:
2.9 本章小结
- Kyverno 是 Kubernetes 原生的策略引擎,使用 YAML 定义策略,无需学习新语言。
- Policy / ClusterPolicy 是策略顶层容器,决定作用范围。
- Rule + Match 精准定位目标资源,支持多种匹配条件。
- Mutate、Validate、Generate 分别对应变更、校验、生成三种操作,是回滚护栏的核心构建块。
- 在流水线集成中,Validate 作为门禁拒绝非法回滚,Mutate 自动注入审计信息,Generate 创建备份资源,三者协同实现自动化安全管控。