Kyverno 基础回顾:架构、策略引擎与原生 NetworkPolicy 的关系

在深入 IDP 拓扑中的故障排查之前,必须先厘清 Kyverno 的核心设计。Kyverno 并非简单的策略引擎,而是一个运行在 Kubernetes 内部的 动态准入控制器,它利用 Kubernetes 原生的 Webhook 机制拦截资源请求,并通过声明式策略进行校验、变更或生成。

2.1 Kyverno 架构核心组件

Kyverno 采用无外部依赖的轻量架构,所有组件均以 Pod 形式运行在集群内。其核心组件包括:

组件 角色 关键说明
Kyverno Admission Controller 策略执行核心 接收 API Server 的 Mutating 和 Validating Webhook 请求,执行策略逻辑。
Kyverno Cleanup Controller 资源清理 根据 CleanupPolicy 定期删除过期或不符合要求的资源。
Kyverno Reports Controller 策略报告 生成 ClusterPolicyReport 和 PolicyReport,记录策略执行结果。
Kyverno Background Controller 后台扫描 对已有资源进行周期性扫描,发现违反策略的存量资源。
架构要点: Kyverno 不依赖 etcd 之外的额外存储,所有策略和配置都存储在 Kubernetes 原生的 CRD 中。这意味着 Kyverno 的故障排查往往从检查 CRD 状态和 Webhook 配置开始。
Kyverno 核心架构组件关系 Kubernetes API Server Kyverno Admission Controller 策略引擎 (Engine) Cleanup Controller Reports Controller Background Controller 所有控制器共享同一个策略存储(CRD),通过 Webhook 或后台扫描执行策略

2.2 策略引擎工作原理

Kyverno 的策略引擎遵循 匹配-条件-动作 的三段式处理流程。当 API Server 发送准入请求时,引擎按以下顺序执行:

  1. 匹配阶段: 检查资源是否匹配策略中定义的 match 规则(资源类型、标签、命名空间等)。
  2. 条件阶段: 如果匹配,则评估 preconditions 和 context 中的条件表达式(支持 JMESPath 和 CEL)。
  3. 动作阶段: 根据策略类型执行对应动作:
    • Validate: 拒绝不符合规则的请求。
    • Mutate: 自动修改资源字段(如注入 Sidecar、添加标签)。
    • Generate: 创建关联资源(如为每个 Namespace 自动生成 NetworkPolicy)。
故障排查提示: 当策略未生效时,优先检查 match 规则是否覆盖了目标资源。Kyverno 的 match 支持 any 和 all 逻辑,误用 any 可能导致策略意外跳过。

2.3 与原生 NetworkPolicy 的关系

理解 Kyverno 与原生 NetworkPolicy 的关系,是排查 IDP 网络策略故障的基础。两者并非替代关系,而是 策略定义层与策略执行层 的协作关系。

维度 原生 NetworkPolicy Kyverno 网络策略
本质 Kubernetes 网络隔离原语 策略生成器 / 策略校验器
执行者 CNI 插件(Calico、Cilium 等) Kyverno Admission Controller
作用时机 运行时数据平面 资源创建/更新时的控制平面
典型用途 定义 Pod 间流量规则 自动生成 NetworkPolicy、校验策略合规性
故障排查入口 kubectl describe networkpolicy kubectl describe policy + kyverno logs

在 IDP 拓扑中,Kyverno 通常扮演以下角色:

  • NetworkPolicy 生成器: 通过 generate 策略,为每个新创建的 Namespace 自动生成默认的隔离策略(如拒绝所有入站流量)。
  • NetworkPolicy 校验器: 通过 validate 策略,确保开发者提交的 NetworkPolicy 符合安全基线(如禁止开放全 0.0.0.0/0 的入口规则)。
  • NetworkPolicy 变更器: 通过 mutate 策略,自动为 NetworkPolicy 添加审计标签或强制补充特定规则。
Kyverno 与原生 NetworkPolicy 协作流程 开发者提交 YAML API Server Kyverno 策略引擎 拒绝请求 (Validate) 生成/变更 NetworkPolicy CNI 插件执行 Kyverno 在控制平面完成策略生成/校验,CNI 在数据平面执行网络隔离
常见误区: Kyverno 生成的 NetworkPolicy 与手动创建的 NetworkPolicy 在 CNI 层面完全等价。如果发现生成的策略未生效,不要只排查 Kyverno,还要检查 CNI 插件是否支持该策略类型(如 Cilium 的 Egress 规则可能需要额外配置)。

2.4 策略执行的关键路径

在 IDP 拓扑中,网络策略的故障往往发生在以下关键路径上:

  • Webhook 配置路径: Kyverno 的 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration 是否正确指向 Kyverno Service?证书是否过期?
  • 策略匹配路径: 策略的 match 规则是否覆盖了目标 Namespace 或 Pod 的标签?exclude 规则是否意外排除了目标?
  • 生成策略路径: generate 策略是否设置了 synchronize: true?如果手动删除了生成的 NetworkPolicy,Kyverno 是否会重新创建?
  • 后台扫描路径: 对于存量资源,Background Controller 是否已扫描并生成报告?kubectl get policyreport 可以快速查看。
快速诊断命令:
kubectl describe validatingwebhookconfiguration kyverno-resource-validating-webhook-cfg
kubectl get policyreport -n <namespace> -o yaml
kubectl logs -n kyverno -l app.kubernetes.io/name=kyverno --tail=50