4. 迁移适配总览:从 Gatekeeper 到 Kyverno 的映射关系、策略类型对应表、迁移决策树、常见迁移陷阱
从 OPA Gatekeeper 迁移到 Kyverno 并非简单的语法替换,而是策略引擎范式的转变。Gatekeeper 依赖 Rego 查询语言和 AdmissionReview 原语,而 Kyverno 采用声明式 YAML 匹配规则与内置上下文变量。本章提供完整的映射关系、策略类型对应表、迁移决策树以及常见陷阱,帮助团队在迁移过程中避免重复造轮子。
4.1 核心概念映射关系
下表列出 Gatekeeper 与 Kyverno 在架构、资源模型、约束定义、异常处理等维度的直接对应关系:
| 维度 | Gatekeeper (OPA) | Kyverno | 说明 |
|---|---|---|---|
| 策略定义 | ConstraintTemplate (Rego) |
ClusterPolicy / Policy (YAML) |
Kyverno 无需编写 Rego,使用声明式规则 |
| 约束实例 | Constraint (CRD 实例) |
ClusterPolicy 中的 rules 数组 |
Kyverno 将约束实例合并到策略规则中 |
| 匹配资源 | match 块 + labelSelector |
match / exclude 块 |
Kyverno 支持更丰富的匹配条件(名称、命名空间、注解) |
| 变更逻辑 | Rego mutate (需自定义) |
mutate 规则(patchStrategicMerge / patchesJson6902) |
Kyverno 原生支持资源变更,无需额外编码 |
| 验证逻辑 | Rego violation 块 |
validate 规则(pattern / deny / anyPattern) |
Kyverno 提供模式匹配、条件拒绝、任意模式三种验证方式 |
| 生成资源 | 不原生支持 | generate 规则 |
Kyverno 可自动生成 ConfigMap、Secret、RBAC 等资源 |
| 异常豁免 | excludedNamespaces + labelSelector |
exclude 块 + preconditions |
Kyverno 支持基于资源上下文的条件豁免 |
| 审计模式 | --audit-interval + Constraint 状态 |
background: true + validationFailureAction: Audit |
Kyverno 审计结果写入 PolicyReport CRD |
关键差异: Gatekeeper 的约束实例与模板分离,适合多团队复用同一模板但不同参数;Kyverno 将模板与实例合并为单一 ClusterPolicy,更简洁但参数化需通过变量注入实现。
4.2 策略类型对应表
根据实际生产环境中的常见策略场景,将 Gatekeeper 策略类型映射到 Kyverno 规则类型:
| 策略场景 | Gatekeeper 实现方式 | Kyverno 规则类型 | 迁移难度 |
|---|---|---|---|
| 禁止特权容器 | Rego violation[{"msg": ...}] |
validate.pattern |
低 |
| 强制资源限制 | Rego violation + input.review.object.spec.containers |
validate.pattern 或 validate.deny |
低 |
| 镜像仓库白名单 | Rego violation + sprintf 匹配 |
validate.deny.conditions |
中 |
| 自动注入 Sidecar | Rego mutate + Patch |
mutate.patchStrategicMerge |
中 |
| 强制标签 | Rego violation + object.metadata.labels |
validate.pattern 或 validate.deny |
低 |
| 禁止 HostNetwork | Rego violation + input.review.object.spec.hostNetwork |
validate.pattern |
低 |
| 命名空间配额生成 | 不原生支持(需外部控制器) | generate |
高(新功能) |
| Pod 安全标准 (PSS) | Rego 自定义模板或 k8spsp 库 |
validate.podSecurity (内置) |
低(内置支持) |
迁移建议: 对于 Pod 安全标准类策略,优先使用 Kyverno 内置的
validate.podSecurity 规则,无需手动编写 Rego 或 YAML 模式。
4.3 迁移决策树
以下决策树帮助团队快速判断每条 Gatekeeper 策略的迁移路径:
4.4 常见迁移陷阱
根据多个生产环境迁移案例,以下陷阱最容易导致策略失效或集群异常:
陷阱 1:Rego 中的
Gatekeeper 中
any / all 语义误用Gatekeeper 中
any(container, ...) 表示“至少一个容器满足条件”,而 Kyverno 的 anyPattern 表示“任意一个模式匹配即通过”。迁移时需反转逻辑:将 Rego 的否定条件转换为 Kyverno 的 deny.conditions。
陷阱 2:忽略
Kyverno 在
preconditions 导致空指针异常Kyverno 在
validate.deny 中访问嵌套字段(如 spec.containers[].securityContext)时,如果 Pod 未定义该字段,会直接报错。必须添加 preconditions 检查字段存在性。
正确做法示例:
preconditions:
all:
- key: "{{ request.object.spec.containers[] }}"
operator: NotEquals
value: ""
validate:
deny:
conditions:
any:
- key: "{{ request.object.spec.containers[].securityContext.privileged }}"
operator: Equals
value: true
陷阱 3:Gatekeeper 的
Gatekeeper 使用
input.review 与 Kyverno 的 request 变量差异Gatekeeper 使用
input.review.object 访问资源,Kyverno 使用 request.object。此外,Kyverno 的 request.operation 返回小写字符串(如 create),而 Gatekeeper 返回大写(如 CREATE)。
陷阱 4:变更规则顺序与冲突
Kyverno 按
Kyverno 按
spec.rules 顺序执行 mutate,后执行的规则可能覆盖先执行的变更。迁移时需将 Gatekeeper 的多个 mutate 操作合并为单个 patchStrategicMerge 或使用 patchesJson6902 精确控制顺序。
陷阱 5:审计模式下的资源状态不一致
设置
设置
validationFailureAction: Audit 后,Kyverno 仅标记违规但不拒绝。如果 Gatekeeper 原策略是强制拒绝(enforcementAction: deny),迁移初期建议先设为 Audit 观察一周,确认无误后再切换为 Enforce。
4.5 迁移适配检查清单
以下清单用于每条策略迁移后的核验:
| 检查项 | 验证方法 | 通过标准 |
|---|---|---|
| 语法正确性 | kubectl apply -f policy.yaml |
无报错,策略状态为 Ready |
| 匹配范围一致 | 创建测试资源,检查是否被策略命中 | 与 Gatekeeper 原策略命中结果一致 |
| 拒绝/变更行为 | 创建违规资源,观察是否被拒绝或变更 | 拒绝消息或变更内容与原策略一致 |
| 异常豁免生效 | 创建带豁免标签/注解的资源 | 策略跳过该资源 |
| 审计报告生成 | 检查 PolicyReport 或 ClusterPolicyReport | 违规资源被正确记录 |
| 性能影响 | 监控 APIServer 延迟和 Kyverno 内存 | P99 延迟增加 < 50ms,内存 < 500Mi |