Kyverno 策略引擎基础:架构、策略定义语言与执行流程
Kyverno 是专为 Kubernetes 设计的云原生策略引擎,以 动态准入控制(Dynamic Admission Control) 为核心机制,在资源创建、更新或删除时拦截请求并执行策略校验。本章从架构组件、策略定义语言(PDL)以及匹配与执行流程三个维度展开,为后续 eBPF 配额校准的通信机制奠定策略层基础。
2.1 Kyverno 架构组件
Kyverno 以 Kubernetes 原生方式部署,由以下核心组件构成,各组件通过标准 Kubernetes API 和 Webhook 机制协作。
| 组件 | 角色 | 关键说明 |
|---|---|---|
| Kyverno Admission Controller | 策略执行引擎 | 注册 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration,拦截资源请求 |
| Kyverno Policy Controller | 策略生命周期管理 | 监听 ClusterPolicy / Policy 资源变化,实时更新策略规则缓存 |
| Kyverno Report Controller | 策略审计与报告 | 生成 PolicyReport / ClusterPolicyReport,记录策略评估结果 |
| Kyverno Background Controller | 后台扫描与清理 | 对已有资源执行策略扫描,清理过期报告 |
| Kyverno CLI | 离线测试工具 | 支持 YAML 文件级别的策略预验证,无需真实集群 |
架构要点: Kyverno 不引入自定义 API 服务器,所有策略评估通过标准 AdmissionReview 请求完成,与 Kubernetes 原生准入链完全兼容。
2.2 策略定义语言(PDL)
Kyverno 策略定义语言(PDL)基于 YAML 声明式语法,核心结构包含 match、exclude、preconditions 和 validate/mutate/generate 规则块。PDL 支持两种策略作用域:
- ClusterPolicy:集群级别,可匹配所有命名空间中的资源。
- Policy:命名空间级别,仅作用于指定命名空间。
2.2.1 策略规则结构
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-pod-resource-limits
spec:
validationFailureAction: Enforce # Enforce | Audit
rules:
- name: check-container-resources
match:
any:
- resources:
kinds:
- Pod
validate:
message: "容器必须设置 resource limits"
pattern:
spec:
containers:
- resources:
limits:
memory: "?*" # 必须存在且非空
cpu: "?*"
PDL 设计原则: 策略规则采用“匹配-排除-前置条件-执行”四段式结构,
any 和 all 条件块支持复杂的资源选择逻辑,避免策略规则膨胀。
2.2.2 策略动作类型对比
| 动作类型 | 作用时机 | 典型场景 | 示例 |
|---|---|---|---|
| validate | 资源创建/更新时 | 强制安全基线、合规检查 | 检查容器是否以非 root 用户运行 |
| mutate | 资源创建/更新时(先于 validate) | 自动注入 Sidecar、添加标签 | 为所有 Pod 注入 Istio Sidecar |
| generate | 资源创建后 | 自动创建关联资源 | 为每个 Namespace 创建 NetworkPolicy |
| verifyImages | 镜像拉取时 | 镜像签名验证 | 验证镜像是否由可信仓库签名 |
2.3 策略匹配与执行流程
Kyverno 的策略匹配与执行遵循严格的时序和优先级规则,确保在 Kubernetes 准入链中正确生效。完整流程分为以下阶段:
- Webhook 注册与请求拦截:Kyverno Admission Controller 在启动时向 API Server 注册 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration。当资源请求到达 API Server 时,根据 webhook 规则匹配后转发 AdmissionReview 请求。
- 策略规则匹配:Admission Controller 根据请求资源的
kind、apiVersion、namespace、labels等字段,与所有已加载的 ClusterPolicy/Policy 中的match块进行匹配。匹配顺序为:先匹配any条件,再匹配all条件。 - 排除与前置条件检查:通过匹配的资源进一步检查
exclude块(排除特定资源)和preconditions块(基于上下文变量的条件判断)。只有全部通过才进入执行阶段。 - 策略动作执行:按 mutate → validate → generate 的顺序执行。Mutate 规则先修改资源,Validate 规则校验修改后的资源,Generate 规则在资源创建完成后异步触发。
- 响应返回与审计:Admission Controller 将评估结果(允许/拒绝/补丁)封装为 AdmissionReview 响应返回 API Server。同时,Report Controller 异步生成 PolicyReport 记录。
2.4 策略执行上下文与变量
Kyverno PDL 支持丰富的上下文变量,用于在策略规则中引用请求信息、集群状态或外部数据。常用变量分类如下:
| 变量类别 | 前缀 | 示例 | 说明 |
|---|---|---|---|
| 请求对象 | request.object |
{{ request.object.metadata.name }} |
当前被评估资源的完整对象 |
| 旧对象 | request.oldObject |
{{ request.oldObject.spec.replicas }} |
更新操作前的资源状态(仅 Update 请求) |
| 集群信息 | cluster |
{{ cluster.name }} |
集群名称、版本等元数据 |
| 外部数据 | configMap |
{{ configMap "namespace" "name" .data.key }} |
从 ConfigMap 中动态读取数据 |
| JMESPath 表达式 | 内置函数 | {{ request.object.spec.containers[].name }} |
支持数组遍历、条件过滤等复杂查询 |
变量使用注意事项: 在
preconditions 块中使用变量时,必须确保变量在请求上下文中存在,否则策略评估会失败。建议对可能缺失的字段使用 contains 或 has 函数进行前置检查。
2.5 策略冲突与优先级
当多个策略规则作用于同一资源时,Kyverno 遵循以下优先级和冲突解决机制:
- Mutate 规则顺序:按策略创建时间升序执行,后创建的策略补丁叠加在先创建的补丁之上。可通过
spec.rules[].mutate.patches.jsonPatch的op: replace覆盖已有字段。 - Validate 规则冲突:只要任一 Validate 规则拒绝请求,整个准入请求即被拒绝。不存在“覆盖”或“优先级”概念。
- Generate 规则去重:Generate 规则在创建资源前会检查目标资源是否已存在,避免重复创建。
- 策略作用域优先级:命名空间级别的 Policy 优先于集群级别的 ClusterPolicy 匹配同一资源。当两者冲突时,Policy 生效。
与 eBPF 配额校准的关联: 在后续章节中,我们将利用 Kyverno 的 Mutate 规则自动注入 eBPF 配额校准 Sidecar,并通过 Validate 规则校验配额参数是否在安全范围内。策略执行上下文中的
request.object 变量将用于提取 Pod 的 resource limits 信息,作为 eBPF 程序配置的输入。