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 的策略执行闭环。
4.2 策略执行流程
Kyverno 的策略执行分为 Admission 模式(实时拦截)和 Background 模式(后台扫描)。在 GitOps 场景中,Admission 模式是核心,确保每次资源同步都经过策略校验。
4.2.1 Admission 模式执行流程
- 请求拦截: Kubernetes API Server 将资源创建/更新请求封装为 AdmissionReview,发送至 Kyverno Webhook。
- 策略匹配: Webhook 从 Cache 中获取匹配的 ClusterPolicy/Policy,按规则顺序进行匹配。
- 规则评估: 执行
match、exclude、preconditions条件判断,确定是否应用该规则。 - 动作执行:
- Mutating: 对资源进行 JSON Patch 修改(如注入 Sidecar、添加标签)。
- Validating: 校验资源是否符合规范,返回 allow/deny 决策。
- 响应返回: 将修改后的资源或校验结果封装为 AdmissionReview 响应,返回给 API Server。
GitOps 调优提示: Admission 模式下的策略执行延迟直接影响 GitOps 同步速度。建议将高频调用的策略规则预编译到 Cache 中,并合理设置 Webhook 超时时间(默认 30s,可根据策略复杂度调整)。
4.2.2 Background 模式执行流程
Controller 组件定期扫描集群中已有资源,生成 PolicyReport 和 ClusterPolicyReport,用于审计与合规检查。该模式不阻塞资源变更,适合事后审计场景。
| 模式 | 触发时机 | 影响范围 | 典型用途 |
|---|---|---|---|
| Admission | 资源创建/更新时 | 当前请求资源 | 实时策略执行、资源注入 |
| Background | 定时扫描 / 策略变更时 | 集群中所有匹配资源 | 合规审计、历史资源检查 |
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 回滚与合规审计提供依据。