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 核心概念关系图
下图展示了策略、规则、匹配、排除和背景之间的层级关系与执行流程:
3.5 缓存命中巡检中的概念映射
将上述核心概念映射到我们的缓存命中巡检场景中,可以更直观地理解每个概念的实际用途:
| 核心概念 | 缓存巡检场景中的具体含义 | 配置示例(YAML 片段) |
|---|---|---|
| 策略 | 定义一组巡检规则,例如检查所有 ConfigMap 和 Secret 的缓存状态 | |
| 规则 | 具体定义如何检查缓存命中状态,例如检查 cache-hash 注解是否与当前内容一致 |
|
| 匹配 | 选择所有包含 cache-hash 注解的 ConfigMap |
|
| 排除 | 跳过 kube-system 和 kube-public 命名空间中的资源 |
|
| 背景 | 设置为 true,确保集群中所有已存在的 ConfigMap 都被扫描 |
|
3.6 匹配与排除的优先级逻辑
理解匹配与排除的优先级逻辑对于编写正确的策略至关重要。下图展示了 Kyverno 在评估规则时的决策流程:
决策逻辑总结: 资源变更 → 检查匹配条件 → 不匹配则跳过 → 匹配则继续检查排除条件 → 满足排除条件则跳过 → 不满足排除条件则执行规则动作 → 输出结果。排除条件的优先级高于匹配条件。
3.7 背景模式对巡检策略的影响
背景模式(Background)直接影响巡检策略的覆盖范围。下表对比了两种模式在缓存命中巡检场景中的差异:
| 对比维度 | background: true | background: false |
|---|---|---|
| 存量资源扫描 | 策略创建时立即扫描所有已存在的 ConfigMap 和 Secret | 不扫描存量资源,仅对新创建或更新的资源生效 |
| 巡检覆盖率 | 100% 覆盖集群中所有相关资源 | 仅覆盖策略创建后变更的资源 |
| 适用场景 | 首次部署巡检策略、定期全量巡检 | 仅关注新变更的缓存状态 |
| 性能影响 | 初始扫描可能对 API Server 产生压力 | 无初始扫描压力 |
| 巡检策略推荐 | 强烈推荐,确保不遗漏任何缓存不一致的资源 | 不推荐用于巡检场景,可能遗漏存量问题 |
最佳实践: 在缓存命中巡检策略中,始终将
background: true 与 generate 或 validate 动作结合使用。这样既能发现存量资源的缓存问题,也能实时监控新变更的缓存状态。如果担心初始扫描性能,可以在策略中添加更精确的匹配条件(例如只匹配特定标签的 ConfigMap),缩小扫描范围。