2. Kyverno 基础回顾:策略引擎架构、ClusterPolicy 与 Policy 的区别

在深入 GitOps 同步窗口调度优化之前,必须重新夯实 Kyverno 的策略引擎基础。Kyverno 并非传统通用策略引擎(如 OPA/Rego),而是专为 Kubernetes 设计的 原生准入控制器,其核心优势在于使用 Kubernetes 资源(Policy / ClusterPolicy)直接定义策略,无需学习专用策略语言。

2.1 策略引擎架构总览

Kyverno 以 Deployment 形式运行在集群内,通过动态 Webhook 拦截资源请求。其架构可抽象为三个核心层:

  • Webhook 层:接收 API Server 的 AdmissionReview 请求(Mutating / Validating)。
  • 策略引擎层:匹配请求资源与已加载的 Policy / ClusterPolicy,执行规则(Rule)中的 match / exclude / validate / mutate / generate 逻辑。
  • 存储与缓存层:策略定义存储在 etcd 中,引擎维护本地缓存以加速匹配。
关键设计理念: Kyverno 不依赖外部策略语言,策略即 Kubernetes 资源。这意味着 GitOps 工具(ArgoCD / Flux)可以直接将策略定义作为清单同步到集群,实现策略即代码(Policy as Code)。
Kyverno 策略引擎架构图 Kyverno 策略引擎架构 Kubernetes API Server Mutating / Validating Webhook 策略引擎(Policy Engine) Match / Exclude / Validate / Mutate / Generate etcd 存储 + 本地缓存 策略定义以 Kubernetes 资源形式存储在 etcd 中,引擎通过 Informer 机制实时同步

2.2 ClusterPolicy 与 Policy 的核心区别

Kyverno 提供两种策略资源:Policy(命名空间级)和 ClusterPolicy(集群级)。两者的差异直接影响 GitOps 同步窗口策略的部署范围与权限模型。

对比维度 Policy ClusterPolicy
作用域 仅作用于指定命名空间 作用于整个集群(所有命名空间)
资源类型 kyverno.io/v1 / Policy kyverno.io/v1 / ClusterPolicy
match 规则 可省略 namespaceSelector,默认匹配策略所在命名空间 必须显式指定 namespaceSelector 或 resourceSelector
典型用途 租户隔离策略、命名空间级安全基线 全局准入规则、集群级合规基线、GitOps 同步窗口调度
RBAC 要求 普通用户可在授权命名空间内创建 需要 cluster-admin 或等效权限
GitOps 同步影响 按命名空间分目录管理,粒度细 集中管理,适合全局策略,但需注意跨团队冲突
实践建议: 对于 GitOps 同步窗口调度这类全局性策略,应优先使用 ClusterPolicy。因为同步窗口通常影响整个集群的部署节奏,且需要跨命名空间一致执行。若仅针对特定命名空间(如开发环境)做窗口限制,则使用 Policy 更合适。

2.3 策略规则(Rule)结构速览

无论是 Policy 还是 ClusterPolicy,其内部规则结构完全一致。一个策略可以包含多个规则,每个规则由以下核心字段组成:

  • match:定义策略生效的资源条件(kind、name、namespaceSelector、labelSelector 等)。
  • exclude:排除特定资源(优先级高于 match)。
  • validate:验证资源是否符合预期(拒绝或允许)。
  • mutate:在资源创建/更新时自动修改字段。
  • generate:基于模板自动创建新资源。

以下是一个典型的 ClusterPolicy 示例,用于在 GitOps 同步窗口外拒绝 Deployment 变更:

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: block-deploy-outside-window
spec:
  validationFailureAction: Enforce
  rules:
  - name: check-sync-window
    match:
      any:
      - resources:
          kinds:
          - Deployment
    validate:
      message: "Deployments are only allowed during sync window (09:00-17:00 UTC)."
      deny:
        conditions:
          any:
          - key: "{{ time.now.hour }}"
            operator: LessThan
            value: 9
          - key: "{{ time.now.hour }}"
            operator: GreaterThanOrEquals
            value: 17
注意: 上述示例使用了 Kyverno 内置的 time.now 上下文变量。在 GitOps 同步窗口场景中,时间判断是核心逻辑,但需注意集群时区设置(建议统一使用 UTC)。此外,validationFailureAction: Enforce 表示直接拒绝,若设为 Audit 则仅记录告警。

2.4 策略匹配优先级与冲突处理

当多个 Policy / ClusterPolicy 同时匹配同一资源时,Kyverno 按以下顺序处理:

  1. 先执行 Mutate 规则(按策略名称字母序)。
  2. 再执行 Validate 规则(按策略名称字母序)。
  3. Generate 规则在资源创建后异步执行。

若多个 Validate 规则产生冲突(一个允许、一个拒绝),则 任何一条规则拒绝都会导致最终拒绝(拒绝优先)。这意味着 GitOps 同步窗口策略必须确保与其他准入策略不产生矛盾,否则可能导致窗口内也无法正常同步。

策略匹配优先级流程 Kyverno 策略匹配优先级(冲突处理) AdmissionReview 请求 Mutate 规则(按名称字母序) Validate 规则(拒绝优先) 任何一条 Validate 规则拒绝 → 最终拒绝;全部通过 → 允许

2.5 本章小结

  • Kyverno 策略引擎通过 Webhook 拦截、策略匹配、规则执行三层架构工作,策略定义本身就是 Kubernetes 资源。
  • ClusterPolicy 作用于整个集群,适合全局性 GitOps 同步窗口调度;Policy 作用于特定命名空间,适合租户级隔离。
  • 策略规则支持 match/exclude/validate/mutate/generate,其中 validate 的 拒绝优先 原则要求同步窗口策略必须与其他准入策略兼容。
  • 内置 time.now 上下文变量是实现时间窗口判断的关键,但需注意集群时区一致性。
下一阶段准备: 在掌握策略引擎基础后,第 3 章将深入 Kyverno 的 上下文变量(Context Variables)与 JMESPath 过滤,这是实现精细化同步窗口调度(如按团队、按环境、按资源类型差异化窗口)的核心能力。