3. Kyverno 核心概念:策略(Policy)、规则(Rule)、匹配(Match)、排除(Exclude)、背景(Background)

在开发配置缓存命中巡检策略之前,必须透彻理解 Kyverno 的五大核心概念。这些概念构成了策略引擎的骨架,决定了策略如何被定义、触发、筛选和执行。下面逐一拆解,并辅以结构图与对比表格,帮助你建立清晰的认知模型。

3.1 策略(Policy)与规则(Rule)

策略(Policy) 是 Kyverno 中最高级别的资源对象,它包含一组 规则(Rule)。一个策略可以包含一条或多条规则,每条规则独立定义匹配条件、排除条件和处理动作。策略分为两种类型:

  • ClusterPolicy:集群级别,作用于整个集群的所有命名空间。
  • Policy:命名空间级别,仅作用于指定命名空间。

规则(Rule) 是策略的执行单元。每条规则必须包含:

  • 匹配(Match):定义哪些资源需要被处理。
  • 排除(Exclude):定义哪些资源需要被跳过(可选)。
  • 动作(Validate / Mutate / Generate / VerifyImages):定义对匹配资源执行的操作。
关键理解: 策略是规则的容器,规则是策略的原子执行单元。在缓存命中巡检场景中,我们通常使用一条规则来检查 ConfigMap 的缓存状态,另一条规则来检查 Secret 的缓存状态,它们可以放在同一个策略中。

3.2 匹配(Match)与排除(Exclude)

匹配(Match) 定义了规则生效的目标资源。你可以通过以下维度进行匹配:

  • 资源类型:如 Pod、ConfigMap、Secret、Deployment 等。
  • 资源名称:支持精确匹配和通配符。
  • 标签选择器:基于 Kubernetes 标签进行选择。
  • 命名空间选择器:基于命名空间标签进行选择。
  • 注解:基于资源注解进行匹配。

排除(Exclude) 用于从匹配结果中移除特定资源。排除条件的语法与匹配完全一致,但语义相反。排除优先级高于匹配——即使资源满足匹配条件,只要它满足任意一条排除条件,规则就不会对其生效。

维度 匹配(Match) 排除(Exclude)
作用 定义规则生效的目标范围 从目标范围中移除特定资源
优先级 先评估 后评估,优先级高于匹配
语法结构 与排除完全一致 与匹配完全一致
典型用途 选择所有 ConfigMap 排除系统命名空间中的 ConfigMap
缓存巡检场景 匹配所有包含 cache-hash 注解的 ConfigMap 排除 kube-system 命名空间中的资源
巡检策略设计建议: 在缓存命中巡检策略中,匹配条件应聚焦于包含缓存相关注解或标签的资源;排除条件则用于过滤掉不需要巡检的命名空间(如系统命名空间)或特定资源(如只读 ConfigMap)。

3.3 背景(Background)

背景(Background) 是 Kyverno 中一个容易被忽视但至关重要的概念。它决定了策略是否对 集群中已有的存量资源 生效,而不仅仅是新创建或更新的资源。

  • background: true(默认值):策略会扫描集群中所有已存在的资源,对满足匹配条件的资源执行规则。
  • background: false:策略仅对 新创建 或 更新 的资源生效,忽略存量资源。

在缓存命中巡检场景中,必须将 background 设置为 true,因为我们需要检查集群中所有已存在的 ConfigMap 和 Secret 的缓存状态,而不仅仅是新创建的。

性能注意: 当 background 为 true 时,Kyverno 会在策略创建或更新时对集群中所有匹配的资源进行一次全量扫描。如果集群规模较大(例如超过 10,000 个资源),建议在策略中增加更精确的匹配条件,避免全量扫描造成控制平面压力。

3.4 核心概念关系图

下图展示了策略、规则、匹配、排除和背景之间的层级关系与执行流程:

Kyverno 核心概念关系与执行流程 策略(Policy) 规则(Rule) 匹配(Match) 排除(Exclude) 背景(Background) 执行动作(Validate / Mutate / Generate) 策略执行结果(Pass / Fail / Skip) 执行流程说明 策略包含规则 → 规则定义匹配条件与排除条件 → 背景决定是否扫描存量资源 → 满足条件的资源执行动作 → 输出执行结果

3.5 缓存命中巡检中的概念映射

将上述核心概念映射到我们的缓存命中巡检场景中,可以更直观地理解每个概念的实际用途:

核心概念 缓存巡检场景中的具体含义 配置示例(YAML 片段)
策略 定义一组巡检规则,例如检查所有 ConfigMap 和 Secret 的缓存状态
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: cache-hit-inspection
规则 具体定义如何检查缓存命中状态,例如检查 cache-hash 注解是否与当前内容一致
spec:
  rules:
  - name: check-configmap-cache
匹配 选择所有包含 cache-hash 注解的 ConfigMap
match:
  resources:
    kinds:
    - ConfigMap
    annotations:
      cache-hash: "*"
排除 跳过 kube-system 和 kube-public 命名空间中的资源
exclude:
  resources:
    namespaces:
    - kube-system
    - kube-public
背景 设置为 true,确保集群中所有已存在的 ConfigMap 都被扫描
spec:
  background: true

3.6 匹配与排除的优先级逻辑

理解匹配与排除的优先级逻辑对于编写正确的策略至关重要。下图展示了 Kyverno 在评估规则时的决策流程:

匹配与排除优先级决策流程 资源变更事件 是否满足匹配条件? 跳过(Skip) 否 是 是否满足排除条件? 跳过(Skip) 是 否 执行规则动作 输出 Pass / Fail
决策逻辑总结: 资源变更 → 检查匹配条件 → 不匹配则跳过 → 匹配则继续检查排除条件 → 满足排除条件则跳过 → 不满足排除条件则执行规则动作 → 输出结果。排除条件的优先级高于匹配条件。

3.7 背景模式对巡检策略的影响

背景模式(Background)直接影响巡检策略的覆盖范围。下表对比了两种模式在缓存命中巡检场景中的差异:

对比维度 background: true background: false
存量资源扫描 策略创建时立即扫描所有已存在的 ConfigMap 和 Secret 不扫描存量资源,仅对新创建或更新的资源生效
巡检覆盖率 100% 覆盖集群中所有相关资源 仅覆盖策略创建后变更的资源
适用场景 首次部署巡检策略、定期全量巡检 仅关注新变更的缓存状态
性能影响 初始扫描可能对 API Server 产生压力 无初始扫描压力
巡检策略推荐 强烈推荐,确保不遗漏任何缓存不一致的资源 不推荐用于巡检场景,可能遗漏存量问题
最佳实践: 在缓存命中巡检策略中,始终将 background: true 与 generate 或 validate 动作结合使用。这样既能发现存量资源的缓存问题,也能实时监控新变更的缓存状态。如果担心初始扫描性能,可以在策略中添加更精确的匹配条件(例如只匹配特定标签的 ConfigMap),缩小扫描范围。