4. Kyverno 架构解析:组件、策略执行流程与资源变更机制

在 GitOps 架构中,Kyverno 作为 Kubernetes 原生的策略引擎,其内部架构直接决定了策略的实时性、一致性与可观测性。本章深入解析 Kyverno 的核心组件、策略执行流程以及资源变更的拦截与修正机制,帮助你在生产环境中精准调优。

4.1 Kyverno 核心组件

Kyverno 采用微服务架构,主要由三个核心组件构成:Webhook、Controller 和 Cache。它们协同工作,实现对 Kubernetes API 资源的实时策略评估与变更。

组件 职责 关键特性
Webhook 拦截 Kubernetes API 请求(Mutating/Validating) 实时注入、校验;支持 AdmissionReview 请求处理
Controller 管理策略生命周期、后台扫描与报告生成 策略变更监听、后台审计、PolicyReport 聚合
Cache 缓存策略规则、集群资源与中间计算结果 降低 API Server 压力;支持策略预编译与快速匹配
架构要点: Webhook 负责“拦截与即时决策”,Controller 负责“后台持续治理”,Cache 负责“性能加速”。三者缺一不可,共同构成 Kyverno 的策略执行闭环。
Kyverno 核心组件架构 Kubernetes API Server Webhook Mutating / Validating Controller 后台扫描 / 报告生成 Cache 策略 / 资源缓存 AdmissionReview 策略变更事件 资源查询 策略规则查询 缓存更新 组件协作说明 1. Webhook 实时拦截资源创建/更新请求,从 Cache 获取策略规则进行匹配。 2. Controller 监听策略变化,触发后台审计扫描,更新 PolicyReport。 3. Cache 缓存策略预编译结果与集群资源,减少 API Server 直接调用。

4.2 策略执行流程

Kyverno 的策略执行分为 Admission 模式(实时拦截)和 Background 模式(后台扫描)。在 GitOps 场景中,Admission 模式是核心,确保每次资源同步都经过策略校验。

4.2.1 Admission 模式执行流程

  1. 请求拦截: Kubernetes API Server 将资源创建/更新请求封装为 AdmissionReview,发送至 Kyverno Webhook。
  2. 策略匹配: Webhook 从 Cache 中获取匹配的 ClusterPolicy/Policy,按规则顺序进行匹配。
  3. 规则评估: 执行 match、exclude、preconditions 条件判断,确定是否应用该规则。
  4. 动作执行:
    • Mutating: 对资源进行 JSON Patch 修改(如注入 Sidecar、添加标签)。
    • Validating: 校验资源是否符合规范,返回 allow/deny 决策。
  5. 响应返回: 将修改后的资源或校验结果封装为 AdmissionReview 响应,返回给 API Server。
GitOps 调优提示: Admission 模式下的策略执行延迟直接影响 GitOps 同步速度。建议将高频调用的策略规则预编译到 Cache 中,并合理设置 Webhook 超时时间(默认 30s,可根据策略复杂度调整)。

4.2.2 Background 模式执行流程

Controller 组件定期扫描集群中已有资源,生成 PolicyReport 和 ClusterPolicyReport,用于审计与合规检查。该模式不阻塞资源变更,适合事后审计场景。

模式 触发时机 影响范围 典型用途
Admission 资源创建/更新时 当前请求资源 实时策略执行、资源注入
Background 定时扫描 / 策略变更时 集群中所有匹配资源 合规审计、历史资源检查
Kyverno 策略执行流程(Admission 模式) API Server 拦截请求 Webhook 接收 AdmissionReview 策略匹配与条件评估 动作执行 Mutating(JSON Patch) / Validating(Allow/Deny) 返回 AdmissionReview 响应

4.3 资源变更机制

Kyverno 通过 Mutating Webhook 实现资源变更,其核心机制是 JSON Patch 操作。在 GitOps 架构中,资源变更机制需要特别注意幂等性与一致性。

4.3.1 变更类型

  • 覆盖式变更: 直接修改资源字段(如设置 imagePullPolicy: Always)。
  • 追加式变更: 向列表或映射中添加元素(如注入 Sidecar 容器、添加标签)。
  • 条件式变更: 仅在满足特定条件时执行变更(如仅当 namespace 为 production 时注入资源配额)。

4.3.2 变更冲突处理

当多个策略对同一资源字段进行变更时,Kyverno 遵循以下规则:

场景 处理方式 示例
同一字段多次变更 后执行的策略覆盖前一个 策略 A 设置 replicas: 3,策略 B 设置 replicas: 5,最终为 5
列表元素追加冲突 去重合并,保留唯一值 两个策略都注入 envoy Sidecar,最终只注入一个
条件冲突 按策略优先级(background 与 admission 模式区分) Admission 模式策略优先级高于 Background 模式
GitOps 实践警告: 避免在多个策略中对同一关键字段(如 image、command)进行覆盖式变更,否则可能导致 Git 期望状态与运行时状态不一致。建议使用 preconditions 精确控制变更范围。

4.3.3 变更日志与审计

Kyverno 将每次资源变更记录在 PolicyReport 中,包含以下关键信息:

apiVersion: wgpolicyk8s.io/v1alpha2
kind: PolicyReport
metadata:
  name: kyverno-audit-report
  namespace: default
results:
- policy: require-labels
  rule: require-team-label
  resource:
    apiVersion: v1
    kind: Pod
    name: nginx-pod
  message: "validation rule 'require-team-label' passed"
  scored: true
  result: pass
  timestamp:
    nanos: 0
    seconds: 1710000000

通过分析 PolicyReport,可以追踪每次策略变更的触发源、执行结果与时间戳,为 GitOps 回滚与合规审计提供依据。

4.4 本章小结